diff --git a/.gemini/settings.json b/.gemini/settings.json new file mode 100644 index 00000000000..9b81c269ff7 --- /dev/null +++ b/.gemini/settings.json @@ -0,0 +1,13 @@ +{ + "mcpServers": { + "nx-mcp": { + "type": "stdio", + "command": "npx", + "args": [ + "nx", + "mcp" + ] + } + }, + "contextFileName": "AGENTS.md" +} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 74a59443023..802c08fdfe8 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -36,11 +36,11 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v4 + uses: actions/checkout@v6 # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v3 + uses: github/codeql-action/init@v4 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -51,7 +51,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v3 + uses: github/codeql-action/autobuild@v4 # â„šī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -65,4 +65,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v3 \ No newline at end of file + uses: github/codeql-action/analyze@v4 \ No newline at end of file diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 04a213dcb62..589447bb4d4 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -15,18 +15,18 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event_name != 'pull_request' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 name: Checkout [main] with: fetch-depth: 0 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: - node-version: '22' - - uses: pnpm/action-setup@v4.1.0 + node-version: '24' + - uses: pnpm/action-setup@v4.2.0 name: Install pnpm id: pnpm-install with: - version: 8 + version: 10 run_install: false - name: Get pnpm version id: pnpm-version @@ -38,7 +38,7 @@ jobs: run: | echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" - - uses: actions/cache@v4 + - uses: actions/cache@v5 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} diff --git a/.github/workflows/lock.yml b/.github/workflows/lock.yml index a9d5c1ddb33..29bd4b33cb1 100644 --- a/.github/workflows/lock.yml +++ b/.github/workflows/lock.yml @@ -16,7 +16,7 @@ jobs: action: runs-on: ubuntu-latest steps: - - uses: dessant/lock-threads@v5 + - uses: dessant/lock-threads@v6 with: issue-inactive-days: '30' issue-lock-reason: 'resolved' diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 449cc61eddc..7499865c9ad 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -25,16 +25,16 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event_name != 'pull_request' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 name: Checkout [main] with: fetch-depth: 0 #- name: Derive appropriate SHAs for base and head for `nx affected` commands # uses: nrwl/nx-set-shas@v3 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: - node-version: '22' - - uses: pnpm/action-setup@v4.1.0 + node-version: '24' + - uses: pnpm/action-setup@v4.2.0 name: Install pnpm id: pnpm-install with: @@ -49,7 +49,7 @@ jobs: run: | echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" - - uses: actions/cache@v4 + - uses: actions/cache@v5 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} @@ -80,17 +80,17 @@ jobs: runs-on: ubuntu-latest if: ${{ github.event_name == 'pull_request' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 with: ref: ${{ github.event.pull_request.head.ref }} repository: ${{ github.event.pull_request.head.repo.full_name }} fetch-depth: 0 #- name: Derive appropriate SHAs for base and head for `nx affected` commands # uses: nrwl/nx-set-shas@v3 - - uses: actions/setup-node@v4 + - uses: actions/setup-node@v6 with: - node-version: '22' - - uses: pnpm/action-setup@v4.1.0 + node-version: '24' + - uses: pnpm/action-setup@v4.2.0 name: Install pnpm id: pnpm-install with: @@ -105,7 +105,7 @@ jobs: run: | echo "::set-output name=pnpm_cache_dir::$(pnpm store path)" - - uses: actions/cache@v4 + - uses: actions/cache@v5 name: Setup pnpm cache with: path: ${{ steps.pnpm-cache.outputs.pnpm_cache_dir }} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 9f6767a5a44..39086f3a598 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/stale@v9 + - uses: actions/stale@v10 with: repo-token: ${{ secrets.GITHUB_TOKEN }} stale-issue-message: 'Stale issue message' diff --git a/.mcp.json b/.mcp.json new file mode 100644 index 00000000000..06f7d6e8372 --- /dev/null +++ b/.mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "nx-mcp": { + "type": "stdio", + "command": "npx", + "args": [ + "nx", + "mcp" + ] + } + } +} diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000000..91e8232c569 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,13 @@ + + + +# General Guidelines for working with Nx + +- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly +- You have access to the Nx MCP server and its tools, use them to help the user +- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable. +- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies +- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration +- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors + + diff --git a/CHANGELOG.md b/CHANGELOG.md index ab2420267bf..7ddac6ab79d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,25 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Bug Fixes + +- fix 5524 ([4459f09](https://github.com/tsparticles/tsparticles/commit/4459f09de1393d2f478612e3ff1089cb10f6e76a)) +- fixed issue [#5539](https://github.com/tsparticles/tsparticles/issues/5539), now shapes know when a fill function or a stroke function is needed ([cb616d3](https://github.com/tsparticles/tsparticles/commit/cb616d3d489ba65304d1f1b657d556807674567a)) +- fixed issue with groups and density calculation ([eb2e20a](https://github.com/tsparticles/tsparticles/commit/eb2e20a28ae1a87d02cfbcffd3454a11f73ef2c4)) +- fixed issue with the refactoring ([dd1fa73](https://github.com/tsparticles/tsparticles/commit/dd1fa7392ad3146f2ad9277da4dcf632ae0d8c6e)) +- fixed rotation movement when angle was 0 ([6d02bfb](https://github.com/tsparticles/tsparticles/commit/6d02bfb69b03c111d21af7d1727338ba46272829)) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- added hdr option, with fallback if not supported by the screen ([f42dc31](https://github.com/tsparticles/tsparticles/commit/f42dc31b8ba4e82eb04a465ebcf2bf77f041a5e0)) +- added new falling confetti to demo configs ([a43767b](https://github.com/tsparticles/tsparticles/commit/a43767b71f9a4213080f35d31fe70a8f0b420f52)) +- improved fireworks demo configs ([71473ec](https://github.com/tsparticles/tsparticles/commit/71473ecb48e454613d01598709dac303ae017ef9)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) +- using p3 (hdr) images in configs (except gifs) ([3989373](https://github.com/tsparticles/tsparticles/commit/39893734cb9fa86e0631a2516ec50e66a43012f6)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/workspace diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 00000000000..91e8232c569 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,13 @@ + + + +# General Guidelines for working with Nx + +- When running tasks (for example build, lint, test, e2e, etc.), always prefer running the task through `nx` (i.e. `nx run`, `nx run-many`, `nx affected`) instead of using the underlying tooling directly +- You have access to the Nx MCP server and its tools, use them to help the user +- When answering questions about the repository, use the `nx_workspace` tool first to gain an understanding of the workspace architecture where applicable. +- When working in individual projects, use the `nx_project_details` mcp tool to analyze and understand the specific project structure and dependencies +- For questions around nx configuration, best practices or if you're unsure, use the `nx_docs` tool to get relevant, up-to-date docs. Always use this instead of assuming things about nx configuration +- If the user needs help with an Nx configuration or project graph error, use the `nx_workspace` tool to get any errors + + diff --git a/bundles/all/.eslintignore b/bundles/all/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/bundles/all/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/bundles/all/.eslintrc.js b/bundles/all/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/bundles/all/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/bundles/all/CHANGELOG.md b/bundles/all/CHANGELOG.md index 016414c76c3..f776e48ba8b 100644 --- a/bundles/all/CHANGELOG.md +++ b/bundles/all/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/all + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/all diff --git a/bundles/all/eslint.config.js b/bundles/all/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/bundles/all/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/bundles/all/package.dist.json b/bundles/all/package.dist.json index 396104a19dd..31cb7f8482f 100644 --- a/bundles/all/package.dist.json +++ b/bundles/all/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/all", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "Easily create highly customizable particle 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.", "homepage": "https://particles.js.org", "repository": { @@ -99,59 +99,67 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/effect-bubble": "3.9.1", - "@tsparticles/effect-trail": "3.9.1", - "@tsparticles/engine": "3.9.1", - "@tsparticles/interaction-external-particle": "3.9.1", - "@tsparticles/interaction-external-pop": "3.9.1", - "@tsparticles/interaction-light": "3.9.1", - "@tsparticles/interaction-particles-repulse": "3.9.1", - "@tsparticles/path-curl-noise": "3.9.1", - "@tsparticles/path-curves": "3.9.1", - "@tsparticles/path-fractal-noise": "3.9.1", - "@tsparticles/path-perlin-noise": "3.9.1", - "@tsparticles/path-polygon": "3.9.1", - "@tsparticles/path-simplex-noise": "3.9.1", - "@tsparticles/path-svg": "3.9.1", - "@tsparticles/path-zig-zag": "3.9.1", - "@tsparticles/pjs": "3.9.1", - "@tsparticles/plugin-canvas-mask": "3.9.1", - "@tsparticles/plugin-easing-back": "3.9.1", - "@tsparticles/plugin-easing-circ": "3.9.1", - "@tsparticles/plugin-easing-cubic": "3.9.1", - "@tsparticles/plugin-easing-expo": "3.9.1", - "@tsparticles/plugin-easing-linear": "3.9.1", - "@tsparticles/plugin-easing-quart": "3.9.1", - "@tsparticles/plugin-easing-quint": "3.9.1", - "@tsparticles/plugin-easing-sine": "3.9.1", - "@tsparticles/plugin-emitters-shape-canvas": "3.9.1", - "@tsparticles/plugin-emitters-shape-path": "3.9.1", - "@tsparticles/plugin-emitters-shape-polygon": "3.9.1", - "@tsparticles/plugin-export-image": "3.9.1", - "@tsparticles/plugin-export-json": "3.9.1", - "@tsparticles/plugin-export-video": "3.9.1", - "@tsparticles/plugin-hsv-color": "3.9.1", - "@tsparticles/plugin-infection": "3.9.1", - "@tsparticles/plugin-motion": "3.9.1", - "@tsparticles/plugin-named-color": "3.9.1", - "@tsparticles/plugin-oklch-color": "3.9.1", - "@tsparticles/plugin-poisson-disc": "3.9.1", - "@tsparticles/plugin-polygon-mask": "3.9.1", - "@tsparticles/plugin-sounds": "3.9.1", - "@tsparticles/shape-arrow": "3.9.1", - "@tsparticles/shape-cards": "3.9.1", - "@tsparticles/shape-cog": "3.9.1", - "@tsparticles/shape-heart": "3.9.1", - "@tsparticles/shape-infinity": "3.9.1", - "@tsparticles/shape-path": "3.9.1", - "@tsparticles/shape-rounded-polygon": "3.9.1", - "@tsparticles/shape-rounded-rect": "3.9.1", - "@tsparticles/shape-spiral": "3.9.1", - "@tsparticles/updater-gradient": "3.9.1", - "@tsparticles/updater-orbit": "3.9.1", - "tsparticles": "3.9.1" + "@tsparticles/effect-bubble": "4.0.0-alpha.0", + "@tsparticles/effect-shadow": "4.0.0-alpha.0", + "@tsparticles/effect-trail": "4.0.0-alpha.0", + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/interaction-external-particle": "4.0.0-alpha.0", + "@tsparticles/interaction-external-pop": "4.0.0-alpha.0", + "@tsparticles/interaction-light": "4.0.0-alpha.0", + "@tsparticles/interaction-particles-repulse": "4.0.0-alpha.0", + "@tsparticles/path-curl-noise": "4.0.0-alpha.0", + "@tsparticles/path-curves": "4.0.0-alpha.0", + "@tsparticles/path-fractal-noise": "4.0.0-alpha.0", + "@tsparticles/path-perlin-noise": "4.0.0-alpha.0", + "@tsparticles/path-polygon": "4.0.0-alpha.0", + "@tsparticles/path-simplex-noise": "4.0.0-alpha.0", + "@tsparticles/path-svg": "4.0.0-alpha.0", + "@tsparticles/path-zig-zag": "4.0.0-alpha.0", + "@tsparticles/pjs": "4.0.0-alpha.0", + "@tsparticles/plugin-background-mask": "4.0.0-alpha.0", + "@tsparticles/plugin-canvas-mask": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-back": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-circ": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-cubic": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-expo": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-linear": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-quart": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-quint": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-sine": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-canvas": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-path": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-polygon": "4.0.0-alpha.0", + "@tsparticles/plugin-export-image": "4.0.0-alpha.0", + "@tsparticles/plugin-export-json": "4.0.0-alpha.0", + "@tsparticles/plugin-export-video": "4.0.0-alpha.0", + "@tsparticles/plugin-hsv-color": "4.0.0-alpha.0", + "@tsparticles/plugin-hwb-color": "4.0.0-alpha.0", + "@tsparticles/plugin-infection": "4.0.0-alpha.0", + "@tsparticles/plugin-lab-color": "4.0.0-alpha.0", + "@tsparticles/plugin-lch-color": "4.0.0-alpha.0", + "@tsparticles/plugin-motion": "4.0.0-alpha.0", + "@tsparticles/plugin-named-color": "4.0.0-alpha.0", + "@tsparticles/plugin-oklab-color": "4.0.0-alpha.0", + "@tsparticles/plugin-oklch-color": "4.0.0-alpha.0", + "@tsparticles/plugin-poisson-disc": "4.0.0-alpha.0", + "@tsparticles/plugin-polygon-mask": "4.0.0-alpha.0", + "@tsparticles/plugin-sounds": "4.0.0-alpha.0", + "@tsparticles/plugin-trail": "4.0.0-alpha.0", + "@tsparticles/shape-arrow": "4.0.0-alpha.0", + "@tsparticles/shape-cards": "4.0.0-alpha.0", + "@tsparticles/shape-cog": "4.0.0-alpha.0", + "@tsparticles/shape-heart": "4.0.0-alpha.0", + "@tsparticles/shape-infinity": "4.0.0-alpha.0", + "@tsparticles/shape-path": "4.0.0-alpha.0", + "@tsparticles/shape-rounded-polygon": "4.0.0-alpha.0", + "@tsparticles/shape-rounded-rect": "4.0.0-alpha.0", + "@tsparticles/shape-spiral": "4.0.0-alpha.0", + "@tsparticles/updater-gradient": "4.0.0-alpha.0", + "@tsparticles/updater-orbit": "4.0.0-alpha.0", + "tsparticles": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/bundles/all/package.json b/bundles/all/package.json index 28c888b6676..02fe5233919 100644 --- a/bundles/all/package.json +++ b/bundles/all/package.json @@ -1,167 +1,175 @@ { - "name": "@tsparticles/all", - "version": "3.9.1", - "description": "Easily create highly customizable particle 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.", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/all", + "version": "4.0.0-alpha.0", + "description": "Easily create highly customizable particle 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.", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "bundles/all" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "bundles/all" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/effect-bubble": "workspace:3.9.1", - "@tsparticles/effect-trail": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/interaction-external-particle": "workspace:3.9.1", - "@tsparticles/interaction-external-pop": "workspace:3.9.1", - "@tsparticles/interaction-light": "workspace:3.9.1", - "@tsparticles/interaction-particles-repulse": "workspace:3.9.1", - "@tsparticles/path-curl-noise": "workspace:3.9.1", - "@tsparticles/path-curves": "workspace:3.9.1", - "@tsparticles/path-fractal-noise": "workspace:3.9.1", - "@tsparticles/path-perlin-noise": "workspace:3.9.1", - "@tsparticles/path-polygon": "workspace:3.9.1", - "@tsparticles/path-simplex-noise": "workspace:3.9.1", - "@tsparticles/path-svg": "workspace:3.9.1", - "@tsparticles/path-zig-zag": "workspace:3.9.1", - "@tsparticles/pjs": "workspace:3.9.1", - "@tsparticles/plugin-canvas-mask": "workspace:3.9.1", - "@tsparticles/plugin-easing-back": "workspace:3.9.1", - "@tsparticles/plugin-easing-circ": "workspace:3.9.1", - "@tsparticles/plugin-easing-cubic": "workspace:3.9.1", - "@tsparticles/plugin-easing-expo": "workspace:3.9.1", - "@tsparticles/plugin-easing-linear": "workspace:3.9.1", - "@tsparticles/plugin-easing-quart": "workspace:3.9.1", - "@tsparticles/plugin-easing-quint": "workspace:3.9.1", - "@tsparticles/plugin-easing-sine": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-canvas": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-path": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-polygon": "workspace:3.9.1", - "@tsparticles/plugin-export-image": "workspace:3.9.1", - "@tsparticles/plugin-export-json": "workspace:3.9.1", - "@tsparticles/plugin-export-video": "workspace:3.9.1", - "@tsparticles/plugin-hsv-color": "workspace:3.9.1", - "@tsparticles/plugin-infection": "workspace:3.9.1", - "@tsparticles/plugin-motion": "workspace:3.9.1", - "@tsparticles/plugin-named-color": "workspace:3.9.1", - "@tsparticles/plugin-oklch-color": "workspace:3.9.1", - "@tsparticles/plugin-poisson-disc": "workspace:3.9.1", - "@tsparticles/plugin-polygon-mask": "workspace:3.9.1", - "@tsparticles/plugin-sounds": "workspace:3.9.1", - "@tsparticles/shape-arrow": "workspace:3.9.1", - "@tsparticles/shape-cards": "workspace:3.9.1", - "@tsparticles/shape-cog": "workspace:3.9.1", - "@tsparticles/shape-heart": "workspace:3.9.1", - "@tsparticles/shape-infinity": "workspace:3.9.1", - "@tsparticles/shape-path": "workspace:3.9.1", - "@tsparticles/shape-rounded-polygon": "workspace:3.9.1", - "@tsparticles/shape-rounded-rect": "workspace:3.9.1", - "@tsparticles/shape-spiral": "workspace:3.9.1", - "@tsparticles/updater-gradient": "workspace:3.9.1", - "@tsparticles/updater-orbit": "workspace:3.9.1", - "tsparticles": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/effect-bubble": "workspace:4.0.0-alpha.0", + "@tsparticles/effect-shadow": "workspace:4.0.0-alpha.0", + "@tsparticles/effect-trail": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-particle": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-pop": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-light": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-repulse": "workspace:4.0.0-alpha.0", + "@tsparticles/path-curl-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-curves": "workspace:4.0.0-alpha.0", + "@tsparticles/path-fractal-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-perlin-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/path-simplex-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-svg": "workspace:4.0.0-alpha.0", + "@tsparticles/path-zig-zag": "workspace:4.0.0-alpha.0", + "@tsparticles/pjs": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-background-mask": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-canvas-mask": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-back": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-circ": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-cubic": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-expo": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-linear": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-quart": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-quint": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-sine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-canvas": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-path": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-export-image": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-export-json": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-export-video": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hsv-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hwb-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-infection": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-lab-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-lch-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-motion": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-named-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-oklab-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-oklch-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-poisson-disc": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-polygon-mask": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-sounds": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-trail": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-arrow": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-cards": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-cog": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-heart": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-infinity": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-path": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-rounded-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-rounded-rect": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-spiral": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-gradient": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-orbit": "workspace:4.0.0-alpha.0", + "tsparticles": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/bundles/all/src/bundle.ts b/bundles/all/src/bundle.ts index 5c90a43dd1a..ff1821e1e9e 100644 --- a/bundles/all/src/bundle.ts +++ b/bundles/all/src/bundle.ts @@ -1,4 +1,4 @@ -import { loadAll } from "."; +import { loadAll } from "./index.js"; export { loadAll }; diff --git a/bundles/all/src/index.ts b/bundles/all/src/index.ts index 9c44db1372a..57f675ea0a4 100644 --- a/bundles/all/src/index.ts +++ b/bundles/all/src/index.ts @@ -1,54 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { initPjs } from "@tsparticles/pjs"; -import { loadArrowShape } from "@tsparticles/shape-arrow"; -import { loadBubbleEffect } from "@tsparticles/effect-bubble"; -import { loadCanvasMaskPlugin } from "@tsparticles/plugin-canvas-mask"; -import { loadCardsShape } from "@tsparticles/shape-cards"; -import { loadCogShape } from "@tsparticles/shape-cog"; -import { loadCurlNoisePath } from "@tsparticles/path-curl-noise"; -import { loadCurvesPath } from "@tsparticles/path-curves"; -import { loadEasingBackPlugin } from "@tsparticles/plugin-easing-back"; -import { loadEasingCircPlugin } from "@tsparticles/plugin-easing-circ"; -import { loadEasingCubicPlugin } from "@tsparticles/plugin-easing-cubic"; -import { loadEasingExpoPlugin } from "@tsparticles/plugin-easing-expo"; -import { loadEasingLinearPlugin } from "@tsparticles/plugin-easing-linear"; -import { loadEasingQuartPlugin } from "@tsparticles/plugin-easing-quart"; -import { loadEasingQuintPlugin } from "@tsparticles/plugin-easing-quint"; -import { loadEasingSinePlugin } from "@tsparticles/plugin-easing-sine"; -import { loadEmittersShapeCanvas } from "@tsparticles/plugin-emitters-shape-canvas"; -import { loadEmittersShapePath } from "@tsparticles/plugin-emitters-shape-path"; -import { loadEmittersShapePolygon } from "@tsparticles/plugin-emitters-shape-polygon"; -import { loadExportImagePlugin } from "@tsparticles/plugin-export-image"; -import { loadExportJSONPlugin } from "@tsparticles/plugin-export-json"; -import { loadExportVideoPlugin } from "@tsparticles/plugin-export-video"; -import { loadExternalParticleInteraction } from "@tsparticles/interaction-external-particle"; -import { loadExternalPopInteraction } from "@tsparticles/interaction-external-pop"; -import { loadFractalNoisePath } from "@tsparticles/path-fractal-noise"; -import { loadFull } from "tsparticles"; -import { loadGradientUpdater } from "@tsparticles/updater-gradient"; -import { loadHeartShape } from "@tsparticles/shape-heart"; -import { loadHsvColorPlugin } from "@tsparticles/plugin-hsv-color"; -import { loadInfectionPlugin } from "@tsparticles/plugin-infection"; -import { loadInfinityShape } from "@tsparticles/shape-infinity"; -import { loadLightInteraction } from "@tsparticles/interaction-light"; -import { loadMotionPlugin } from "@tsparticles/plugin-motion"; -import { loadNamedColorPlugin } from "@tsparticles/plugin-named-color"; -import { loadOklchColorPlugin } from "@tsparticles/plugin-oklch-color"; -import { loadOrbitUpdater } from "@tsparticles/updater-orbit"; -import { loadParticlesRepulseInteraction } from "@tsparticles/interaction-particles-repulse"; -import { loadPathShape } from "@tsparticles/shape-path"; -import { loadPerlinNoisePath } from "@tsparticles/path-perlin-noise"; -import { loadPoissonDiscPlugin } from "@tsparticles/plugin-poisson-disc"; -import { loadPolygonMaskPlugin } from "@tsparticles/plugin-polygon-mask"; -import { loadPolygonPath } from "@tsparticles/path-polygon"; -import { loadRoundedPolygonShape } from "@tsparticles/shape-rounded-polygon"; -import { loadRoundedRectShape } from "@tsparticles/shape-rounded-rect"; -import { loadSVGPath } from "@tsparticles/path-svg"; -import { loadSimplexNoisePath } from "@tsparticles/path-simplex-noise"; -import { loadSoundsPlugin } from "@tsparticles/plugin-sounds"; -import { loadSpiralShape } from "@tsparticles/shape-spiral"; -import { loadTrailEffect } from "@tsparticles/effect-trail"; -import { loadZigZagPath } from "@tsparticles/path-zig-zag"; declare const __VERSION__: string; @@ -59,65 +9,138 @@ declare const __VERSION__: string; * If this function is not called, the \@tsparticles/all package/dependency can be safely removed. * This function is called automatically using CDN bundle files. * @param engine - the engine to use for loading all plugins - * @param refresh - */ -export async function loadAll(engine: Engine, refresh = true): Promise { +export function loadAll(engine: Engine): void { engine.checkVersion(__VERSION__); - initPjs(engine); - - await loadFull(engine, false); - - await loadHsvColorPlugin(engine, false); - await loadNamedColorPlugin(engine, false); - await loadOklchColorPlugin(engine, false); - await loadEasingBackPlugin(engine, false); - await loadEasingCircPlugin(engine, false); - await loadEasingCubicPlugin(engine, false); - await loadEasingExpoPlugin(engine, false); - await loadEasingLinearPlugin(engine, false); - await loadEasingQuartPlugin(engine, false); - await loadEasingQuintPlugin(engine, false); - await loadEasingSinePlugin(engine, false); - - await loadEmittersShapeCanvas(engine, false); - await loadEmittersShapePath(engine, false); - await loadEmittersShapePolygon(engine, false); - - await loadCanvasMaskPlugin(engine, false); - await loadInfectionPlugin(engine, false); - await loadMotionPlugin(engine, false); - await loadPolygonMaskPlugin(engine, false); - await loadSoundsPlugin(engine, false); - await loadExportImagePlugin(engine, false); - await loadExportJSONPlugin(engine, false); - await loadExportVideoPlugin(engine, false); - await loadExternalParticleInteraction(engine, false); - await loadExternalPopInteraction(engine, false); - await loadLightInteraction(engine, false); - await loadParticlesRepulseInteraction(engine, false); - await loadGradientUpdater(engine, false); - await loadOrbitUpdater(engine, false); - await loadCurvesPath(engine, false); - await loadCurlNoisePath(engine, false); - await loadFractalNoisePath(engine, false); - await loadPerlinNoisePath(engine, false); - await loadPoissonDiscPlugin(engine, false); - await loadPolygonPath(engine, false); - await loadSVGPath(engine, false); - await loadZigZagPath(engine, false); - await loadSimplexNoisePath(engine, false); - await loadBubbleEffect(engine, false); - await loadArrowShape(engine, false); - await loadCardsShape(engine, false); - await loadCogShape(engine, false); - await loadHeartShape(engine, false); - await loadInfinityShape(engine, false); - await loadPathShape(engine, false); - await loadRoundedPolygonShape(engine, false); - await loadRoundedRectShape(engine, false); - await loadSpiralShape(engine, false); - await loadTrailEffect(engine, false); - - await engine.refresh(refresh); + engine.register(async e => { + const { initPjs } = await import("@tsparticles/pjs"), + { loadFull } = await import("tsparticles"), + { loadHsvColorPlugin } = await import("@tsparticles/plugin-hsv-color"), + { loadHwbColorPlugin } = await import("@tsparticles/plugin-hwb-color"), + { loadLabColorPlugin } = await import("@tsparticles/plugin-lab-color"), + { loadLchColorPlugin } = await import("@tsparticles/plugin-lch-color"), + { loadOklabColorPlugin } = await import("@tsparticles/plugin-oklab-color"), + { loadOklchColorPlugin } = await import("@tsparticles/plugin-oklch-color"), + { loadNamedColorPlugin } = await import("@tsparticles/plugin-named-color"), + { loadEasingBackPlugin } = await import("@tsparticles/plugin-easing-back"), + { loadEasingCircPlugin } = await import("@tsparticles/plugin-easing-circ"), + { loadEasingCubicPlugin } = await import("@tsparticles/plugin-easing-cubic"), + { loadEasingExpoPlugin } = await import("@tsparticles/plugin-easing-expo"), + { loadEasingLinearPlugin } = await import("@tsparticles/plugin-easing-linear"), + { loadEasingQuartPlugin } = await import("@tsparticles/plugin-easing-quart"), + { loadEasingQuintPlugin } = await import("@tsparticles/plugin-easing-quint"), + { loadEasingSinePlugin } = await import("@tsparticles/plugin-easing-sine"), + { loadEmittersShapeCanvas } = await import("@tsparticles/plugin-emitters-shape-canvas"), + { loadEmittersShapePath } = await import("@tsparticles/plugin-emitters-shape-path"), + { loadEmittersShapePolygon } = await import("@tsparticles/plugin-emitters-shape-polygon"), + { loadBackgroundMaskPlugin } = await import("@tsparticles/plugin-background-mask"), + { loadCanvasMaskPlugin } = await import("@tsparticles/plugin-canvas-mask"), + { loadInfectionPlugin } = await import("@tsparticles/plugin-infection"), + { loadMotionPlugin } = await import("@tsparticles/plugin-motion"), + { loadPoissonDiscPlugin } = await import("@tsparticles/plugin-poisson-disc"), + { loadPolygonMaskPlugin } = await import("@tsparticles/plugin-polygon-mask"), + { loadSoundsPlugin } = await import("@tsparticles/plugin-sounds"), + { loadTrailPlugin } = await import("@tsparticles/plugin-trail"), + { loadExportImagePlugin } = await import("@tsparticles/plugin-export-image"), + { loadExportJSONPlugin } = await import("@tsparticles/plugin-export-json"), + { loadExportVideoPlugin } = await import("@tsparticles/plugin-export-video"), + { loadExternalParticleInteraction } = await import("@tsparticles/interaction-external-particle"), + { loadExternalPopInteraction } = await import("@tsparticles/interaction-external-pop"), + { loadLightInteraction } = await import("@tsparticles/interaction-light"), + { loadParticlesRepulseInteraction } = await import("@tsparticles/interaction-particles-repulse"), + { loadGradientUpdater } = await import("@tsparticles/updater-gradient"), + { loadHeartShape } = await import("@tsparticles/shape-heart"), + { loadInfinityShape } = await import("@tsparticles/shape-infinity"), + { loadPathShape } = await import("@tsparticles/shape-path"), + { loadPolygonPath } = await import("@tsparticles/path-polygon"), + { loadRoundedPolygonShape } = await import("@tsparticles/shape-rounded-polygon"), + { loadRoundedRectShape } = await import("@tsparticles/shape-rounded-rect"), + { loadSpiralShape } = await import("@tsparticles/shape-spiral"), + { loadSVGPath } = await import("@tsparticles/path-svg"), + { loadZigZagPath } = await import("@tsparticles/path-zig-zag"), + { loadArrowShape } = await import("@tsparticles/shape-arrow"), + { loadCardsShape } = await import("@tsparticles/shape-cards"), + { loadCogShape } = await import("@tsparticles/shape-cog"), + { loadOrbitUpdater } = await import("@tsparticles/updater-orbit"), + { loadCurlNoisePath } = await import("@tsparticles/path-curl-noise"), + { loadCurvesPath } = await import("@tsparticles/path-curves"), + { loadFractalNoisePath } = await import("@tsparticles/path-fractal-noise"), + { loadPerlinNoisePath } = await import("@tsparticles/path-perlin-noise"), + { loadSimplexNoisePath } = await import("@tsparticles/path-simplex-noise"), + { loadBubbleEffect } = await import("@tsparticles/effect-bubble"), + { loadShadowEffect } = await import("@tsparticles/effect-shadow"), + { loadTrailEffect } = await import("@tsparticles/effect-trail"); + + initPjs(e); + + loadFull(e); + + loadHsvColorPlugin(e); + loadHwbColorPlugin(e); + loadLabColorPlugin(e); + loadLchColorPlugin(e); + loadOklabColorPlugin(e); + loadOklchColorPlugin(e); + loadNamedColorPlugin(e); + + loadEasingBackPlugin(e); + loadEasingCircPlugin(e); + loadEasingCubicPlugin(e); + loadEasingExpoPlugin(e); + loadEasingLinearPlugin(e); + loadEasingQuartPlugin(e); + loadEasingQuintPlugin(e); + loadEasingSinePlugin(e); + + loadEmittersShapeCanvas(e); + loadEmittersShapePath(e); + loadEmittersShapePolygon(e); + + loadBackgroundMaskPlugin(e); + loadCanvasMaskPlugin(e); + loadInfectionPlugin(e); + loadMotionPlugin(e); + loadPoissonDiscPlugin(e); + loadPolygonMaskPlugin(e); + loadSoundsPlugin(e); + loadTrailPlugin(e); + + loadExportImagePlugin(e); + loadExportJSONPlugin(e); + loadExportVideoPlugin(e); + + loadExternalParticleInteraction(e); + loadExternalPopInteraction(e); + + loadLightInteraction(e); + + loadParticlesRepulseInteraction(e); + + loadGradientUpdater(e); + loadOrbitUpdater(e); + + loadCurlNoisePath(e); + loadCurvesPath(e); + loadFractalNoisePath(e); + loadPerlinNoisePath(e); + loadPolygonPath(e); + loadSVGPath(e); + loadZigZagPath(e); + loadSimplexNoisePath(e); + + loadBubbleEffect(e); + loadShadowEffect(e); + loadTrailEffect(e); + + loadArrowShape(e); + loadCardsShape(e); + loadCogShape(e); + loadHeartShape(e); + loadInfinityShape(e); + loadPathShape(e); + loadRoundedPolygonShape(e); + loadRoundedRectShape(e); + loadSpiralShape(e); + }); } diff --git a/bundles/all/webpack.config.js b/bundles/all/webpack.config.js index cc2e15c7d67..c2b57baaa8b 100644 --- a/bundles/all/webpack.config.js +++ b/bundles/all/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "all", bundleName: "All", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "all", bundleName: "All", version, dir: __dirname }); diff --git a/bundles/basic/.eslintignore b/bundles/basic/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/bundles/basic/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/bundles/basic/.eslintrc.js b/bundles/basic/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/bundles/basic/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/bundles/basic/CHANGELOG.md b/bundles/basic/CHANGELOG.md index e710ec0d79e..f7fcceb710c 100644 --- a/bundles/basic/CHANGELOG.md +++ b/bundles/basic/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/basic + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/basic diff --git a/bundles/basic/eslint.config.js b/bundles/basic/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/bundles/basic/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/bundles/basic/package.dist.json b/bundles/basic/package.dist.json index b4194a94aba..f6a9c9c5dd0 100644 --- a/bundles/basic/package.dist.json +++ b/bundles/basic/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/basic", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "Easily create highly customizable particle 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.", "homepage": "https://particles.js.org", "repository": { @@ -99,18 +99,19 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/move-base": "3.9.1", - "@tsparticles/plugin-hex-color": "3.9.1", - "@tsparticles/plugin-hsl-color": "3.9.1", - "@tsparticles/plugin-rgb-color": "3.9.1", - "@tsparticles/shape-circle": "3.9.1", - "@tsparticles/updater-color": "3.9.1", - "@tsparticles/updater-opacity": "3.9.1", - "@tsparticles/updater-out-modes": "3.9.1", - "@tsparticles/updater-size": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/move-base": "4.0.0-alpha.0", + "@tsparticles/plugin-hex-color": "4.0.0-alpha.0", + "@tsparticles/plugin-hsl-color": "4.0.0-alpha.0", + "@tsparticles/plugin-rgb-color": "4.0.0-alpha.0", + "@tsparticles/shape-circle": "4.0.0-alpha.0", + "@tsparticles/updater-color": "4.0.0-alpha.0", + "@tsparticles/updater-opacity": "4.0.0-alpha.0", + "@tsparticles/updater-out-modes": "4.0.0-alpha.0", + "@tsparticles/updater-size": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/bundles/basic/package.json b/bundles/basic/package.json index db8c7042900..2a5794ac459 100644 --- a/bundles/basic/package.json +++ b/bundles/basic/package.json @@ -1,126 +1,127 @@ { - "name": "@tsparticles/basic", - "version": "3.9.1", - "description": "Easily create highly customizable particle 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.", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/basic", + "version": "4.0.0-alpha.0", + "description": "Easily create highly customizable particle 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.", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "bundles/basic" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "bundles/basic" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/move-base": "workspace:3.9.1", - "@tsparticles/plugin-hex-color": "workspace:3.9.1", - "@tsparticles/plugin-hsl-color": "workspace:3.9.1", - "@tsparticles/plugin-rgb-color": "workspace:3.9.1", - "@tsparticles/shape-circle": "workspace:3.9.1", - "@tsparticles/updater-color": "workspace:3.9.1", - "@tsparticles/updater-opacity": "workspace:3.9.1", - "@tsparticles/updater-out-modes": "workspace:3.9.1", - "@tsparticles/updater-size": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/move-base": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hex-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hsl-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-rgb-color": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-circle": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-color": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-opacity": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-out-modes": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-size": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/bundles/basic/src/bundle.ts b/bundles/basic/src/bundle.ts index f160854baea..8341dfe0dfb 100644 --- a/bundles/basic/src/bundle.ts +++ b/bundles/basic/src/bundle.ts @@ -1,4 +1,4 @@ -import { loadBasic } from "."; +import { loadBasic } from "./index.js"; export { loadBasic }; export * from "@tsparticles/engine"; diff --git a/bundles/basic/src/index.ts b/bundles/basic/src/index.ts index ae065cc0fa7..1fb514b6fcb 100644 --- a/bundles/basic/src/index.ts +++ b/bundles/basic/src/index.ts @@ -1,13 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { loadBaseMover } from "@tsparticles/move-base"; -import { loadCircleShape } from "@tsparticles/shape-circle"; -import { loadColorUpdater } from "@tsparticles/updater-color"; -import { loadHexColorPlugin } from "@tsparticles/plugin-hex-color"; -import { loadHslColorPlugin } from "@tsparticles/plugin-hsl-color"; -import { loadOpacityUpdater } from "@tsparticles/updater-opacity"; -import { loadOutModesUpdater } from "@tsparticles/updater-out-modes"; -import { loadRgbColorPlugin } from "@tsparticles/plugin-rgb-color"; -import { loadSizeUpdater } from "@tsparticles/updater-size"; declare const __VERSION__: string; @@ -18,23 +9,32 @@ declare const __VERSION__: string; * If this function is not called, the \@tsparticles/basic package/dependency can be safely removed. * This function is called automatically using CDN bundle files. * @param engine - the engine to use for loading all plugins - * @param refresh - */ -export async function loadBasic(engine: Engine, refresh = true): Promise { +export function loadBasic(engine: Engine): void { engine.checkVersion(__VERSION__); - await loadHexColorPlugin(engine, false); - await loadHslColorPlugin(engine, false); - await loadRgbColorPlugin(engine, false); + engine.register(async e => { + const { loadHexColorPlugin } = await import("@tsparticles/plugin-hex-color"), + { loadHslColorPlugin } = await import("@tsparticles/plugin-hsl-color"), + { loadRgbColorPlugin } = await import("@tsparticles/plugin-rgb-color"), + { loadBaseMover } = await import("@tsparticles/move-base"), + { loadCircleShape } = await import("@tsparticles/shape-circle"), + { loadColorUpdater } = await import("@tsparticles/updater-color"), + { loadOpacityUpdater } = await import("@tsparticles/updater-opacity"), + { loadOutModesUpdater } = await import("@tsparticles/updater-out-modes"), + { loadSizeUpdater } = await import("@tsparticles/updater-size"); - await loadBaseMover(engine, false); + loadHexColorPlugin(e); + loadHslColorPlugin(e); + loadRgbColorPlugin(e); - await loadCircleShape(engine, false); + loadBaseMover(e); - await loadColorUpdater(engine, false); - await loadOpacityUpdater(engine, false); - await loadOutModesUpdater(engine, false); - await loadSizeUpdater(engine, false); + loadCircleShape(e); - await engine.refresh(refresh); + loadColorUpdater(e); + loadOpacityUpdater(e); + loadOutModesUpdater(e); + loadSizeUpdater(e); + }); } diff --git a/bundles/basic/webpack.config.js b/bundles/basic/webpack.config.js index cfa065c8d0d..f8d97353c8a 100644 --- a/bundles/basic/webpack.config.js +++ b/bundles/basic/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "basic", bundleName: "Basic", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "basic", bundleName: "Basic", version, dir: __dirname }); diff --git a/bundles/confetti/.eslintignore b/bundles/confetti/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/bundles/confetti/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/bundles/confetti/.eslintrc.js b/bundles/confetti/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/bundles/confetti/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/bundles/confetti/CHANGELOG.md b/bundles/confetti/CHANGELOG.md index fc62434e0bf..433d94d6e7b 100644 --- a/bundles/confetti/CHANGELOG.md +++ b/bundles/confetti/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- improved fireworks demo configs ([71473ec](https://github.com/tsparticles/tsparticles/commit/71473ecb48e454613d01598709dac303ae017ef9)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/confetti diff --git a/bundles/confetti/eslint.config.js b/bundles/confetti/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/bundles/confetti/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/bundles/confetti/package.dist.json b/bundles/confetti/package.dist.json index ce4d658e6ab..c3067e770dd 100644 --- a/bundles/confetti/package.dist.json +++ b/bundles/confetti/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/confetti", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "Easily create highly customizable particle 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.", "homepage": "https://particles.js.org", "repository": { @@ -99,24 +99,25 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/basic": "3.9.1", - "@tsparticles/engine": "3.9.1", - "@tsparticles/plugin-emitters": "3.9.1", - "@tsparticles/plugin-motion": "3.9.1", - "@tsparticles/shape-cards": "3.9.1", - "@tsparticles/shape-emoji": "3.9.1", - "@tsparticles/shape-heart": "3.9.1", - "@tsparticles/shape-image": "3.9.1", - "@tsparticles/shape-polygon": "3.9.1", - "@tsparticles/shape-square": "3.9.1", - "@tsparticles/shape-star": "3.9.1", - "@tsparticles/updater-life": "3.9.1", - "@tsparticles/updater-roll": "3.9.1", - "@tsparticles/updater-rotate": "3.9.1", - "@tsparticles/updater-tilt": "3.9.1", - "@tsparticles/updater-wobble": "3.9.1" + "@tsparticles/basic": "4.0.0-alpha.0", + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "4.0.0-alpha.0", + "@tsparticles/plugin-motion": "4.0.0-alpha.0", + "@tsparticles/shape-cards": "4.0.0-alpha.0", + "@tsparticles/shape-emoji": "4.0.0-alpha.0", + "@tsparticles/shape-heart": "4.0.0-alpha.0", + "@tsparticles/shape-image": "4.0.0-alpha.0", + "@tsparticles/shape-polygon": "4.0.0-alpha.0", + "@tsparticles/shape-square": "4.0.0-alpha.0", + "@tsparticles/shape-star": "4.0.0-alpha.0", + "@tsparticles/updater-life": "4.0.0-alpha.0", + "@tsparticles/updater-roll": "4.0.0-alpha.0", + "@tsparticles/updater-rotate": "4.0.0-alpha.0", + "@tsparticles/updater-tilt": "4.0.0-alpha.0", + "@tsparticles/updater-wobble": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/bundles/confetti/package.json b/bundles/confetti/package.json index 72b8be861dc..76fb385a744 100644 --- a/bundles/confetti/package.json +++ b/bundles/confetti/package.json @@ -1,132 +1,133 @@ { - "name": "@tsparticles/confetti", - "version": "3.9.1", - "description": "Easily create highly customizable particle 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.", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/confetti", + "version": "4.0.0-alpha.0", + "description": "Easily create highly customizable particle 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.", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "bundles/confetti" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "bundles/confetti" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/basic": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1", - "@tsparticles/plugin-motion": "workspace:3.9.1", - "@tsparticles/shape-cards": "workspace:3.9.1", - "@tsparticles/shape-emoji": "workspace:3.9.1", - "@tsparticles/shape-heart": "workspace:3.9.1", - "@tsparticles/shape-image": "workspace:3.9.1", - "@tsparticles/shape-polygon": "workspace:3.9.1", - "@tsparticles/shape-square": "workspace:3.9.1", - "@tsparticles/shape-star": "workspace:3.9.1", - "@tsparticles/updater-life": "workspace:3.9.1", - "@tsparticles/updater-roll": "workspace:3.9.1", - "@tsparticles/updater-rotate": "workspace:3.9.1", - "@tsparticles/updater-tilt": "workspace:3.9.1", - "@tsparticles/updater-wobble": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/basic": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-motion": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-cards": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-emoji": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-heart": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-image": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-square": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-star": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-life": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-roll": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-rotate": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-tilt": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-wobble": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/bundles/confetti/src/ConfettiOptions.ts b/bundles/confetti/src/ConfettiOptions.ts index 57b6f4e8a45..a37f4fe7973 100644 --- a/bundles/confetti/src/ConfettiOptions.ts +++ b/bundles/confetti/src/ConfettiOptions.ts @@ -168,6 +168,7 @@ export class ConfettiOptions implements IConfettiOptions, IOptionLoader) => Promise; - - init: () => Promise; - - /** - * the confetti version number - */ - version: string; - }; - } + create: (canvas: HTMLCanvasElement, options: RecursivePartial) => Promise; + + init: () => Promise; + + /** + * the confetti version number + */ + version: string; + }; } let initialized = false; @@ -119,21 +99,39 @@ async function initPlugins(engine: Engine): Promise { engine.checkVersion(__VERSION__); - await loadEmittersPlugin(engine, false); - await loadMotionPlugin(engine, false); - await loadCardsShape(engine, false); - await loadHeartShape(engine, false); - await loadImageShape(engine, false); - await loadPolygonShape(engine, false); - await loadSquareShape(engine, false); - await loadStarShape(engine, false); - await loadEmojiShape(engine, false); - await loadRotateUpdater(engine, false); - await loadLifeUpdater(engine, false); - await loadRollUpdater(engine, false); - await loadTiltUpdater(engine, false); - await loadWobbleUpdater(engine, false); - await loadBasic(engine); + engine.register(async e => { + const { loadEmittersPlugin } = await import("@tsparticles/plugin-emitters"), + { loadMotionPlugin } = await import("@tsparticles/plugin-motion"), + { loadCardsShape } = await import("@tsparticles/shape-cards"), + { loadHeartShape } = await import("@tsparticles/shape-heart"), + { loadImageShape } = await import("@tsparticles/shape-image"), + { loadPolygonShape } = await import("@tsparticles/shape-polygon"), + { loadSquareShape } = await import("@tsparticles/shape-square"), + { loadStarShape } = await import("@tsparticles/shape-star"), + { loadEmojiShape } = await import("@tsparticles/shape-emoji"), + { loadRotateUpdater } = await import("@tsparticles/updater-rotate"), + { loadLifeUpdater } = await import("@tsparticles/updater-life"), + { loadRollUpdater } = await import("@tsparticles/updater-roll"), + { loadTiltUpdater } = await import("@tsparticles/updater-tilt"), + { loadWobbleUpdater } = await import("@tsparticles/updater-wobble"), + { loadBasic } = await import("@tsparticles/basic"); + + loadEmittersPlugin(e); + loadMotionPlugin(e); + loadCardsShape(e); + loadHeartShape(e); + loadImageShape(e); + loadPolygonShape(e); + loadSquareShape(e); + loadStarShape(e); + loadEmojiShape(e); + loadRotateUpdater(e); + loadLifeUpdater(e); + loadRollUpdater(e); + loadTiltUpdater(e); + loadWobbleUpdater(e); + loadBasic(e); + }); initializing = false; initialized = true; @@ -161,7 +159,7 @@ async function setConfetti(params: ConfettiParams): Promise, ): Promise => { - if (!canvas) { - return confetti; - } - await initPlugins(tsParticles); const id = canvas.getAttribute("id") ?? "confetti"; @@ -499,6 +492,4 @@ confetti.init = async (): Promise => { */ confetti.version = __VERSION__; -if (!isSsr()) { - window.confetti = confetti; -} +globalThis.confetti = confetti; diff --git a/bundles/confetti/webpack.config.js b/bundles/confetti/webpack.config.js index 2a6bb445927..ab83ac59646 100644 --- a/bundles/confetti/webpack.config.js +++ b/bundles/confetti/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "confetti", bundleName: "Confetti", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "confetti", bundleName: "Confetti", version, dir: __dirname }); diff --git a/bundles/fireworks/.eslintignore b/bundles/fireworks/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/bundles/fireworks/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/bundles/fireworks/.eslintrc.js b/bundles/fireworks/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/bundles/fireworks/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/bundles/fireworks/CHANGELOG.md b/bundles/fireworks/CHANGELOG.md index 2838c49a495..edeabc0547a 100644 --- a/bundles/fireworks/CHANGELOG.md +++ b/bundles/fireworks/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/fireworks + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/fireworks diff --git a/bundles/fireworks/eslint.config.js b/bundles/fireworks/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/bundles/fireworks/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/bundles/fireworks/package.dist.json b/bundles/fireworks/package.dist.json index 33e0caca030..7b7ed7e3999 100644 --- a/bundles/fireworks/package.dist.json +++ b/bundles/fireworks/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/fireworks", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "Easily create highly customizable particle 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.", "homepage": "https://particles.js.org", "repository": { @@ -99,17 +99,18 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/basic": "3.9.1", - "@tsparticles/effect-trail": "3.9.1", - "@tsparticles/engine": "3.9.1", - "@tsparticles/plugin-emitters": "3.9.1", - "@tsparticles/plugin-emitters-shape-square": "3.9.1", - "@tsparticles/plugin-sounds": "3.9.1", - "@tsparticles/updater-destroy": "3.9.1", - "@tsparticles/updater-life": "3.9.1", - "@tsparticles/updater-rotate": "3.9.1" + "@tsparticles/basic": "4.0.0-alpha.0", + "@tsparticles/effect-trail": "4.0.0-alpha.0", + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-square": "4.0.0-alpha.0", + "@tsparticles/plugin-sounds": "4.0.0-alpha.0", + "@tsparticles/updater-destroy": "4.0.0-alpha.0", + "@tsparticles/updater-life": "4.0.0-alpha.0", + "@tsparticles/updater-rotate": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/bundles/fireworks/package.json b/bundles/fireworks/package.json index 33ec2d8ebec..0396c50ad0b 100644 --- a/bundles/fireworks/package.json +++ b/bundles/fireworks/package.json @@ -1,125 +1,126 @@ { - "name": "@tsparticles/fireworks", - "version": "3.9.1", - "description": "Easily create highly customizable particle 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.", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/fireworks", + "version": "4.0.0-alpha.0", + "description": "Easily create highly customizable particle 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.", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "bundles/fireworks" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "bundles/fireworks" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/basic": "workspace:3.9.1", - "@tsparticles/effect-trail": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-square": "workspace:3.9.1", - "@tsparticles/plugin-sounds": "workspace:3.9.1", - "@tsparticles/updater-destroy": "workspace:3.9.1", - "@tsparticles/updater-life": "workspace:3.9.1", - "@tsparticles/updater-rotate": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/basic": "workspace:4.0.0-alpha.0", + "@tsparticles/effect-trail": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-square": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-sounds": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-destroy": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-life": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-rotate": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/bundles/fireworks/src/bundle.ts b/bundles/fireworks/src/bundle.ts index 403c2aaf264..943bd743796 100644 --- a/bundles/fireworks/src/bundle.ts +++ b/bundles/fireworks/src/bundle.ts @@ -1,2 +1,2 @@ -export * from "."; +export * from "./index.js"; export * from "@tsparticles/engine"; diff --git a/bundles/fireworks/src/fireworks.ts b/bundles/fireworks/src/fireworks.ts index fd142bddac9..4e5a6ba8b8d 100644 --- a/bundles/fireworks/src/fireworks.ts +++ b/bundles/fireworks/src/fireworks.ts @@ -13,21 +13,12 @@ import { getRangeMax, getRangeMin, isNumber, - isSsr, isString, setRangeValue, tsParticles, } from "@tsparticles/engine"; import { FireworkOptions } from "./FireworkOptions.js"; import type { IFireworkOptions } from "./IFireworkOptions.js"; -import { loadBasic } from "@tsparticles/basic"; -import { loadDestroyUpdater } from "@tsparticles/updater-destroy"; -import { loadEmittersPlugin } from "@tsparticles/plugin-emitters"; -import { loadEmittersShapeSquare } from "@tsparticles/plugin-emitters-shape-square"; -import { loadLifeUpdater } from "@tsparticles/updater-life"; -import { loadRotateUpdater } from "@tsparticles/updater-rotate"; -import { loadSoundsPlugin } from "@tsparticles/plugin-sounds"; -import { loadTrailEffect } from "@tsparticles/effect-trail"; declare const __VERSION__: string; @@ -44,16 +35,14 @@ type FireworksFunc = (( }; declare global { - interface Window { - fireworks: FireworksFunc & { - create: ( - canvas: HTMLCanvasElement, - options: RecursivePartial, - ) => Promise; - init: () => Promise; - version: string; - }; - } + var fireworks: FireworksFunc & { + create: ( + canvas: HTMLCanvasElement, + options: RecursivePartial, + ) => Promise; + init: () => Promise; + version: string; + }; } const explodeSoundCheck = (args: CustomEventArgs): boolean => { @@ -108,14 +97,25 @@ async function initPlugins(engine: Engine): Promise { engine.checkVersion(__VERSION__); - await loadEmittersPlugin(engine, false); - await loadEmittersShapeSquare(engine, false); - await loadSoundsPlugin(engine, false); - await loadRotateUpdater(engine, false); - await loadDestroyUpdater(engine, false); - await loadLifeUpdater(engine, false); - await loadTrailEffect(engine, false); - await loadBasic(engine, false); + engine.register(async e => { + const { loadEmittersPlugin } = await import("@tsparticles/plugin-emitters"), + { loadEmittersShapeSquare } = await import("@tsparticles/plugin-emitters-shape-square"), + { loadSoundsPlugin } = await import("@tsparticles/plugin-sounds"), + { loadRotateUpdater } = await import("@tsparticles/updater-rotate"), + { loadDestroyUpdater } = await import("@tsparticles/updater-destroy"), + { loadLifeUpdater } = await import("@tsparticles/updater-life"), + { loadTrailEffect } = await import("@tsparticles/effect-trail"), + { loadBasic } = await import("@tsparticles/basic"); + + loadEmittersPlugin(e); + loadEmittersShapeSquare(e); + loadSoundsPlugin(e); + loadRotateUpdater(e); + loadDestroyUpdater(e); + loadLifeUpdater(e); + loadTrailEffect(e); + loadBasic(e); + }); initializing = false; initialized = true; @@ -376,7 +376,7 @@ fireworks.create = async ( canvas: HTMLCanvasElement, options?: RecursivePartial, ): Promise => { - const id = canvas.id ?? "fireworks"; + const id = canvas.id || "fireworks"; return getFireworksInstance(id, options ?? {}, canvas); }; @@ -387,6 +387,4 @@ fireworks.init = async (): Promise => { fireworks.version = __VERSION__; -if (!isSsr()) { - window.fireworks = fireworks; -} +globalThis.fireworks = fireworks; diff --git a/bundles/fireworks/webpack.config.js b/bundles/fireworks/webpack.config.js index 6327907c9a9..bf7fbb3fd6a 100644 --- a/bundles/fireworks/webpack.config.js +++ b/bundles/fireworks/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "fireworks", bundleName: "Fireworks", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "fireworks", bundleName: "Fireworks", version, dir: __dirname }); diff --git a/bundles/full/.eslintignore b/bundles/full/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/bundles/full/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/bundles/full/.eslintrc.js b/bundles/full/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/bundles/full/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/bundles/full/CHANGELOG.md b/bundles/full/CHANGELOG.md index ac8eee31ded..5c7400f40f8 100644 --- a/bundles/full/CHANGELOG.md +++ b/bundles/full/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package tsparticles + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package tsparticles diff --git a/bundles/full/eslint.config.js b/bundles/full/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/bundles/full/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/bundles/full/package.dist.json b/bundles/full/package.dist.json index 3595c39d169..3c41378ced6 100644 --- a/bundles/full/package.dist.json +++ b/bundles/full/package.dist.json @@ -1,6 +1,6 @@ { "name": "tsparticles", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "Easily create highly customizable particle 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.", "homepage": "https://particles.js.org", "repository": { @@ -99,21 +99,22 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/interaction-external-trail": "3.9.1", - "@tsparticles/plugin-absorbers": "3.9.1", - "@tsparticles/plugin-emitters": "3.9.1", - "@tsparticles/plugin-emitters-shape-circle": "3.9.1", - "@tsparticles/plugin-emitters-shape-square": "3.9.1", - "@tsparticles/shape-text": "3.9.1", - "@tsparticles/slim": "3.9.1", - "@tsparticles/updater-destroy": "3.9.1", - "@tsparticles/updater-roll": "3.9.1", - "@tsparticles/updater-tilt": "3.9.1", - "@tsparticles/updater-twinkle": "3.9.1", - "@tsparticles/updater-wobble": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/interaction-external-trail": "4.0.0-alpha.0", + "@tsparticles/plugin-absorbers": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-circle": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-square": "4.0.0-alpha.0", + "@tsparticles/shape-text": "4.0.0-alpha.0", + "@tsparticles/slim": "4.0.0-alpha.0", + "@tsparticles/updater-destroy": "4.0.0-alpha.0", + "@tsparticles/updater-roll": "4.0.0-alpha.0", + "@tsparticles/updater-tilt": "4.0.0-alpha.0", + "@tsparticles/updater-twinkle": "4.0.0-alpha.0", + "@tsparticles/updater-wobble": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/bundles/full/package.json b/bundles/full/package.json index d80b8b19252..dbb1fb9c89d 100644 --- a/bundles/full/package.json +++ b/bundles/full/package.json @@ -1,129 +1,130 @@ { - "name": "tsparticles", - "version": "3.9.1", - "description": "Easily create highly customizable particle 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.", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "tsparticles", + "version": "4.0.0-alpha.0", + "description": "Easily create highly customizable particle 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.", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "bundles/full" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "bundles/full" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/interaction-external-trail": "workspace:3.9.1", - "@tsparticles/plugin-absorbers": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-circle": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-square": "workspace:3.9.1", - "@tsparticles/shape-text": "workspace:3.9.1", - "@tsparticles/slim": "workspace:3.9.1", - "@tsparticles/updater-destroy": "workspace:3.9.1", - "@tsparticles/updater-roll": "workspace:3.9.1", - "@tsparticles/updater-tilt": "workspace:3.9.1", - "@tsparticles/updater-twinkle": "workspace:3.9.1", - "@tsparticles/updater-wobble": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-trail": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-absorbers": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-circle": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-square": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-text": "workspace:4.0.0-alpha.0", + "@tsparticles/slim": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-destroy": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-roll": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-tilt": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-twinkle": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-wobble": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/bundles/full/src/bundle.ts b/bundles/full/src/bundle.ts index 59ae5a3973b..f577855f372 100644 --- a/bundles/full/src/bundle.ts +++ b/bundles/full/src/bundle.ts @@ -1,4 +1,4 @@ -import { loadFull } from "."; +import { loadFull } from "./index.js"; export { loadFull }; diff --git a/bundles/full/src/index.ts b/bundles/full/src/index.ts index d98833d3e8e..ab04d298f03 100644 --- a/bundles/full/src/index.ts +++ b/bundles/full/src/index.ts @@ -1,16 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { loadAbsorbersPlugin } from "@tsparticles/plugin-absorbers"; -import { loadDestroyUpdater } from "@tsparticles/updater-destroy"; -import { loadEmittersPlugin } from "@tsparticles/plugin-emitters"; -import { loadEmittersShapeCircle } from "@tsparticles/plugin-emitters-shape-circle"; -import { loadEmittersShapeSquare } from "@tsparticles/plugin-emitters-shape-square"; -import { loadExternalTrailInteraction } from "@tsparticles/interaction-external-trail"; -import { loadRollUpdater } from "@tsparticles/updater-roll"; -import { loadSlim } from "@tsparticles/slim"; -import { loadTextShape } from "@tsparticles/shape-text"; -import { loadTiltUpdater } from "@tsparticles/updater-tilt"; -import { loadTwinkleUpdater } from "@tsparticles/updater-twinkle"; -import { loadWobbleUpdater } from "@tsparticles/updater-wobble"; declare const __VERSION__: string; @@ -21,26 +9,40 @@ declare const __VERSION__: string; * If this function is not called, the tsparticles package/dependency can be safely removed. * This function is called automatically using CDN bundle files. * @param engine - the engine to use for loading all plugins - * @param refresh - */ -export async function loadFull(engine: Engine, refresh = true): Promise { +export function loadFull(engine: Engine): void { engine.checkVersion(__VERSION__); - await loadDestroyUpdater(engine, false); - await loadRollUpdater(engine, false); - await loadTiltUpdater(engine, false); - await loadTwinkleUpdater(engine, false); - await loadWobbleUpdater(engine, false); - - await loadTextShape(engine, false); - - await loadExternalTrailInteraction(engine, false); - - await loadAbsorbersPlugin(engine, false); - await loadEmittersPlugin(engine, false); - - await loadEmittersShapeCircle(engine, false); - await loadEmittersShapeSquare(engine, false); - - await loadSlim(engine, refresh); + engine.register(async e => { + const { loadDestroyUpdater } = await import("@tsparticles/updater-destroy"), + { loadRollUpdater } = await import("@tsparticles/updater-roll"), + { loadTiltUpdater } = await import("@tsparticles/updater-tilt"), + { loadTwinkleUpdater } = await import("@tsparticles/updater-twinkle"), + { loadWobbleUpdater } = await import("@tsparticles/updater-wobble"), + { loadTextShape } = await import("@tsparticles/shape-text"), + { loadExternalTrailInteraction } = await import("@tsparticles/interaction-external-trail"), + { loadAbsorbersPlugin } = await import("@tsparticles/plugin-absorbers"), + { loadEmittersPlugin } = await import("@tsparticles/plugin-emitters"), + { loadEmittersShapeCircle } = await import("@tsparticles/plugin-emitters-shape-circle"), + { loadEmittersShapeSquare } = await import("@tsparticles/plugin-emitters-shape-square"), + { loadSlim } = await import("@tsparticles/slim"); + + loadDestroyUpdater(e); + loadRollUpdater(e); + loadTiltUpdater(e); + loadTwinkleUpdater(e); + loadWobbleUpdater(e); + + loadTextShape(e); + + loadExternalTrailInteraction(e); + + loadAbsorbersPlugin(e); + loadEmittersPlugin(e); + + loadEmittersShapeCircle(e); + loadEmittersShapeSquare(e); + + loadSlim(engine); + }); } diff --git a/bundles/full/webpack.config.js b/bundles/full/webpack.config.js index dd97df64308..467a61ac05e 100644 --- a/bundles/full/webpack.config.js +++ b/bundles/full/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "", bundleName: "", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "", bundleName: "", version, dir: __dirname }); diff --git a/bundles/pjs/.eslintignore b/bundles/pjs/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/bundles/pjs/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/bundles/pjs/.eslintrc.js b/bundles/pjs/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/bundles/pjs/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/bundles/pjs/CHANGELOG.md b/bundles/pjs/CHANGELOG.md index a559b36cc66..6ecdef5961a 100644 --- a/bundles/pjs/CHANGELOG.md +++ b/bundles/pjs/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Bug Fixes + +- fixed issue with the refactoring ([dd1fa73](https://github.com/tsparticles/tsparticles/commit/dd1fa7392ad3146f2ad9277da4dcf632ae0d8c6e)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/pjs diff --git a/bundles/pjs/eslint.config.js b/bundles/pjs/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/bundles/pjs/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/bundles/pjs/package.dist.json b/bundles/pjs/package.dist.json index 592f8e90be1..980c951aaa9 100644 --- a/bundles/pjs/package.dist.json +++ b/bundles/pjs/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/pjs", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "Easily create highly customizable particle 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.", "homepage": "https://particles.js.org", "repository": { @@ -99,9 +99,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/bundles/pjs/package.json b/bundles/pjs/package.json index b98118553c7..15537d12479 100644 --- a/bundles/pjs/package.json +++ b/bundles/pjs/package.json @@ -1,117 +1,118 @@ { - "name": "@tsparticles/pjs", - "version": "3.9.1", - "description": "Easily create highly customizable particle 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.", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/pjs", + "version": "4.0.0-alpha.0", + "description": "Easily create highly customizable particle 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.", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "bundles/pjs" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "bundles/pjs" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/bundles/pjs/src/VincentGarreau/particles.ts b/bundles/pjs/src/VincentGarreau/particles.ts index 7170ac1522a..c2772eb6d79 100644 --- a/bundles/pjs/src/VincentGarreau/particles.ts +++ b/bundles/pjs/src/VincentGarreau/particles.ts @@ -290,6 +290,7 @@ const initParticlesJS = ( * @param pathConfigJson - the json path to use in the GET request * @param callback - called after the {@link Container} is loaded and it will be passed as a parameter */ + // eslint-disable-next-line @typescript-eslint/no-deprecated particlesJS.load = (tagId: string, pathConfigJson: string, callback: (container?: Container) => void): void => { engine .load({ id: tagId, url: pathConfigJson }) @@ -308,6 +309,7 @@ const initParticlesJS = ( * @deprecated this method is obsolete, please use the new tsParticles.setOnClickHandler * @param callback - the function called after the click event is fired */ + // eslint-disable-next-line @typescript-eslint/no-deprecated particlesJS.setOnClickHandler = (callback: (e: Event, particles?: Particle[]) => void): void => { engine.setOnClickHandler(callback); }; @@ -318,6 +320,7 @@ const initParticlesJS = ( */ const pJSDom = engine.dom(); + // eslint-disable-next-line @typescript-eslint/no-deprecated return { particlesJS, pJSDom }; }; diff --git a/bundles/pjs/src/bundle.ts b/bundles/pjs/src/bundle.ts index ed9b372e16d..4135057a5e6 100644 --- a/bundles/pjs/src/bundle.ts +++ b/bundles/pjs/src/bundle.ts @@ -1,6 +1,7 @@ -import { initPjs } from "."; +import { initPjs } from "./index.js"; import { tsParticles } from "@tsparticles/engine"; +// eslint-disable-next-line @typescript-eslint/no-deprecated const { particlesJS, pJSDom, Particles } = initPjs(tsParticles); export * from "@tsparticles/engine"; diff --git a/bundles/pjs/src/index.ts b/bundles/pjs/src/index.ts index ab258e23474..c1c9be33016 100644 --- a/bundles/pjs/src/index.ts +++ b/bundles/pjs/src/index.ts @@ -3,31 +3,29 @@ */ import { type Container, type Engine } from "@tsparticles/engine"; import type { IParticlesJS } from "./VincentGarreau/IParticlesJS.js"; -import { Particles } from "./marcbruederlin/Particles.js"; +import { MBParticles } from "./marcbruederlin/Particles.js"; import { initParticlesJS } from "./VincentGarreau/particles.js"; declare const __VERSION__: string; declare global { - interface Window { - /** - * @deprecated this method is obsolete, please use the new {@link Engine.load | tsParticles.load} - * The particles.js compatibility object - */ - Particles: typeof Particles; + /** + * @deprecated this method is obsolete, please use the new {@link Engine.load | tsParticles.load} + * The particles.js compatibility object + */ + var Particles: typeof MBParticles; - /** - * @deprecated this method is obsolete, please use the new {@link Engine.dom | tsParticles.dom} - * The particles.js compatibility dom array - */ - pJSDom: Container[]; + /** + * @deprecated this method is obsolete, please use the new {@link Engine.dom | tsParticles.dom} + * The particles.js compatibility dom array + */ + var pJSDom: Container[]; - /** - * @deprecated this method is obsolete, please use the new {@link Engine.load | tsParticles.load} - * The particles.js compatibility instance - */ - particlesJS: IParticlesJS; - } + /** + * @deprecated this method is obsolete, please use the new {@link Engine.load | tsParticles.load} + * The particles.js compatibility instance + */ + var particlesJS: IParticlesJS; } /** @@ -42,7 +40,7 @@ const initPjs = ( * @deprecated this method is obsolete, please use the new {@link Engine.load | tsParticles.load} * The particles.js compatibility object */ - Particles: typeof Particles; + Particles: typeof MBParticles; /** * @deprecated this method is obsolete, please use the new {@link Engine.dom | tsParticles.dom} @@ -58,13 +56,17 @@ const initPjs = ( } => { engine.checkVersion(__VERSION__); + // eslint-disable-next-line @typescript-eslint/no-deprecated const { particlesJS, pJSDom } = initParticlesJS(engine); - window.particlesJS = particlesJS; - window.pJSDom = pJSDom; - window.Particles = Particles; + // eslint-disable-next-line @typescript-eslint/no-deprecated + globalThis.particlesJS = particlesJS; + // eslint-disable-next-line @typescript-eslint/no-deprecated + globalThis.pJSDom = pJSDom; + // eslint-disable-next-line @typescript-eslint/no-deprecated + globalThis.Particles = MBParticles; - return { particlesJS, pJSDom, Particles }; + return { particlesJS, pJSDom, Particles: MBParticles }; }; export { initPjs }; diff --git a/bundles/pjs/src/marcbruederlin/Particles.ts b/bundles/pjs/src/marcbruederlin/Particles.ts index c1b633cd8a3..731b194f89b 100644 --- a/bundles/pjs/src/marcbruederlin/Particles.ts +++ b/bundles/pjs/src/marcbruederlin/Particles.ts @@ -1,4 +1,10 @@ -import { type Container, type RecursivePartial, type SingleOrMultiple, tsParticles } from "@tsparticles/engine"; +import { + type Container, + type RecursivePartial, + type SingleOrMultiple, + safeDocument, + tsParticles, +} from "@tsparticles/engine"; interface ResponsiveOptions { breakpoint: number; @@ -21,18 +27,18 @@ const linksMinDistance = 120, particlesMinCount = 100, sizeMinValue = 3; -export class Particles { +export class MBParticles { private _container?: Container; - static init(options: RecursivePartial): Particles { - const particles = new Particles(), + static init(options: RecursivePartial): MBParticles { + const particles = new MBParticles(), selector = options.selector; if (!selector) { throw new Error("No selector provided"); } - const el = document.querySelector(selector)!; + const el = safeDocument().querySelector(selector); if (!el) { throw new Error("No element found for selector"); diff --git a/bundles/pjs/webpack.config.js b/bundles/pjs/webpack.config.js index aaf8dcfa655..c890f142382 100644 --- a/bundles/pjs/webpack.config.js +++ b/bundles/pjs/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "pjs", bundleName: "Particles.js", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "pjs", bundleName: "Particles.js", version, dir: __dirname }); diff --git a/bundles/slim/.eslintignore b/bundles/slim/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/bundles/slim/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/bundles/slim/.eslintrc.js b/bundles/slim/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/bundles/slim/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/bundles/slim/CHANGELOG.md b/bundles/slim/CHANGELOG.md index bb6c046e8f1..405abcfde4f 100644 --- a/bundles/slim/CHANGELOG.md +++ b/bundles/slim/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/slim + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/slim diff --git a/bundles/slim/eslint.config.js b/bundles/slim/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/bundles/slim/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/bundles/slim/package.dist.json b/bundles/slim/package.dist.json index e65dd184120..5b9f7be6be1 100644 --- a/bundles/slim/package.dist.json +++ b/bundles/slim/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/slim", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "Easily create highly customizable particle 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.", "homepage": "https://particles.js.org", "repository": { @@ -99,34 +99,35 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/basic": "3.9.1", - "@tsparticles/engine": "3.9.1", - "@tsparticles/interaction-external-attract": "3.9.1", - "@tsparticles/interaction-external-bounce": "3.9.1", - "@tsparticles/interaction-external-bubble": "3.9.1", - "@tsparticles/interaction-external-connect": "3.9.1", - "@tsparticles/interaction-external-grab": "3.9.1", - "@tsparticles/interaction-external-pause": "3.9.1", - "@tsparticles/interaction-external-push": "3.9.1", - "@tsparticles/interaction-external-remove": "3.9.1", - "@tsparticles/interaction-external-repulse": "3.9.1", - "@tsparticles/interaction-external-slow": "3.9.1", - "@tsparticles/interaction-particles-attract": "3.9.1", - "@tsparticles/interaction-particles-collisions": "3.9.1", - "@tsparticles/interaction-particles-links": "3.9.1", - "@tsparticles/move-parallax": "3.9.1", - "@tsparticles/plugin-easing-quad": "3.9.1", - "@tsparticles/shape-emoji": "3.9.1", - "@tsparticles/shape-image": "3.9.1", - "@tsparticles/shape-line": "3.9.1", - "@tsparticles/shape-polygon": "3.9.1", - "@tsparticles/shape-square": "3.9.1", - "@tsparticles/shape-star": "3.9.1", - "@tsparticles/updater-life": "3.9.1", - "@tsparticles/updater-rotate": "3.9.1", - "@tsparticles/updater-stroke-color": "3.9.1" + "@tsparticles/basic": "4.0.0-alpha.0", + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/interaction-external-attract": "4.0.0-alpha.0", + "@tsparticles/interaction-external-bounce": "4.0.0-alpha.0", + "@tsparticles/interaction-external-bubble": "4.0.0-alpha.0", + "@tsparticles/interaction-external-connect": "4.0.0-alpha.0", + "@tsparticles/interaction-external-grab": "4.0.0-alpha.0", + "@tsparticles/interaction-external-pause": "4.0.0-alpha.0", + "@tsparticles/interaction-external-push": "4.0.0-alpha.0", + "@tsparticles/interaction-external-remove": "4.0.0-alpha.0", + "@tsparticles/interaction-external-repulse": "4.0.0-alpha.0", + "@tsparticles/interaction-external-slow": "4.0.0-alpha.0", + "@tsparticles/interaction-particles-attract": "4.0.0-alpha.0", + "@tsparticles/interaction-particles-collisions": "4.0.0-alpha.0", + "@tsparticles/interaction-particles-links": "4.0.0-alpha.0", + "@tsparticles/move-parallax": "4.0.0-alpha.0", + "@tsparticles/plugin-easing-quad": "4.0.0-alpha.0", + "@tsparticles/shape-emoji": "4.0.0-alpha.0", + "@tsparticles/shape-image": "4.0.0-alpha.0", + "@tsparticles/shape-line": "4.0.0-alpha.0", + "@tsparticles/shape-polygon": "4.0.0-alpha.0", + "@tsparticles/shape-square": "4.0.0-alpha.0", + "@tsparticles/shape-star": "4.0.0-alpha.0", + "@tsparticles/updater-life": "4.0.0-alpha.0", + "@tsparticles/updater-rotate": "4.0.0-alpha.0", + "@tsparticles/updater-stroke-color": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/bundles/slim/package.json b/bundles/slim/package.json index e1e50eadc6e..0f2968d6984 100644 --- a/bundles/slim/package.json +++ b/bundles/slim/package.json @@ -1,142 +1,143 @@ { - "name": "@tsparticles/slim", - "version": "3.9.1", - "description": "Easily create highly customizable particle 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.", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/slim", + "version": "4.0.0-alpha.0", + "description": "Easily create highly customizable particle 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.", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "bundles/slim" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "bundles/slim" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/basic": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/interaction-external-attract": "workspace:3.9.1", - "@tsparticles/interaction-external-bounce": "workspace:3.9.1", - "@tsparticles/interaction-external-bubble": "workspace:3.9.1", - "@tsparticles/interaction-external-connect": "workspace:3.9.1", - "@tsparticles/interaction-external-grab": "workspace:3.9.1", - "@tsparticles/interaction-external-pause": "workspace:3.9.1", - "@tsparticles/interaction-external-push": "workspace:3.9.1", - "@tsparticles/interaction-external-remove": "workspace:3.9.1", - "@tsparticles/interaction-external-repulse": "workspace:3.9.1", - "@tsparticles/interaction-external-slow": "workspace:3.9.1", - "@tsparticles/interaction-particles-attract": "workspace:3.9.1", - "@tsparticles/interaction-particles-collisions": "workspace:3.9.1", - "@tsparticles/interaction-particles-links": "workspace:3.9.1", - "@tsparticles/move-parallax": "workspace:3.9.1", - "@tsparticles/plugin-easing-quad": "workspace:3.9.1", - "@tsparticles/shape-emoji": "workspace:3.9.1", - "@tsparticles/shape-image": "workspace:3.9.1", - "@tsparticles/shape-line": "workspace:3.9.1", - "@tsparticles/shape-polygon": "workspace:3.9.1", - "@tsparticles/shape-square": "workspace:3.9.1", - "@tsparticles/shape-star": "workspace:3.9.1", - "@tsparticles/updater-life": "workspace:3.9.1", - "@tsparticles/updater-rotate": "workspace:3.9.1", - "@tsparticles/updater-stroke-color": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/basic": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-attract": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-bounce": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-bubble": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-connect": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-grab": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-pause": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-push": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-remove": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-repulse": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-slow": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-attract": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-collisions": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-links": "workspace:4.0.0-alpha.0", + "@tsparticles/move-parallax": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-quad": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-emoji": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-image": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-line": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-square": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-star": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-life": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-rotate": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-stroke-color": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/bundles/slim/src/bundle.ts b/bundles/slim/src/bundle.ts index 62b6241c491..72d4145e580 100644 --- a/bundles/slim/src/bundle.ts +++ b/bundles/slim/src/bundle.ts @@ -1,4 +1,4 @@ -import { loadSlim } from "."; +import { loadSlim } from "./index.js"; export { loadSlim }; diff --git a/bundles/slim/src/index.ts b/bundles/slim/src/index.ts index d1f0737d4df..964a2cb1f34 100644 --- a/bundles/slim/src/index.ts +++ b/bundles/slim/src/index.ts @@ -1,29 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { loadBasic } from "@tsparticles/basic"; -import { loadEasingQuadPlugin } from "@tsparticles/plugin-easing-quad"; -import { loadEmojiShape } from "@tsparticles/shape-emoji"; -import { loadExternalAttractInteraction } from "@tsparticles/interaction-external-attract"; -import { loadExternalBounceInteraction } from "@tsparticles/interaction-external-bounce"; -import { loadExternalBubbleInteraction } from "@tsparticles/interaction-external-bubble"; -import { loadExternalConnectInteraction } from "@tsparticles/interaction-external-connect"; -import { loadExternalGrabInteraction } from "@tsparticles/interaction-external-grab"; -import { loadExternalPauseInteraction } from "@tsparticles/interaction-external-pause"; -import { loadExternalPushInteraction } from "@tsparticles/interaction-external-push"; -import { loadExternalRemoveInteraction } from "@tsparticles/interaction-external-remove"; -import { loadExternalRepulseInteraction } from "@tsparticles/interaction-external-repulse"; -import { loadExternalSlowInteraction } from "@tsparticles/interaction-external-slow"; -import { loadImageShape } from "@tsparticles/shape-image"; -import { loadLifeUpdater } from "@tsparticles/updater-life"; -import { loadLineShape } from "@tsparticles/shape-line"; -import { loadParallaxMover } from "@tsparticles/move-parallax"; -import { loadParticlesAttractInteraction } from "@tsparticles/interaction-particles-attract"; -import { loadParticlesCollisionsInteraction } from "@tsparticles/interaction-particles-collisions"; -import { loadParticlesLinksInteraction } from "@tsparticles/interaction-particles-links"; -import { loadPolygonShape } from "@tsparticles/shape-polygon"; -import { loadRotateUpdater } from "@tsparticles/updater-rotate"; -import { loadSquareShape } from "@tsparticles/shape-square"; -import { loadStarShape } from "@tsparticles/shape-star"; -import { loadStrokeColorUpdater } from "@tsparticles/updater-stroke-color"; declare const __VERSION__: string; @@ -34,40 +9,67 @@ declare const __VERSION__: string; * If this function is not called, the \@tsparticles/slim package/dependency can be safely removed. * This function is called automatically using CDN bundle files. * @param engine - the engine to use for loading all plugins - * @param refresh - */ -export async function loadSlim(engine: Engine, refresh = true): Promise { +export function loadSlim(engine: Engine): void { engine.checkVersion(__VERSION__); - await loadParallaxMover(engine, false); + engine.register(async e => { + const { loadParallaxMover } = await import("@tsparticles/move-parallax"), + { loadExternalAttractInteraction } = await import("@tsparticles/interaction-external-attract"), + { loadExternalBounceInteraction } = await import("@tsparticles/interaction-external-bounce"), + { loadExternalBubbleInteraction } = await import("@tsparticles/interaction-external-bubble"), + { loadExternalConnectInteraction } = await import("@tsparticles/interaction-external-connect"), + { loadExternalGrabInteraction } = await import("@tsparticles/interaction-external-grab"), + { loadExternalPauseInteraction } = await import("@tsparticles/interaction-external-pause"), + { loadExternalPushInteraction } = await import("@tsparticles/interaction-external-push"), + { loadExternalRemoveInteraction } = await import("@tsparticles/interaction-external-remove"), + { loadExternalRepulseInteraction } = await import("@tsparticles/interaction-external-repulse"), + { loadExternalSlowInteraction } = await import("@tsparticles/interaction-external-slow"), + { loadParticlesAttractInteraction } = await import("@tsparticles/interaction-particles-attract"), + { loadParticlesCollisionsInteraction } = await import("@tsparticles/interaction-particles-collisions"), + { loadParticlesLinksInteraction } = await import("@tsparticles/interaction-particles-links"), + { loadEasingQuadPlugin } = await import("@tsparticles/plugin-easing-quad"), + { loadEmojiShape } = await import("@tsparticles/shape-emoji"), + { loadImageShape } = await import("@tsparticles/shape-image"), + { loadLineShape } = await import("@tsparticles/shape-line"), + { loadPolygonShape } = await import("@tsparticles/shape-polygon"), + { loadSquareShape } = await import("@tsparticles/shape-square"), + { loadStarShape } = await import("@tsparticles/shape-star"), + { loadLifeUpdater } = await import("@tsparticles/updater-life"), + { loadRotateUpdater } = await import("@tsparticles/updater-rotate"), + { loadStrokeColorUpdater } = await import("@tsparticles/updater-stroke-color"), + { loadBasic } = await import("@tsparticles/basic"); - await loadExternalAttractInteraction(engine, false); - await loadExternalBounceInteraction(engine, false); - await loadExternalBubbleInteraction(engine, false); - await loadExternalConnectInteraction(engine, false); - await loadExternalGrabInteraction(engine, false); - await loadExternalPauseInteraction(engine, false); - await loadExternalPushInteraction(engine, false); - await loadExternalRemoveInteraction(engine, false); - await loadExternalRepulseInteraction(engine, false); - await loadExternalSlowInteraction(engine, false); + loadParallaxMover(e); - await loadParticlesAttractInteraction(engine, false); - await loadParticlesCollisionsInteraction(engine, false); - await loadParticlesLinksInteraction(engine, false); + loadExternalAttractInteraction(e); + loadExternalBounceInteraction(e); + loadExternalBubbleInteraction(e); + loadExternalConnectInteraction(e); + loadExternalGrabInteraction(e); + loadExternalPauseInteraction(e); + loadExternalPushInteraction(e); + loadExternalRemoveInteraction(e); + loadExternalRepulseInteraction(e); + loadExternalSlowInteraction(e); - await loadEasingQuadPlugin(engine, false); + loadParticlesAttractInteraction(e); + loadParticlesCollisionsInteraction(e); + loadParticlesLinksInteraction(e); - await loadEmojiShape(engine, false); - await loadImageShape(engine, false); - await loadLineShape(engine, false); - await loadPolygonShape(engine, false); - await loadSquareShape(engine, false); - await loadStarShape(engine, false); + loadEasingQuadPlugin(e); - await loadLifeUpdater(engine, false); - await loadRotateUpdater(engine, false); - await loadStrokeColorUpdater(engine, false); + loadEmojiShape(e); + loadImageShape(e); + loadLineShape(e); + loadPolygonShape(e); + loadSquareShape(e); + loadStarShape(e); - await loadBasic(engine, refresh); + loadLifeUpdater(e); + loadRotateUpdater(e); + loadStrokeColorUpdater(e); + + loadBasic(engine); + }); } diff --git a/bundles/slim/webpack.config.js b/bundles/slim/webpack.config.js index a275a08a352..4dcd423dc37 100644 --- a/bundles/slim/webpack.config.js +++ b/bundles/slim/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "slim", bundleName: "Slim", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "slim", bundleName: "Slim", version, dir: __dirname }); diff --git a/demo/electron/CHANGELOG.md b/demo/electron/CHANGELOG.md index 1d3056aafd6..32d7d67f9aa 100644 --- a/demo/electron/CHANGELOG.md +++ b/demo/electron/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/electron-demo + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/electron-demo diff --git a/demo/electron/package.json b/demo/electron/package.json index f633275baf8..dbee83a6be9 100644 --- a/demo/electron/package.json +++ b/demo/electron/package.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/electron-demo", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "", "main": "app/index.js", "private": true, @@ -14,11 +14,12 @@ "author": "Matteo Bruni ", "license": "MIT", "dependencies": { - "@tsparticles/configs": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1", - "tsparticles": "workspace:3.9.1" + "@tsparticles/configs": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "tsparticles": "workspace:4.0.0-alpha.0" }, "devDependencies": { - "electron": "^35.0.0" - } + "electron": "^39.2.7" + }, + "type": "module" } diff --git a/demo/electron/webpack.config.js b/demo/electron/webpack.config.js index 6aa436ab8ce..cbb97b8eae0 100644 --- a/demo/electron/webpack.config.js +++ b/demo/electron/webpack.config.js @@ -1,6 +1,6 @@ -const path = require('path'); +import path from "path"; -module.exports = { +export default { entry: './client/client.js', output: { path: path.resolve(__dirname, 'client', 'dist'), diff --git a/demo/vanilla/CHANGELOG.md b/demo/vanilla/CHANGELOG.md index 6aec5e9d6e4..450d623b51f 100644 --- a/demo/vanilla/CHANGELOG.md +++ b/demo/vanilla/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Bug Fixes + +- fixed issue with the refactoring ([dd1fa73](https://github.com/tsparticles/tsparticles/commit/dd1fa7392ad3146f2ad9277da4dcf632ae0d8c6e)) + +### Features + +- improved fireworks demo configs ([71473ec](https://github.com/tsparticles/tsparticles/commit/71473ecb48e454613d01598709dac303ae017ef9)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/demo diff --git a/demo/vanilla/app.ts b/demo/vanilla/app.ts index d1b78b93f16..9b042a6393c 100644 --- a/demo/vanilla/app.ts +++ b/demo/vanilla/app.ts @@ -1,19 +1,23 @@ +import { SeqTransport } from "@datalust/winston-seq"; import cluster from "node:cluster"; -import express from "express"; //import helmet from "helmet"; -import stylus from "stylus"; -import livereload from "livereload"; import connectLiveReload from "connect-livereload"; +import { dirname } from 'path'; +import dotenv from "dotenv"; +import express from "express"; +import { fileURLToPath } from 'url'; +import livereload from "livereload"; import path from "path"; import os from "os"; -import winston from "winston"; -import { SeqTransport } from "@datalust/winston-seq"; -import dotenv from "dotenv"; //import rateLimit from "express-rate-limit"; +import stylus from "stylus"; +import winston from "winston"; -const app = express(), numCpus = os.cpus().length; +const fileName = fileURLToPath(import.meta.url), + dirName = dirname(fileName), + app = express(), numCpus = os.cpus().length; -dotenv.config({ path: path.join(__dirname, "..", ".env") }); +dotenv.config({ path: path.join(dirName, "..", ".env") }); let seqTransport = undefined; @@ -58,6 +62,7 @@ app.use("/tsparticles-smooth-value-noise", express.static("./node_modules/@tspar app.use("/tsparticles-perlin-noise", express.static("./node_modules/@tsparticles/perlin-noise")); app.use("/tsparticles-simplex-noise", express.static("./node_modules/@tsparticles/simplex-noise")); app.use("/tsparticles-fractal-noise", express.static("./node_modules/@tsparticles/fractal-noise")); +app.use("/tsparticles-noise-field", express.static("./node_modules/@tsparticles/noise-field")); app.use("/tsparticles-all", express.static("./node_modules/@tsparticles/all")); app.use("/tsparticles-basic", express.static("./node_modules/@tsparticles/basic")); app.use("/tsparticles-engine", express.static("./node_modules/@tsparticles/engine")); @@ -124,6 +129,7 @@ app.use("/path-polygon", express.static("./node_modules/@tsparticles/path-polygo app.use("/path-simplex-noise", express.static("./node_modules/@tsparticles/path-simplex-noise")); app.use("/path-svg", express.static("./node_modules/@tsparticles/path-svg")); app.use("/path-zig-zag", express.static("./node_modules/@tsparticles/path-zig-zag")); +app.use("/plugin-background-mask", express.static("./node_modules/@tsparticles/plugin-background-mask")); app.use("/plugin-canvas-mask", express.static("./node_modules/@tsparticles/plugin-canvas-mask")); app.use("/plugin-easing-back", express.static("./node_modules/@tsparticles/plugin-easing-back")); app.use("/plugin-easing-circ", express.static("./node_modules/@tsparticles/plugin-easing-circ")); @@ -145,13 +151,19 @@ app.use("/plugin-export-video", express.static("./node_modules/@tsparticles/plug app.use("/plugin-hex-color", express.static("./node_modules/@tsparticles/plugin-hex-color")); app.use("/plugin-hsl-color", express.static("./node_modules/@tsparticles/plugin-hsl-color")); app.use("/plugin-hsv-color", express.static("./node_modules/@tsparticles/plugin-hsv-color")); +app.use("/plugin-hwb-color", express.static("./node_modules/@tsparticles/plugin-hwb-color")); +app.use("/plugin-lab-color", express.static("./node_modules/@tsparticles/plugin-lab-color")); +app.use("/plugin-lch-color", express.static("./node_modules/@tsparticles/plugin-lch-color")); app.use("/plugin-named-color", express.static("./node_modules/@tsparticles/plugin-named-color")); +app.use("/plugin-oklab-color", express.static("./node_modules/@tsparticles/plugin-oklab-color")); app.use("/plugin-oklch-color", express.static("./node_modules/@tsparticles/plugin-oklch-color")); app.use("/plugin-rgb-color", express.static("./node_modules/@tsparticles/plugin-rgb-color")); app.use("/plugin-infection", express.static("./node_modules/@tsparticles/plugin-infection")); app.use("/plugin-motion", express.static("./node_modules/@tsparticles/plugin-motion")); app.use("/plugin-sounds", express.static("./node_modules/@tsparticles/plugin-sounds")); +app.use("/plugin-trail", express.static("./node_modules/@tsparticles/plugin-trail")); app.use("/effect-bubble", express.static("./node_modules/@tsparticles/effect-bubble")); +app.use("/effect-shadow", express.static("./node_modules/@tsparticles/effect-shadow")); app.use("/effect-trail", express.static("./node_modules/@tsparticles/effect-trail")); app.use("/shape-arrow", express.static("./node_modules/@tsparticles/shape-arrow")); app.use("/shape-cards", express.static("./node_modules/@tsparticles/shape-cards")); diff --git a/demo/vanilla/package.json b/demo/vanilla/package.json index cac2405dc43..35ead9d401a 100644 --- a/demo/vanilla/package.json +++ b/demo/vanilla/package.json @@ -1,7 +1,7 @@ { "name": "@tsparticles/demo", "private": true, - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "> TODO: description", "author": "Matteo Bruni ", "homepage": "https://particles.js.org", @@ -24,136 +24,145 @@ "watch": "concurrently \"npx tsc --watch\" \"nodemon dist/app.js\"" }, "devDependencies": { - "@datalust/winston-seq": "^2.0.0", - "@fortawesome/fontawesome-free": "^6.4.2", + "@datalust/winston-seq": "^3.0.1", + "@fortawesome/fontawesome-free": "^7.1.0", "@types/connect-livereload": "^0.6.3", - "@types/express": "^5.0.0", + "@types/express": "^5.0.6", "@types/livereload": "^0.9.5", - "@types/node": "^22.0.0", - "@types/stylus": "^0.48.41", - "ace-builds": "^1.31.1", - "bootstrap": "^5.3.2", - "concurrently": "^9.0.0", + "@types/node": "^25.0.3", + "@types/stylus": "^0.48.43", + "ace-builds": "^1.43.5", + "bootstrap": "^5.3.8", + "concurrently": "^9.2.1", "connect-livereload": "^0.6.1", - "dotenv": "^16.3.1", - "express": "^4.18.2", - "express-rate-limit": "^7.1.4", - "helmet": "^8.0.0", + "dotenv": "^17.2.3", + "express": "^5.2.1", + "express-rate-limit": "^8.2.1", + "helmet": "^8.1.0", "jquery": "^3.7.1", - "jsoneditor": "^10.0.0", - "livereload": "^0.9.3", + "jsoneditor": "^10.4.2", + "livereload": "^0.10.3", "lodash": "^4.17.21", - "nodemon": "^3.0.1", + "nodemon": "^3.1.11", "pug": "^3.0.2", "stats.ts": "^1.1.0", "stylus": "^0.64.0", - "winston": "^3.11.0" + "winston": "^3.19.0" }, "dependencies": { - "@tsparticles/all": "workspace:3.9.1", - "@tsparticles/basic": "workspace:3.9.1", - "@tsparticles/confetti": "workspace:3.9.1", - "@tsparticles/configs": "workspace:3.9.1", - "@tsparticles/effect-bubble": "workspace:3.9.1", - "@tsparticles/effect-trail": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/fireworks": "workspace:3.9.1", - "@tsparticles/fractal-noise": "workspace:3.9.1", - "@tsparticles/interaction-external-attract": "workspace:3.9.1", - "@tsparticles/interaction-external-bounce": "workspace:3.9.1", - "@tsparticles/interaction-external-bubble": "workspace:3.9.1", - "@tsparticles/interaction-external-connect": "workspace:3.9.1", - "@tsparticles/interaction-external-grab": "workspace:3.9.1", - "@tsparticles/interaction-external-particle": "workspace:3.9.1", - "@tsparticles/interaction-external-pause": "workspace:3.9.1", - "@tsparticles/interaction-external-pop": "workspace:3.9.1", - "@tsparticles/interaction-external-push": "workspace:3.9.1", - "@tsparticles/interaction-external-remove": "workspace:3.9.1", - "@tsparticles/interaction-external-repulse": "workspace:3.9.1", - "@tsparticles/interaction-external-slow": "workspace:3.9.1", - "@tsparticles/interaction-external-trail": "workspace:3.9.1", - "@tsparticles/interaction-light": "workspace:3.9.1", - "@tsparticles/interaction-particles-attract": "workspace:3.9.1", - "@tsparticles/interaction-particles-collisions": "workspace:3.9.1", - "@tsparticles/interaction-particles-links": "workspace:3.9.1", - "@tsparticles/interaction-particles-repulse": "workspace:3.9.1", - "@tsparticles/move-base": "workspace:3.9.1", - "@tsparticles/move-parallax": "workspace:3.9.1", - "@tsparticles/path-curl-noise": "workspace:3.9.1", - "@tsparticles/path-curves": "workspace:3.9.1", - "@tsparticles/path-fractal-noise": "workspace:3.9.1", - "@tsparticles/path-perlin-noise": "workspace:3.9.1", - "@tsparticles/path-polygon": "workspace:3.9.1", - "@tsparticles/path-simplex-noise": "workspace:3.9.1", - "@tsparticles/path-svg": "workspace:3.9.1", - "@tsparticles/path-zig-zag": "workspace:3.9.1", - "@tsparticles/perlin-noise": "workspace:3.9.1", - "@tsparticles/pjs": "workspace:3.9.1", - "@tsparticles/plugin-absorbers": "workspace:3.9.1", - "@tsparticles/plugin-canvas-mask": "workspace:3.9.1", - "@tsparticles/plugin-easing-back": "workspace:3.9.1", - "@tsparticles/plugin-easing-circ": "workspace:3.9.1", - "@tsparticles/plugin-easing-cubic": "workspace:3.9.1", - "@tsparticles/plugin-easing-expo": "workspace:3.9.1", - "@tsparticles/plugin-easing-linear": "workspace:3.9.1", - "@tsparticles/plugin-easing-quad": "workspace:3.9.1", - "@tsparticles/plugin-easing-quart": "workspace:3.9.1", - "@tsparticles/plugin-easing-quint": "workspace:3.9.1", - "@tsparticles/plugin-easing-sine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-canvas": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-circle": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-path": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-polygon": "workspace:3.9.1", - "@tsparticles/plugin-emitters-shape-square": "workspace:3.9.1", - "@tsparticles/plugin-export-image": "workspace:3.9.1", - "@tsparticles/plugin-export-json": "workspace:3.9.1", - "@tsparticles/plugin-export-video": "workspace:3.9.1", - "@tsparticles/plugin-hex-color": "workspace:3.9.1", - "@tsparticles/plugin-hsl-color": "workspace:3.9.1", - "@tsparticles/plugin-hsv-color": "workspace:3.9.1", - "@tsparticles/plugin-infection": "workspace:3.9.1", - "@tsparticles/plugin-motion": "workspace:3.9.1", - "@tsparticles/plugin-named-color": "workspace:3.9.1", - "@tsparticles/plugin-oklch-color": "workspace:3.9.1", - "@tsparticles/plugin-poisson-disc": "workspace:3.9.1", - "@tsparticles/plugin-polygon-mask": "workspace:3.9.1", - "@tsparticles/plugin-rgb-color": "workspace:3.9.1", - "@tsparticles/plugin-sounds": "workspace:3.9.1", - "@tsparticles/shape-arrow": "workspace:3.9.1", - "@tsparticles/shape-cards": "workspace:3.9.1", - "@tsparticles/shape-circle": "workspace:3.9.1", - "@tsparticles/shape-cog": "workspace:3.9.1", - "@tsparticles/shape-emoji": "workspace:3.9.1", - "@tsparticles/shape-heart": "workspace:3.9.1", - "@tsparticles/shape-image": "workspace:3.9.1", - "@tsparticles/shape-infinity": "workspace:3.9.1", - "@tsparticles/shape-line": "workspace:3.9.1", - "@tsparticles/shape-path": "workspace:3.9.1", - "@tsparticles/shape-polygon": "workspace:3.9.1", - "@tsparticles/shape-rounded-polygon": "workspace:3.9.1", - "@tsparticles/shape-rounded-rect": "workspace:3.9.1", - "@tsparticles/shape-spiral": "workspace:3.9.1", - "@tsparticles/shape-square": "workspace:3.9.1", - "@tsparticles/shape-star": "workspace:3.9.1", - "@tsparticles/shape-text": "workspace:3.9.1", - "@tsparticles/simplex-noise": "workspace:3.9.1", - "@tsparticles/slim": "workspace:3.9.1", - "@tsparticles/smooth-value-noise": "workspace:3.9.1", - "@tsparticles/updater-color": "workspace:3.9.1", - "@tsparticles/updater-destroy": "workspace:3.9.1", - "@tsparticles/updater-gradient": "workspace:3.9.1", - "@tsparticles/updater-life": "workspace:3.9.1", - "@tsparticles/updater-opacity": "workspace:3.9.1", - "@tsparticles/updater-orbit": "workspace:3.9.1", - "@tsparticles/updater-out-modes": "workspace:3.9.1", - "@tsparticles/updater-roll": "workspace:3.9.1", - "@tsparticles/updater-rotate": "workspace:3.9.1", - "@tsparticles/updater-size": "workspace:3.9.1", - "@tsparticles/updater-stroke-color": "workspace:3.9.1", - "@tsparticles/updater-tilt": "workspace:3.9.1", - "@tsparticles/updater-twinkle": "workspace:3.9.1", - "@tsparticles/updater-wobble": "workspace:3.9.1", - "tsparticles": "workspace:3.9.1" - } + "@tsparticles/all": "workspace:4.0.0-alpha.0", + "@tsparticles/basic": "workspace:4.0.0-alpha.0", + "@tsparticles/confetti": "workspace:4.0.0-alpha.0", + "@tsparticles/configs": "workspace:4.0.0-alpha.0", + "@tsparticles/effect-bubble": "workspace:4.0.0-alpha.0", + "@tsparticles/effect-shadow": "workspace:4.0.0-alpha.0", + "@tsparticles/effect-trail": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/fireworks": "workspace:4.0.0-alpha.0", + "@tsparticles/fractal-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-attract": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-bounce": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-bubble": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-connect": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-grab": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-particle": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-pause": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-pop": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-push": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-remove": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-repulse": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-slow": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-external-trail": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-light": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-attract": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-collisions": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-links": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-repulse": "workspace:4.0.0-alpha.0", + "@tsparticles/move-base": "workspace:4.0.0-alpha.0", + "@tsparticles/move-parallax": "workspace:4.0.0-alpha.0", + "@tsparticles/noise-field": "workspace:4.0.0-alpha.0", + "@tsparticles/path-curl-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-curves": "workspace:4.0.0-alpha.0", + "@tsparticles/path-fractal-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-perlin-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/path-simplex-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-svg": "workspace:4.0.0-alpha.0", + "@tsparticles/path-zig-zag": "workspace:4.0.0-alpha.0", + "@tsparticles/perlin-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/pjs": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-absorbers": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-background-mask": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-canvas-mask": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-back": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-circ": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-cubic": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-expo": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-linear": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-quad": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-quart": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-quint": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-easing-sine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-canvas": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-circle": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-path": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters-shape-square": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-export-image": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-export-json": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-export-video": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hex-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hsl-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hsv-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hwb-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-infection": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-lab-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-lch-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-motion": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-named-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-oklab-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-oklch-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-poisson-disc": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-polygon-mask": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-rgb-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-sounds": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-trail": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-arrow": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-cards": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-circle": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-cog": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-emoji": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-heart": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-image": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-infinity": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-line": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-path": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-rounded-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-rounded-rect": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-spiral": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-square": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-star": "workspace:4.0.0-alpha.0", + "@tsparticles/shape-text": "workspace:4.0.0-alpha.0", + "@tsparticles/simplex-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/slim": "workspace:4.0.0-alpha.0", + "@tsparticles/smooth-value-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-color": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-destroy": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-gradient": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-life": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-opacity": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-orbit": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-out-modes": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-roll": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-rotate": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-size": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-stroke-color": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-tilt": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-twinkle": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-wobble": "workspace:4.0.0-alpha.0", + "tsparticles": "workspace:4.0.0-alpha.0" + }, + "type": "module" } diff --git a/demo/vanilla/public/javascripts/demo.js b/demo/vanilla/public/javascripts/demo.js index 36d14bde691..22ea801d1c6 100644 --- a/demo/vanilla/public/javascripts/demo.js +++ b/demo/vanilla/public/javascripts/demo.js @@ -147,10 +147,10 @@ sidebar.setAttribute("hidden", ""); } - tsParticles.domItem(0).refresh(); + tsParticles.item(0).refresh(); }; - window.addEventListener("load", async () => { + document.addEventListener("DOMContentLoaded", async () => { await initParticles(tsParticles); for (const presetId in tsParticles.configs) { diff --git a/demo/vanilla/tsconfig.json b/demo/vanilla/tsconfig.json index 6bc9e208412..91d16e271b7 100644 --- a/demo/vanilla/tsconfig.json +++ b/demo/vanilla/tsconfig.json @@ -11,7 +11,7 @@ // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ /* Language and Environment */ - "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ + "target": "es2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ // "jsx": "preserve", /* Specify what JSX code is generated. */ // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ @@ -25,9 +25,9 @@ // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ + "module": "node16", /* Specify what module code is generated. */ // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ + "moduleResolution": "node16", /* Specify how TypeScript looks up a file from a given module specifier. */ // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ diff --git a/demo/vanilla/views/confetti.pug b/demo/vanilla/views/confetti.pug index 914545697e2..24e464d6f5a 100644 --- a/demo/vanilla/views/confetti.pug +++ b/demo/vanilla/views/confetti.pug @@ -21,5 +21,5 @@ html(lang="en") body(style="background-color: #000;") canvas#confetti - script(src="/tsparticles-confetti/tsparticles.confetti.bundle.js") + script(src="/tsparticles-confetti/tsparticles.confetti.bundle.min.js") script(src="/javascripts/confetti.js") diff --git a/demo/vanilla/views/index.pug b/demo/vanilla/views/index.pug index cae2f98c663..0486ada42bc 100644 --- a/demo/vanilla/views/index.pug +++ b/demo/vanilla/views/index.pug @@ -116,6 +116,7 @@ html(lang="en") script(src="/tsparticles-simplex-noise/tsparticles.simplex.noise.min.js") script(src="/tsparticles-fractal-noise/tsparticles.fractal.noise.min.js") script(src="/tsparticles-engine/tsparticles.engine.min.js") + script(src="/tsparticles-noise-field/tsparticles.noise.field.min.js") script(src="/tsparticles-configs/tsparticles.configs.min.js") script(src="/tsparticles-basic/tsparticles.basic.min.js") script(src="/tsparticles-pjs/tsparticles.pjs.min.js") @@ -167,6 +168,7 @@ html(lang="en") script(src="/interaction-particles-repulse/tsparticles.interaction.particles.repulse.min.js") script(src="/updater-gradient/tsparticles.updater.gradient.min.js") script(src="/updater-orbit/tsparticles.updater.orbit.min.js") + script(src="/plugin-background-mask/tsparticles.plugin.background-mask.min.js") script(src="/plugin-canvas-mask/tsparticles.plugin.canvas-mask.min.js") script(src="/plugin-easing-back/tsparticles.plugin.easing.back.min.js") script(src="/plugin-easing-circ/tsparticles.plugin.easing.circ.min.js") @@ -188,13 +190,19 @@ html(lang="en") script(src="/plugin-hex-color/tsparticles.plugin.hexColor.min.js") script(src="/plugin-hsl-color/tsparticles.plugin.hslColor.min.js") script(src="/plugin-hsv-color/tsparticles.plugin.hsvColor.min.js") + script(src="/plugin-hwb-color/tsparticles.plugin.hwbColor.min.js") + script(src="/plugin-lab-color/tsparticles.plugin.labColor.min.js") + script(src="/plugin-lch-color/tsparticles.plugin.lchColor.min.js") script(src="/plugin-named-color/tsparticles.plugin.namedColor.min.js") + script(src="/plugin-oklab-color/tsparticles.plugin.oklabColor.min.js") script(src="/plugin-oklch-color/tsparticles.plugin.oklchColor.min.js") script(src="/plugin-rgb-color/tsparticles.plugin.rgbColor.min.js") script(src="/plugin-infection/tsparticles.plugin.infection.min.js") script(src="/plugin-motion/tsparticles.plugin.motion.min.js") script(src="/plugin-sounds/tsparticles.plugin.sounds.min.js") + script(src="/plugin-trail/tsparticles.plugin.trail.min.js") script(src="/effect-bubble/tsparticles.effect.bubble.min.js") + script(src="/effect-shadow/tsparticles.effect.shadow.min.js") script(src="/effect-trail/tsparticles.effect.trail.min.js") script(src="/shape-arrow/tsparticles.shape.arrow.min.js") script(src="/shape-cards/tsparticles.shape.cards.min.js") diff --git a/demo/vanilla_new/CHANGELOG.md b/demo/vanilla_new/CHANGELOG.md index aeb3280e1bd..d4ac023e70a 100644 --- a/demo/vanilla_new/CHANGELOG.md +++ b/demo/vanilla_new/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/demo-new + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/demo-new diff --git a/demo/vanilla_new/package.json b/demo/vanilla_new/package.json index 487fe99525e..375ff448288 100644 --- a/demo/vanilla_new/package.json +++ b/demo/vanilla_new/package.json @@ -1,7 +1,7 @@ { "name": "@tsparticles/demo-new", "private": true, - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles Demo Website", "main": "index.html", "scripts": { @@ -34,22 +34,23 @@ }, "homepage": "https://particles.js.org", "devDependencies": { - "fs-extra": "^11.1.1", - "minify": "^13.0.0", - "sass": "^1.69.5" + "fs-extra": "^11.3.3", + "minify": "^15.0.0", + "sass": "^1.97.1" }, "dependencies": { - "@tsparticles/configs": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/interaction-light": "workspace:3.9.1", - "@tsparticles/interaction-particles-repulse": "workspace:3.9.1", - "@tsparticles/path-curves": "workspace:3.9.1", - "@tsparticles/path-perlin-noise": "workspace:3.9.1", - "@tsparticles/path-polygon": "workspace:3.9.1", - "@tsparticles/path-simplex-noise": "workspace:3.9.1", - "@tsparticles/plugin-infection": "workspace:3.9.1", - "@tsparticles/updater-gradient": "workspace:3.9.1", - "@tsparticles/updater-orbit": "workspace:3.9.1", - "tsparticles": "workspace:3.9.1" - } + "@tsparticles/configs": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-light": "workspace:4.0.0-alpha.0", + "@tsparticles/interaction-particles-repulse": "workspace:4.0.0-alpha.0", + "@tsparticles/path-curves": "workspace:4.0.0-alpha.0", + "@tsparticles/path-perlin-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/path-polygon": "workspace:4.0.0-alpha.0", + "@tsparticles/path-simplex-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-infection": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-gradient": "workspace:4.0.0-alpha.0", + "@tsparticles/updater-orbit": "workspace:4.0.0-alpha.0", + "tsparticles": "workspace:4.0.0-alpha.0" + }, + "type": "module" } diff --git a/demo/vite/CHANGELOG.md b/demo/vite/CHANGELOG.md index eb821173c17..8ee33cb8946 100644 --- a/demo/vite/CHANGELOG.md +++ b/demo/vite/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/vite-demo + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/vite-demo diff --git a/demo/vite/package.json b/demo/vite/package.json index 2024fcb0f72..befd0fcf693 100644 --- a/demo/vite/package.json +++ b/demo/vite/package.json @@ -1,7 +1,7 @@ { "name": "@tsparticles/vite-demo", "private": true, - "version": "3.9.1", + "version": "4.0.0-alpha.0", "type": "module", "scripts": { "dev": "vite", @@ -9,12 +9,12 @@ "preview": "vite preview" }, "dependencies": { - "@tsparticles/all": "workspace:3.9.1", - "@tsparticles/configs": "workspace:3.9.1", - "@tsparticles/engine": "workspace:3.9.1" + "@tsparticles/all": "workspace:4.0.0-alpha.0", + "@tsparticles/configs": "workspace:4.0.0-alpha.0", + "@tsparticles/engine": "workspace:4.0.0-alpha.0" }, "devDependencies": { - "typescript": "^5.3.3", - "vite": "^6.0.0" + "typescript": "^5.9.3", + "vite": "^7.3.0" } } diff --git a/effects/bubble/.eslintignore b/effects/bubble/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/effects/bubble/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/effects/bubble/.eslintrc.js b/effects/bubble/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/effects/bubble/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/effects/bubble/CHANGELOG.md b/effects/bubble/CHANGELOG.md index 6266b534d04..2748a5396c6 100644 --- a/effects/bubble/CHANGELOG.md +++ b/effects/bubble/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/effect-bubble + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/effect-bubble diff --git a/effects/bubble/eslint.config.js b/effects/bubble/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/effects/bubble/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/effects/bubble/package.dist.json b/effects/bubble/package.dist.json index 5aea94b3c82..a903d796335 100644 --- a/effects/bubble/package.dist.json +++ b/effects/bubble/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/effect-bubble", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles bubble effect", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/effects/bubble/package.json b/effects/bubble/package.json index ed51df71c33..880d932741f 100644 --- a/effects/bubble/package.json +++ b/effects/bubble/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/effect-bubble", - "version": "3.9.1", - "description": "tsParticles bubble effect", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/effect-bubble", + "version": "4.0.0-alpha.0", + "description": "tsParticles bubble effect", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "effects/bubble" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-effect" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "effects/bubble" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-effect" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/effects/bubble/src/BubbleDrawer.ts b/effects/bubble/src/BubbleDrawer.ts index e4cd2de8d84..ff923c71328 100644 --- a/effects/bubble/src/BubbleDrawer.ts +++ b/effects/bubble/src/BubbleDrawer.ts @@ -3,7 +3,7 @@ import { type IEffectDrawer, type IShapeDrawData, defaultAngle, doublePI } from const bubbleFactor = 3; export class BubbleDrawer implements IEffectDrawer { - draw(data: IShapeDrawData): void { + drawAfter(data: IShapeDrawData): void { const { context, radius } = data, bubbleRadius = radius / bubbleFactor; diff --git a/effects/bubble/src/index.ts b/effects/bubble/src/index.ts index 7aedbf017a9..78d0f7de2c1 100644 --- a/effects/bubble/src/index.ts +++ b/effects/bubble/src/index.ts @@ -1,14 +1,16 @@ -import { BubbleDrawer } from "./BubbleDrawer.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadBubbleEffect(engine: Engine, refresh = true): Promise { +export function loadBubbleEffect(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEffect("bubble", new BubbleDrawer(), refresh); + engine.register(async e => { + const { BubbleDrawer } = await import("./BubbleDrawer.js"); + + e.addEffect("bubble", new BubbleDrawer()); + }); } diff --git a/effects/bubble/typedoc.json b/effects/bubble/typedoc.json index 6f052d2040d..4d32e45b8b1 100644 --- a/effects/bubble/typedoc.json +++ b/effects/bubble/typedoc.json @@ -4,7 +4,7 @@ "./src/" ], "entryPointStrategy": "expand", - "name": "tsParticles Bubble Shape", + "name": "tsParticles Bubble Effect", "includeVersion": true, "hideGenerator": true, "out": "./docs", diff --git a/effects/bubble/webpack.config.js b/effects/bubble/webpack.config.js index 25b6f981bd9..41756af36b5 100644 --- a/effects/bubble/webpack.config.js +++ b/effects/bubble/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesEffect } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesEffect } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesEffect({ moduleName: "bubble", effectName: "Bubble", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesEffect({ moduleName: "bubble", effectName: "Bubble", version, dir: __dirname }); diff --git a/plugins/colors/hexColor/.browserslistrc b/effects/shadow/.browserslistrc similarity index 100% rename from plugins/colors/hexColor/.browserslistrc rename to effects/shadow/.browserslistrc diff --git a/effects/shadow/CHANGELOG.md b/effects/shadow/CHANGELOG.md new file mode 100644 index 00000000000..d4fac19f759 --- /dev/null +++ b/effects/shadow/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) diff --git a/plugins/colors/hexColor/LICENSE b/effects/shadow/LICENSE similarity index 100% rename from plugins/colors/hexColor/LICENSE rename to effects/shadow/LICENSE diff --git a/effects/shadow/README.md b/effects/shadow/README.md new file mode 100644 index 00000000000..c948cd55e3d --- /dev/null +++ b/effects/shadow/README.md @@ -0,0 +1,75 @@ +[![banner](https://particles.js.org/images/banner3.png)](https://particles.js.org) + +# tsParticles Shadow Effect + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/effect-shadow/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/effect-shadow) +[![npmjs](https://badge.fury.io/js/@tsparticles/effect-shadow.svg)](https://www.npmjs.com/package/@tsparticles/effect-shadow) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/effect-shadow)](https://www.npmjs.com/package/@tsparticles/effect-shadow) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) additional shadow effect. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.effect.shadow.min.js` file will export the function to load the effect: + +```text +loadShadowEffect +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the effect like this: + +```javascript +(async () => { + await loadShadowEffect(tsParticles); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + /* here you can use particles.effect.type: "shadow" */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/effect-shadow +``` + +or + +```shell +$ yarn add @tsparticles/effect-shadow +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadShadowEffect } = require("@tsparticles/effect-shadow"); + +(async () => { + await loadShadowEffect(tsParticles); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadShadowEffect } from "@tsparticles/effect-shadow"; + +(async () => { + await loadShadowEffect(tsParticles); +})(); +``` diff --git a/effects/shadow/eslint.config.js b/effects/shadow/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/effects/shadow/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/effects/shadow/package.dist.json b/effects/shadow/package.dist.json new file mode 100644 index 00000000000..a528acc03e1 --- /dev/null +++ b/effects/shadow/package.dist.json @@ -0,0 +1,109 @@ +{ + "name": "@tsparticles/effect-shadow", + "version": "4.0.0-alpha.0", + "description": "tsParticles shadow effect", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "effects/shadow" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-effect" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "sideEffects": false, + "jsdelivr": "tsparticles.effect.shadow.min.js", + "unpkg": "tsparticles.effect.shadow.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module" +} diff --git a/effects/shadow/package.json b/effects/shadow/package.json new file mode 100644 index 00000000000..dee0341e6b9 --- /dev/null +++ b/effects/shadow/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/effect-shadow", + "version": "4.0.0-alpha.0", + "description": "tsParticles shadow effect", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "effects/shadow" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-effect" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/effects/shadow/src/ShadowDrawer.ts b/effects/shadow/src/ShadowDrawer.ts new file mode 100644 index 00000000000..2ed6a7d5c7b --- /dev/null +++ b/effects/shadow/src/ShadowDrawer.ts @@ -0,0 +1,77 @@ +import { + type Container, + type Engine, + type ICoordinates, + type IEffectDrawer, + type IOptionsColor, + type IRgb, + type IShapeDrawData, + type IShapeValues, + OptionsColor, + type Particle, + getStyleFromRgb, + rangeColorToRgb, +} from "@tsparticles/engine"; + +const defaultShadowBlur = 0, + defaultShadowOffsetValue = 0; + +interface IShadowData extends IShapeValues { + blur?: number; + color?: IOptionsColor; + enable?: boolean; + offset?: ICoordinates; +} + +type ShadowParticle = Particle & { + shadowBlur?: number; + shadowColor?: IRgb; + shadowEnabled?: boolean; + shadowOffset?: ICoordinates; +}; + +export class ShadowDrawer implements IEffectDrawer { + private readonly _engine: Engine; + + constructor(engine: Engine) { + this._engine = engine; + } + + drawBefore(data: IShapeDrawData): void { + const { particle, context } = data, + { container } = particle, + shadowParticle = particle as ShadowParticle, + shadowEnabled = shadowParticle.shadowEnabled, + shadowColor = shadowParticle.shadowColor, + shadowOffset = shadowParticle.shadowOffset; + + if (!shadowEnabled || !shadowColor) { + return; + } + + context.shadowBlur = shadowParticle.shadowBlur ?? defaultShadowBlur; + context.shadowColor = getStyleFromRgb(shadowColor, container.hdr); + context.shadowOffsetX = shadowOffset?.x ?? defaultShadowOffsetValue; + context.shadowOffsetY = shadowOffset?.y ?? defaultShadowOffsetValue; + } + + particleInit(_container: Container, particle: ShadowParticle): void { + const effectData = particle.effectData as IShadowData | undefined; + + if (!effectData?.enable) { + particle.shadowBlur = undefined; + particle.shadowColor = undefined; + particle.shadowOffset = undefined; + particle.shadowEnabled = false; + + return; + } + + const shadowColor = OptionsColor.create(new OptionsColor(), effectData.color); + + particle.shadowColor = rangeColorToRgb(this._engine, shadowColor); + particle.shadowBlur = effectData.blur; + particle.shadowOffset = effectData.offset; + particle.shadowEnabled = true; + } +} diff --git a/effects/shadow/src/index.ts b/effects/shadow/src/index.ts new file mode 100644 index 00000000000..bde7b4b655c --- /dev/null +++ b/effects/shadow/src/index.ts @@ -0,0 +1,16 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * @param engine - + */ +export function loadShadowEffect(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { ShadowDrawer } = await import("./ShadowDrawer.js"); + + e.addEffect("shadow", new ShadowDrawer(e)); + }); +} diff --git a/plugins/colors/hexColor/tsconfig.base.json b/effects/shadow/tsconfig.base.json similarity index 100% rename from plugins/colors/hexColor/tsconfig.base.json rename to effects/shadow/tsconfig.base.json diff --git a/plugins/colors/hexColor/tsconfig.browser.json b/effects/shadow/tsconfig.browser.json similarity index 100% rename from plugins/colors/hexColor/tsconfig.browser.json rename to effects/shadow/tsconfig.browser.json diff --git a/plugins/colors/hexColor/tsconfig.json b/effects/shadow/tsconfig.json similarity index 100% rename from plugins/colors/hexColor/tsconfig.json rename to effects/shadow/tsconfig.json diff --git a/plugins/colors/hexColor/tsconfig.module.json b/effects/shadow/tsconfig.module.json similarity index 100% rename from plugins/colors/hexColor/tsconfig.module.json rename to effects/shadow/tsconfig.module.json diff --git a/plugins/colors/hexColor/tsconfig.types.json b/effects/shadow/tsconfig.types.json similarity index 100% rename from plugins/colors/hexColor/tsconfig.types.json rename to effects/shadow/tsconfig.types.json diff --git a/plugins/colors/hexColor/tsconfig.umd.json b/effects/shadow/tsconfig.umd.json similarity index 100% rename from plugins/colors/hexColor/tsconfig.umd.json rename to effects/shadow/tsconfig.umd.json diff --git a/effects/shadow/typedoc.json b/effects/shadow/typedoc.json new file mode 100644 index 00000000000..813656f345d --- /dev/null +++ b/effects/shadow/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles Shadow Effect", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/effects/shadow/webpack.config.js b/effects/shadow/webpack.config.js new file mode 100644 index 00000000000..e53bfe6aa13 --- /dev/null +++ b/effects/shadow/webpack.config.js @@ -0,0 +1,12 @@ +import { loadParticlesEffect } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesEffect({ moduleName: "shadow", effectName: "Shadow", version, dir: __dirname }); diff --git a/effects/trail/.eslintignore b/effects/trail/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/effects/trail/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/effects/trail/.eslintrc.js b/effects/trail/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/effects/trail/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/effects/trail/CHANGELOG.md b/effects/trail/CHANGELOG.md index d649021dceb..2da017c0583 100644 --- a/effects/trail/CHANGELOG.md +++ b/effects/trail/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/effect-trail + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/effect-trail diff --git a/effects/trail/eslint.config.js b/effects/trail/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/effects/trail/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/effects/trail/package.dist.json b/effects/trail/package.dist.json index 0ab52c4ece8..94a10af3c71 100644 --- a/effects/trail/package.dist.json +++ b/effects/trail/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/effect-trail", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles trail effect", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/effects/trail/package.json b/effects/trail/package.json index 5209120fb82..e5295f8f014 100644 --- a/effects/trail/package.json +++ b/effects/trail/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/effect-trail", - "version": "3.9.1", - "description": "tsParticles trail effect", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/effect-trail", + "version": "4.0.0-alpha.0", + "description": "tsParticles trail effect", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "effects/trail" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-effect" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "effects/trail" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-effect" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/effects/trail/src/TrailDrawer.ts b/effects/trail/src/TrailDrawer.ts index 5943ab88975..1ca36b71087 100644 --- a/effects/trail/src/TrailDrawer.ts +++ b/effects/trail/src/TrailDrawer.ts @@ -55,7 +55,7 @@ const defaultTransform = { }; export class TrailDrawer implements IEffectDrawer { - draw(data: IShapeDrawData): void { + drawAfter(data: IShapeDrawData): void { const { context, radius, particle, transformData } = data, diameter = radius * double, pxRatio = particle.container.retina.pixelRatio, @@ -69,7 +69,7 @@ export class TrailDrawer implements IEffectDrawer { const pathLength = particle.trailLength + radius; trail.push({ - color: context.fillStyle ?? context.strokeStyle, + color: context.fillStyle || context.strokeStyle, position: { x: currentPos.x, y: currentPos.y, @@ -91,11 +91,22 @@ export class TrailDrawer implements IEffectDrawer { height: particle.container.canvas.size.height + diameter, }; - let lastPos = trail[trailLength - trailLengthOffset].position; + const trailPos = trail[trailLength - trailLengthOffset]; + + if (!trailPos) { + return; + } + + let lastPos = trailPos.position; for (let i = trailLength; i > none; i--) { - const step = trail[i - trailLengthOffset], - position = step.position, + const step = trail[i - trailLengthOffset]; + + if (!step) { + continue; + } + + const position = step.position, stepTransformData = particle.trailTransform ? (step.transformData ?? defaultTransform) : defaultTransform; diff --git a/effects/trail/src/index.ts b/effects/trail/src/index.ts index 255c00274a5..e93b862c262 100644 --- a/effects/trail/src/index.ts +++ b/effects/trail/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { TrailDrawer } from "./TrailDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadTrailEffect(engine: Engine, refresh = true): Promise { +export function loadTrailEffect(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEffect("trail", new TrailDrawer(), refresh); + engine.register(async e => { + const { TrailDrawer } = await import("./TrailDrawer.js"); + + e.addEffect("trail", new TrailDrawer()); + }); } diff --git a/effects/trail/typedoc.json b/effects/trail/typedoc.json index aab48016ab6..51fd239e2d6 100644 --- a/effects/trail/typedoc.json +++ b/effects/trail/typedoc.json @@ -4,7 +4,7 @@ "./src/" ], "entryPointStrategy": "expand", - "name": "tsParticles Trail Shape", + "name": "tsParticles Trail Effect", "includeVersion": true, "hideGenerator": true, "out": "./docs", diff --git a/effects/trail/webpack.config.js b/effects/trail/webpack.config.js index 65e86d98159..c2a57d3a106 100644 --- a/effects/trail/webpack.config.js +++ b/effects/trail/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesEffect } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesEffect } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesEffect({ moduleName: "trail", effectName: "Trail", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesEffect({ moduleName: "trail", effectName: "Trail", version, dir: __dirname }); diff --git a/engine/.eslintignore b/engine/.eslintignore deleted file mode 100644 index acacc1bec75..00000000000 --- a/engine/.eslintignore +++ /dev/null @@ -1,12 +0,0 @@ -.circleci -.github -.nyc_output -coverage -demo -dist -docs -node_modules -schema -scripts -typedoc -deploy.docs.js diff --git a/engine/.eslintrc.js b/engine/.eslintrc.js deleted file mode 100644 index 79ffac9e043..00000000000 --- a/engine/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ], -}; diff --git a/engine/CHANGELOG.md b/engine/CHANGELOG.md index 11b6c85a1df..b824a24c978 100644 --- a/engine/CHANGELOG.md +++ b/engine/CHANGELOG.md @@ -3,6 +3,21 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Bug Fixes + +- fix 5524 ([4459f09](https://github.com/tsparticles/tsparticles/commit/4459f09de1393d2f478612e3ff1089cb10f6e76a)) +- fixed issue [#5539](https://github.com/tsparticles/tsparticles/issues/5539), now shapes know when a fill function or a stroke function is needed ([cb616d3](https://github.com/tsparticles/tsparticles/commit/cb616d3d489ba65304d1f1b657d556807674567a)) +- fixed issue with groups and density calculation ([eb2e20a](https://github.com/tsparticles/tsparticles/commit/eb2e20a28ae1a87d02cfbcffd3454a11f73ef2c4)) +- fixed rotation movement when angle was 0 ([6d02bfb](https://github.com/tsparticles/tsparticles/commit/6d02bfb69b03c111d21af7d1727338ba46272829)) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- added hdr option, with fallback if not supported by the screen ([f42dc31](https://github.com/tsparticles/tsparticles/commit/f42dc31b8ba4e82eb04a465ebcf2bf77f041a5e0)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/engine diff --git a/engine/eslint.config.js b/engine/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/engine/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/engine/package.dist.json b/engine/package.dist.json index 5ffb256c038..00246d4d199 100644 --- a/engine/package.dist.json +++ b/engine/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/engine", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "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.", "homepage": "https://particles.js.org", "scripts": { @@ -103,5 +103,6 @@ }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/engine/package.json b/engine/package.json index 4800818c806..6afcd7fd118 100644 --- a/engine/package.json +++ b/engine/package.json @@ -1,120 +1,121 @@ { - "name": "@tsparticles/engine", - "version": "3.9.1", - "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.", - "homepage": "https://particles.js.org", - "scripts": { - "prettify:ci:schema": "prettier --check ./schema/options.schema.json", - "prettify:schema": "prettier --write ./schema/options.schema.json", - "build": "tsparticles-cli build && pnpm run build:schema", - "build:ci": "tsparticles-cli build --ci && pnpm run build:schema", - "build:schema": "echo ts-json-schema-generator --path 'src/**/*.ts' --type 'IOptions' -f tsconfig.schema.json --additional-properties true --out ./schema/options.schema.json", - "version": "tsparticles-cli build -d && git add package.dist.json", - "postversion": "git push && git push --tags", - "prepack": "pnpm run build", - "release:alpha": "pnpm run version --prerelease --preid alpha", - "release:beta": "pnpm run version --prerelease --preid beta" + "name": "@tsparticles/engine", + "version": "4.0.0-alpha.0", + "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.", + "homepage": "https://particles.js.org", + "scripts": { + "prettify:ci:schema": "prettier --check ./schema/options.schema.json", + "prettify:schema": "prettier --write ./schema/options.schema.json", + "build": "tsparticles-cli build && pnpm run build:schema", + "build:ci": "tsparticles-cli build --ci && pnpm run build:schema", + "build:schema": "echo ts-json-schema-generator --path 'src/**/*.ts' --type 'IOptions' -f tsconfig.schema.json --additional-properties true --out ./schema/options.schema.json", + "version": "tsparticles-cli build -d && git add package.dist.json", + "postversion": "git push && git push --tags", + "prepack": "pnpm run build", + "release:alpha": "pnpm run version --prerelease --preid alpha", + "release:beta": "pnpm run version --prerelease --preid beta" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "engine" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "engine" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/engine/scripts/install.js b/engine/scripts/install.js index 5d35b697a4b..d05d8abe176 100644 --- a/engine/scripts/install.js +++ b/engine/scripts/install.js @@ -1,6 +1,11 @@ -const path = require("path"); -const particlesJsFoundError = "particles.js-found"; -const reactParticlesJsFoundError = "react-particles-js-found"; +const path = require("path"), + particlesJsFoundError = "particles.js-found", + reactParticlesJsFoundError = "react-particles-js-found", + reactParticlesFoundError = "react-particles-found", + reactTsParticlesFoundError = "react-tsparticles-found", + angularParticlesFoundError = "ng-particles-found", + vue2ParticlesFoundError = "vue2-particles-found", + vue3ParticlesFoundError = "vue3-particles-found"; try { console.log("Thank you for installing tsParticles."); @@ -55,20 +60,62 @@ try { throw new Error(reactParticlesJsFoundError); } + if (dependencies["react-tsparticles"]) { + console.error( + "\x1b[31m%s\x1b[0m", + "The package react-tsparticles has been deprecated and is not supported anymore." + ); + console.error("\x1b[31m%s\x1b[0m", "Please consider switching to @tsparticles/react package."); + console.error( + "\x1b[31m%s\x1b[0m", + "This error will be fixed once react-tsparticles is removed from the package.json file." + ); + + throw new Error(reactTsParticlesFoundError); + } + + if (dependencies["react-particles"]) { + console.error( + "\x1b[31m%s\x1b[0m", + "The package react-particles has been deprecated and is not supported anymore." + ); + console.error("\x1b[31m%s\x1b[0m", "Please consider switching to @tsparticles/react package."); + console.error( + "\x1b[31m%s\x1b[0m", + "This error will be fixed once react-particles is removed from the package.json file." + ); + + throw new Error(reactParticlesFoundError); + } + if (dependencies["react"] || dependencies["next"]) { - if (!dependencies["react-particles"]) { + if (!dependencies["@tsparticles/react"]) { console.warn( "\x1b[43m\x1b[30m%s\x1b[0m", "Found React installed. Please download react-particles to use tsParticles with a component ready to use and easier to configure." ); console.log( - "You can read more about the component here: https://github.com/tsparticles/tsparticles/blob/main/components/react/README.md" + "You can read more about the component here: https://github.com/tsparticles/react/#readme" ); } } + if (dependencies["ng-particles"]) { + console.error( + "\x1b[31m%s\x1b[0m", + "The package ng-particles has been deprecated and is not supported anymore." + ); + console.error("\x1b[31m%s\x1b[0m", "Please consider switching to @tsparticles/angular package."); + console.error( + "\x1b[31m%s\x1b[0m", + "This error will be fixed once ng-particles is removed from the package.json file." + ); + + throw new Error(angularParticlesFoundError); + } + if (dependencies["@angular/core"]) { - if (!dependencies["ng-particles"]) { + if (!dependencies["@tsparticles/angular"]) { console.warn( "\x1b[43m\x1b[30m%s\x1b[0m", "Found Angular installed. Please download ng-particles to use tsParticles with a component ready to use and easier to configure." @@ -77,30 +124,57 @@ try { } } - if (dependencies["vue"] || dependencies["nuxt"]) { - const vueVersion = dependencies["vue"]; - const nuxtVersion = dependencies["nuxt"]; + if (dependencies["vue3-particles"]) { + console.error( + "\x1b[31m%s\x1b[0m", + "The package vue3-particles has been deprecated and is not supported anymore." + ); + console.error("\x1b[31m%s\x1b[0m", "Please consider switching to @tsparticles/vue3 package."); + console.error( + "\x1b[31m%s\x1b[0m", + "This error will be fixed once vue3-particles is removed from the package.json file." + ); - const vueMajor = (vueVersion || nuxtVersion).split(".")[0]; + throw new Error(vue3ParticlesFoundError); + } + + if (dependencies["vue2-particles"]) { + console.error( + "\x1b[31m%s\x1b[0m", + "The package vue2-particles has been deprecated and is not supported anymore." + ); + console.error("\x1b[31m%s\x1b[0m", "Please consider switching to @tsparticles/vue2 package."); + console.error( + "\x1b[31m%s\x1b[0m", + "This error will be fixed once vue2-particles is removed from the package.json file." + ); + + throw new Error(vue2ParticlesFoundError); + } + + if (dependencies["vue"] || dependencies["nuxt"]) { + const vueVersion = dependencies["vue"], + nuxtVersion = dependencies["nuxt"], + vueMajor = (vueVersion || nuxtVersion).split(".")[0]; if (vueMajor > 2) { - if (!dependencies["vue3-particles"]) { + if (!dependencies["@tsparticles/vue3"]) { console.warn( "\x1b[43m\x1b[30m%s\x1b[0m", - "Found Vue 3.x installed. Please Download vue3-particles to use tsParticles with a component ready to use and easier to configure." + "Found Vue 3.x installed. Please Download @tsparticles/vue3 to use tsParticles with a component ready to use and easier to configure." ); console.log( - "You can read more about the component here: https://github.com/tsparticles/tsparticles/blob/main/components/vue3/README.md" + "You can read more about the component here: https://github.com/tsparticles/vue3/#readme" ); } } else { - if (!dependencies["vue2-particles"]) { + if (!dependencies["@tsparticles/vue2"]) { console.warn( "\x1b[43m\x1b[30m%s\x1b[0m", - "Found Vue 2.x installed. Please Download vue2-particles to use tsParticles with a component ready to use and easier to configure." + "Found Vue 2.x installed. Please Download @tsparticles/vue2 to use tsParticles with a component ready to use and easier to configure." ); console.log( - "You can read more about the component here: https://github.com/tsparticles/tsparticles/blob/main/components/vue/README.md" + "You can read more about the component here: https://github.com/tsparticles/vue2/#readme" ); } } @@ -154,7 +228,14 @@ try { } } } catch (error) { - if (error.message === reactParticlesJsFoundError || error.message === particlesJsFoundError) { + if (error.message === reactParticlesJsFoundError || + error.message === particlesJsFoundError || + error.message === reactParticlesFoundError || + error.message === reactTsParticlesFoundError || + error.message === angularParticlesFoundError || + error.message === vue2ParticlesFoundError || + error.message === vue3ParticlesFoundError + ) { throw error; } diff --git a/engine/src/Core/Canvas.ts b/engine/src/Core/Canvas.ts index 11b1d13a87d..a359712b7d5 100644 --- a/engine/src/Core/Canvas.ts +++ b/engine/src/Core/Canvas.ts @@ -1,11 +1,17 @@ -import { clear, drawParticle, drawParticlePlugin, drawPlugin, paintBase, paintImage } from "../Utils/CanvasUtils.js"; -import { cloneStyle, getFullScreenStyle, getLogger, safeMutationObserver } from "../Utils/Utils.js"; +import { + clear, + clearDrawPlugin, + drawParticle, + drawParticlePlugin, + drawPlugin, + paintBase, + paintImage, +} from "../Utils/CanvasUtils.js"; +import { cloneStyle, getFullScreenStyle, safeMatchMedia, safeMutationObserver } from "../Utils/Utils.js"; import { defaultOpacity, defaultTransformValue, generatedAttribute, - inverseFactorNumerator, - minimumLength, minimumSize, zIndexFactorOffset, } from "./Utils/Constants.js"; @@ -19,7 +25,6 @@ import type { IHsl } from "./Interfaces/Colors.js"; import type { IParticleColorStyle } from "./Interfaces/IParticleColorStyle.js"; import type { IParticleTransformValues } from "./Interfaces/IParticleTransformValues.js"; import type { IParticleUpdater } from "./Interfaces/IParticleUpdater.js"; -import type { ITrailFillData } from "./Interfaces/ITrailFillData.js"; import type { Particle } from "./Particle.js"; /** @@ -50,43 +55,37 @@ function setStyle(canvas: HTMLCanvasElement, style?: CSSStyleDeclaration, import return; } - const element = canvas; - - if (!element) { - return; - } - - const elementStyle = element.style; + const element = canvas, + elementStyle = element.style, + keys = new Set(); - if (!elementStyle) { - return; - } - - const keys = new Set(); + for (let i = 0; i < elementStyle.length; i++) { + const key = elementStyle.item(i); - for (const key in elementStyle) { - if (!Object.prototype.hasOwnProperty.call(elementStyle, key)) { + if (!key) { continue; } - keys.add(elementStyle[key]); + keys.add(key); } - for (const key in style) { - if (!Object.prototype.hasOwnProperty.call(style, key)) { + for (let i = 0; i < style.length; i++) { + const key = style.item(i); + + if (!key) { continue; } - keys.add(style[key]); + keys.add(key); } for (const key of keys) { const value = style.getPropertyValue(key); - if (!value) { - elementStyle.removeProperty(key); - } else { + if (value) { elementStyle.setProperty(key, value, important ? "important" : ""); + } else { + elementStyle.removeProperty(key); } } } @@ -111,9 +110,6 @@ export class Canvas { * The particles canvas context */ private _context: CanvasRenderingContext2D | null; - - private _coverColorStyle?: string; - private _coverImage?: { image: HTMLImageElement; opacity: number }; private readonly _engine; private _generated; private _mutationObserver?: MutationObserver; @@ -123,7 +119,6 @@ export class Canvas { private _preDrawUpdaters: IParticleUpdater[]; private _resizePlugins: IContainerPlugin[]; private readonly _standardSize: IDimension; - private _trailFill?: ITrailFillData; /** * Constructor of canvas manager @@ -161,27 +156,44 @@ export class Canvas { return this.container.actualOptions.fullScreen.enable; } + canvasClear(): void { + if (!this.container.actualOptions.clear) { + return; + } + + this.draw(ctx => { + clear(ctx, this.size); + }); + } + /** * Clears the canvas content */ clear(): void { - const options = this.container.actualOptions, - trail = options.particles.move.trail, - trailFill = this._trailFill; - - if (options.backgroundMask.enable) { - this.paint(); - } else if (trail.enable && trail.length > minimumLength && trailFill) { - if (trailFill.color) { - this._paintBase(getStyleFromRgb(trailFill.color, trailFill.opacity)); - } else if (trailFill.image) { - this._paintImage(trailFill.image, trailFill.opacity); + let pluginHandled = false; + + for (const plugin of this.container.plugins.values()) { + if (!pluginHandled && plugin.canvasClear) { + pluginHandled = plugin.canvasClear(); } - } else if (options.clear) { - this.draw(ctx => { - clear(ctx, this.size); - }); } + + if (pluginHandled) { + return; + } + + this.canvasClear(); + } + + /** + * Clears the context after drawing stuff using the given plugin + * @param plugin - the plugin to use for clearing the context + * @param delta - the frame delta time values + */ + clearDrawPlugin(plugin: IContainerPlugin, delta: IDelta): void { + this.draw(ctx => { + clearDrawPlugin(ctx, plugin, delta); + }); } /** @@ -207,7 +219,7 @@ export class Canvas { } /** - * Generic draw method, for drawing stuff on the canvas context + * Generic draw method for drawing stuff on the canvas context * @param cb - * @returns the result of the callback */ @@ -221,16 +233,6 @@ export class Canvas { return cb(ctx); } - drawAsync(cb: (context: CanvasRenderingContext2D) => T): T | undefined { - const ctx = this._context; - - if (!ctx) { - return undefined; - } - - return cb(ctx); - } - /** * Draws the specified particle in the canvas * @param particle - the particle to draw @@ -252,53 +254,58 @@ export class Canvas { let [fColor, sColor] = this._getPluginParticleColors(particle); - if (!fColor) { - fColor = pfColor; - } - - if (!sColor) { - sColor = psColor; - } + fColor ??= pfColor; + sColor ??= psColor; if (!fColor && !sColor) { return; } - this.draw((ctx): void => { - const container = this.container, - options = container.actualOptions, - zIndexOptions = particle.options.zIndex, - zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, - zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, - opacity = particle.bubble.opacity ?? particle.opacity?.value ?? defaultOpacity, - strokeOpacity = particle.strokeOpacity ?? opacity, - zOpacity = opacity * zOpacityFactor, - zStrokeOpacity = strokeOpacity * zOpacityFactor, - transform: IParticleTransformValues = {}, - colorStyles: IParticleColorStyle = { - fill: fColor ? getStyleFromHsl(fColor, zOpacity) : undefined, - }; + const container = this.container, + zIndexOptions = particle.options.zIndex, + zIndexFactor = zIndexFactorOffset - particle.zIndexFactor, + zOpacityFactor = zIndexFactor ** zIndexOptions.opacityRate, + opacity = particle.bubble.opacity ?? particle.opacity?.value ?? defaultOpacity, + strokeOpacity = particle.strokeOpacity ?? opacity, + zOpacity = opacity * zOpacityFactor, + zStrokeOpacity = strokeOpacity * zOpacityFactor, + transform: IParticleTransformValues = {}, + getFillStyle = (): string | undefined => { + if (!fColor) { + return; + } - colorStyles.stroke = sColor ? getStyleFromHsl(sColor, zStrokeOpacity) : colorStyles.fill; + return getStyleFromHsl(fColor, container.hdr, zOpacity); + }, + colorStyles: IParticleColorStyle = { + fill: getFillStyle(), + }, + getStrokestyle = (): string | CanvasGradient | CanvasPattern | undefined => { + if (!sColor) { + return colorStyles.fill; + } - this._applyPreDrawUpdaters(ctx, particle, radius, zOpacity, colorStyles, transform); + return getStyleFromHsl(sColor, container.hdr, zStrokeOpacity); + }; + + colorStyles.stroke = getStrokestyle(); + + this.draw((context): void => { + this._applyPreDrawUpdaters(context, particle, radius, zOpacity, colorStyles, transform); drawParticle({ container, - context: ctx, + context, particle, delta, colorStyles, - backgroundMask: options.backgroundMask.enable, - composite: options.backgroundMask.composite, radius: radius * zIndexFactor ** zIndexOptions.sizeRate, opacity: zOpacity, - shadow: particle.options.shadow, transform, }); - - this._applyPostDrawUpdaters(particle); }); + + this._applyPostDrawUpdaters(particle); } /** @@ -308,7 +315,34 @@ export class Canvas { * @param delta - the frame delta time values */ drawParticlePlugin(plugin: IContainerPlugin, particle: Particle, delta: IDelta): void { - this.draw(ctx => drawParticlePlugin(ctx, plugin, particle, delta)); + this.draw(ctx => { + drawParticlePlugin(ctx, plugin, particle, delta); + }); + } + + drawParticles(delta: IDelta): void { + const { particles, plugins } = this.container; + + this.clear(); + + /* update each particle before drawing */ + particles.update(delta); + + for (const plugin of plugins.values()) { + this.drawPlugin(plugin, delta); + } + + /* container.canvas.draw((ctx) => { + this.quadTree.draw(ctx); + }); */ + + this.draw(() => { + particles.drawParticles(delta); + }); + + for (const plugin of plugins.values()) { + this.clearDrawPlugin(plugin, delta); + } } /** @@ -317,14 +351,18 @@ export class Canvas { * @param delta - the frame delta time values */ drawPlugin(plugin: IContainerPlugin, delta: IDelta): void { - this.draw(ctx => drawPlugin(ctx, plugin, delta)); + this.draw(ctx => { + drawPlugin(ctx, plugin, delta); + }); } /** * Initializes the canvas element */ - async init(): Promise { - this._safeMutationObserver(obs => obs.disconnect()); + init(): void { + this._safeMutationObserver(obs => { + obs.disconnect(); + }); this._mutationObserver = safeMutationObserver(records => { for (const record of records) { if (record.type === "attributes" && record.attributeName === "style") { @@ -334,13 +372,6 @@ export class Canvas { }); this.resize(); this._initStyle(); - await this._initCover(); - - try { - await this._initTrail(); - } catch (e) { - getLogger().error(e); - } this.initBackground(); @@ -361,7 +392,8 @@ export class Canvas { * Initializes the canvas background */ initBackground(): void { - const options = this.container.actualOptions, + const { container } = this, + options = container.actualOptions, background = options.background, element = this.element; @@ -369,16 +401,11 @@ export class Canvas { return; } - const elementStyle = element.style; + const elementStyle = element.style, + color = rangeColorToRgb(this._engine, background.color); - if (!elementStyle) { - return; - } - - if (background.color) { - const color = rangeColorToRgb(this._engine, background.color); - - elementStyle.backgroundColor = color ? getStyleFromRgb(color, background.opacity) : ""; + if (color) { + elementStyle.backgroundColor = getStyleFromRgb(color, container.hdr, background.opacity); } else { elementStyle.backgroundColor = ""; } @@ -425,18 +452,18 @@ export class Canvas { } /** - * Loads the canvas html element - * @param canvas - the canvas html element + * Loads the canvas HTML element + * @param canvas - the canvas HTML element */ loadCanvas(canvas: HTMLCanvasElement): void { if (this._generated && this.element) { this.element.remove(); } + const container = this.container; + this._generated = - canvas.dataset && generatedAttribute in canvas.dataset - ? canvas.dataset[generatedAttribute] === "true" - : this._generated; + generatedAttribute in canvas.dataset ? canvas.dataset[generatedAttribute] === "true" : this._generated; this.element = canvas; this.element.ariaHidden = "true"; this._originalStyle = cloneStyle(this.element.style); @@ -452,11 +479,20 @@ export class Canvas { canvas.height = retinaSize.height = standardSize.height * pxRatio; canvas.width = retinaSize.width = standardSize.width * pxRatio; - this._context = this.element.getContext("2d"); + const canSupportHdrQuery = safeMatchMedia("(color-gamut: p3)"); + + this._context = this.element.getContext("2d", { + alpha: true, + colorSpace: canSupportHdrQuery?.matches && container.hdr ? "display-p3" : "srgb", + desynchronized: true, + willReadFrequently: false, + }); - this._safeMutationObserver(obs => obs.disconnect()); + this._safeMutationObserver(obs => { + obs.disconnect(); + }); - this.container.retina.init(); + container.retina.init(); this.initBackground(); this._safeMutationObserver(obs => { @@ -472,22 +508,32 @@ export class Canvas { * Paints the canvas background */ paint(): void { - const options = this.container.actualOptions; + let handled = false; - this.draw(ctx => { - if (options.backgroundMask.enable && options.backgroundMask.cover) { - clear(ctx, this.size); - - if (this._coverImage) { - this._paintImage(this._coverImage.image, this._coverImage.opacity); - } else if (this._coverColorStyle) { - this._paintBase(this._coverColorStyle); - } else { - this._paintBase(); - } - } else { - this._paintBase(); + for (const plugin of this.container.plugins.values()) { + if (handled) { + break; } + + handled = plugin.canvasPaint?.() ?? false; + } + + if (handled) { + return; + } + + this.paintBase(); + } + + paintBase(baseColor?: string): void { + this.draw(ctx => { + paintBase(ctx, this.size, baseColor); + }); + } + + paintImage(image: HTMLImageElement, opacity: number): void { + this.draw(ctx => { + paintImage(ctx, this.size, image, opacity); }); } @@ -553,10 +599,14 @@ export class Canvas { } stop(): void { - this._safeMutationObserver(obs => obs.disconnect()); + this._safeMutationObserver(obs => { + obs.disconnect(); + }); this._mutationObserver = undefined; - this.draw(ctx => clear(ctx, this.size)); + this.draw(ctx => { + clear(ctx, this.size); + }); } /** @@ -645,48 +695,6 @@ export class Canvas { return [fColor, sColor]; }; - private readonly _initCover = async (): Promise => { - const options = this.container.actualOptions, - cover = options.backgroundMask.cover, - color = cover.color; - - if (color) { - const coverRgb = rangeColorToRgb(this._engine, color); - - if (coverRgb) { - const coverColor = { - ...coverRgb, - a: cover.opacity, - }; - - this._coverColorStyle = getStyleFromRgb(coverColor, coverColor.a); - } - } else { - await new Promise((resolve, reject) => { - if (!cover.image) { - return; - } - - const img = document.createElement("img"); - - img.addEventListener("load", () => { - this._coverImage = { - image: img, - opacity: cover.opacity, - }; - - resolve(); - }); - - img.addEventListener("error", evt => { - reject(evt.error); - }); - - img.src = cover.image; - }); - } - }; - private readonly _initStyle: () => void = () => { const element = this.element, options = this.container.actualOptions; @@ -702,7 +710,7 @@ export class Canvas { } for (const key in options.style) { - if (!key || !options.style || !Object.prototype.hasOwnProperty.call(options.style, key)) { + if (!key || !Object.prototype.hasOwnProperty.call(options.style, key)) { continue; } @@ -716,64 +724,6 @@ export class Canvas { } }; - private readonly _initTrail: () => Promise = async () => { - const options = this.container.actualOptions, - trail = options.particles.move.trail, - trailFill = trail.fill; - - if (!trail.enable) { - return; - } - - const opacity = inverseFactorNumerator / trail.length; - - if (trailFill.color) { - const fillColor = rangeColorToRgb(this._engine, trailFill.color); - - if (!fillColor) { - return; - } - - this._trailFill = { - color: { - ...fillColor, - }, - opacity, - }; - } else { - await new Promise((resolve, reject) => { - if (!trailFill.image) { - return; - } - - const img = document.createElement("img"); - - img.addEventListener("load", () => { - this._trailFill = { - image: img, - opacity, - }; - - resolve(); - }); - - img.addEventListener("error", evt => { - reject(evt.error); - }); - - img.src = trailFill.image; - }); - } - }; - - private readonly _paintBase: (baseColor?: string) => void = baseColor => { - this.draw(ctx => paintBase(ctx, this.size, baseColor)); - }; - - private readonly _paintImage: (image: HTMLImageElement, opacity: number) => void = (image, opacity) => { - this.draw(ctx => paintImage(ctx, this.size, image, opacity)); - }; - private readonly _repairStyle: () => void = () => { const element = this.element; @@ -781,7 +731,9 @@ export class Canvas { return; } - this._safeMutationObserver(observer => observer.disconnect()); + this._safeMutationObserver(observer => { + observer.disconnect(); + }); this._initStyle(); this.initBackground(); @@ -791,7 +743,7 @@ export class Canvas { element.setAttribute("pointer-events", pointerEvents); this._safeMutationObserver(observer => { - if (!element || !(element instanceof Node)) { + if (!(element instanceof Node)) { return; } diff --git a/engine/src/Core/Container.ts b/engine/src/Core/Container.ts index 9eb123a7cb9..1234c4cd7cf 100644 --- a/engine/src/Core/Container.ts +++ b/engine/src/Core/Container.ts @@ -1,9 +1,8 @@ -import { animate, cancelAnimation, getRangeValue } from "../Utils/NumberUtils.js"; +import { animate, cancelAnimation, getRangeValue } from "../Utils/MathUtils.js"; import { clickRadius, defaultFps, defaultFpsLimit, - errorPrefix, millisecondsToSeconds, minCoordinate, minFpsLimit, @@ -11,7 +10,6 @@ import { removeMinIndex, touchEndLengthOffset, } from "./Utils/Constants.js"; -import { getLogger, safeIntersectionObserver } from "../Utils/Utils.js"; import { Canvas } from "./Canvas.js"; import type { Engine } from "./Engine.js"; import { EventListeners } from "./Utils/EventListeners.js"; @@ -28,7 +26,9 @@ import { Options } from "../Options/Classes/Options.js"; import type { Particle } from "./Particle.js"; import { Particles } from "./Particles.js"; import { Retina } from "./Retina.js"; +import { getLogger } from "../Utils/LogUtils.js"; import { loadOptions } from "../Utils/OptionsUtils.js"; +import { safeIntersectionObserver } from "../Utils/Utils.js"; type ContainerClickHandler = (evt: Event) => void; @@ -38,7 +38,7 @@ type ContainerClickHandler = (evt: Event) => void; * @returns true if the container is still usable */ function guardCheck(container: Container): boolean { - return container && !container.destroyed; + return !container.destroyed; } /** @@ -102,6 +102,11 @@ export class Container { */ fpsLimit; + /** + * The container hdr support flag + */ + hdr; + readonly id; interactivity: IContainerInteractivity; @@ -175,6 +180,7 @@ export class Container { this._engine = engine; this.id = Symbol(id); this.fpsLimit = 120; + this.hdr = false; this._smooth = false; this._delay = 0; this._duration = 0; @@ -208,7 +214,9 @@ export class Container { /* ---------- tsParticles - start ------------ */ this._eventListeners = new EventListeners(this); - this._intersectionObserver = safeIntersectionObserver(entries => this._intersectionManager(entries)); + this._intersectionObserver = safeIntersectionObserver(entries => { + this._intersectionManager(entries); + }); this._engine.dispatchEvent(EventType.containerBuilt, { container: this }); } @@ -299,16 +307,11 @@ export class Container { } if (touched && !touchMoved) { - const touchEvent = e as TouchEvent; - - let lastTouch = touchEvent.touches[touchEvent.touches.length - touchEndLengthOffset]; + const touchEvent = e as TouchEvent, + lastTouch = touchEvent.touches[touchEvent.touches.length - touchEndLengthOffset]; if (!lastTouch) { - lastTouch = touchEvent.changedTouches[touchEvent.changedTouches.length - touchEndLengthOffset]; - - if (!lastTouch) { - return; - } + return; } const element = this.canvas.element, @@ -453,7 +456,9 @@ export class Container { this._nextFrame(timestamp); }; - this._drawAnimationFrame = animate(timestamp => frame(timestamp)); + this._drawAnimationFrame = animate(timestamp => { + frame(timestamp); + }); } async export(type: string, options: Record = {}): Promise { @@ -471,7 +476,9 @@ export class Container { return res.blob; } - getLogger().error(`${errorPrefix} - Export plugin with type ${type} not found`); + getLogger().error(`Export plugin with type ${type} not found`); + + return undefined; } /** @@ -532,15 +539,16 @@ export class Container { /* init canvas + particles */ this.retina.init(); - await this.canvas.init(); + this.canvas.init(); this.updateActualOptions(); this.canvas.initBackground(); this.canvas.resize(); - const { zLayers, duration, delay, fpsLimit, smooth } = this.actualOptions; + const { delay, duration, fpsLimit, hdr, smooth, zLayers } = this.actualOptions; + this.hdr = hdr; this.zLayers = zLayers; this._duration = getRangeValue(duration) * millisecondsToSeconds; this._delay = getRangeValue(delay) * millisecondsToSeconds; @@ -785,7 +793,7 @@ export class Container { } if (entry.isIntersecting) { - void this.play(); + this.play(); } else { this.pause(); } @@ -817,7 +825,7 @@ export class Container { return; } - this.particles.draw(delta); + this.canvas.drawParticles(delta); if (!this.alive()) { this.destroy(); @@ -829,7 +837,7 @@ export class Container { this.draw(false); } } catch (e) { - getLogger().error(`${errorPrefix} in animation loop`, e); + getLogger().error("error in animation loop", e); } }; } diff --git a/engine/src/Core/Engine.ts b/engine/src/Core/Engine.ts index 484201d3fa4..b5e91ba5e93 100644 --- a/engine/src/Core/Engine.ts +++ b/engine/src/Core/Engine.ts @@ -1,12 +1,11 @@ /** - * Engine class for creating the singleton on window. + * Engine class for creating the singleton on globalThis. * It's a singleton class for initializing {@link Container} instances */ import type { EasingType, EasingTypeAlt } from "../Enums/Types/EasingType.js"; import { canvasFirstIndex, canvasTag, - errorPrefix, generatedAttribute, generatedFalse, generatedTrue, @@ -16,8 +15,8 @@ import { one, removeDeleteCount, } from "./Utils/Constants.js"; -import { executeOnSingleOrMultiple, getLogger, itemFromSingleOrMultiple } from "../Utils/Utils.js"; -import { Container } from "./Container.js"; +import { itemFromSingleOrMultiple, safeDocument } from "../Utils/Utils.js"; +import type { Container } from "./Container.js"; import type { CustomEventArgs } from "../Types/CustomEventArgs.js"; import type { CustomEventListener } from "../Types/CustomEventListener.js"; import type { EasingFunction } from "../Types/EasingFunction.js"; @@ -40,14 +39,13 @@ import type { Particle } from "./Particle.js"; import type { ParticlesOptions } from "../Options/Classes/Particles/ParticlesOptions.js"; import type { RecursivePartial } from "../Types/RecursivePartial.js"; import type { SingleOrMultiple } from "../Types/SingleOrMultiple.js"; -import { getRandom } from "../Utils/NumberUtils.js"; +import { getLogger } from "../Utils/LogUtils.js"; +import { getRandom } from "../Utils/MathUtils.js"; declare const __VERSION__: string; declare global { - interface Window { - tsParticles: Engine; - } + var tsParticles: Engine; } interface DataFromUrlParams { @@ -76,6 +74,16 @@ interface Initializers { updaters: Map; } +type AsyncLoadPluginFunction = (engine: Engine) => Promise; +type SyncLoadPluginFunction = (engine: Engine) => void; +type AsyncLoadPluginNoEngine = () => Promise; +type SyncLoadPluginNoEngine = () => void; +type LoadPluginFunction = + | AsyncLoadPluginFunction + | SyncLoadPluginFunction + | AsyncLoadPluginNoEngine + | SyncLoadPluginNoEngine; + /** * @param container - * @param map - @@ -119,7 +127,7 @@ async function getDataFromUrl( return (await response.json()) as SingleOrMultiple; } - getLogger().error(`${errorPrefix} ${response.status} while retrieving config file`); + getLogger().error(`${response.status.toString()} while retrieving config file`); return data.fallback; } @@ -130,20 +138,19 @@ const getCanvasFromContainer = (domContainer: HTMLElement): HTMLCanvasElement => if (domContainer instanceof HTMLCanvasElement || domContainer.tagName.toLowerCase() === canvasTag) { canvasEl = domContainer as HTMLCanvasElement; - if (!canvasEl.dataset[generatedAttribute]) { - canvasEl.dataset[generatedAttribute] = generatedFalse; - } + canvasEl.dataset[generatedAttribute] ??= generatedFalse; } else { - const existingCanvases = domContainer.getElementsByTagName(canvasTag); + const existingCanvases = domContainer.getElementsByTagName(canvasTag), + foundCanvas = existingCanvases[canvasFirstIndex]; /* get existing canvas if present, otherwise a new one will be created */ - if (existingCanvases.length) { - canvasEl = existingCanvases[canvasFirstIndex]; + if (foundCanvas) { + canvasEl = foundCanvas; canvasEl.dataset[generatedAttribute] = generatedFalse; } else { /* create canvas element */ - canvasEl = document.createElement(canvasTag); + canvasEl = safeDocument().createElement(canvasTag); canvasEl.dataset[generatedAttribute] = generatedTrue; @@ -165,24 +172,24 @@ const getCanvasFromContainer = (domContainer: HTMLElement): HTMLCanvasElement => return canvasEl; }, getDomContainer = (id: string, source?: HTMLElement): HTMLElement => { - let domContainer = source ?? document.getElementById(id); + let domContainer = source ?? safeDocument().getElementById(id); if (domContainer) { return domContainer; } - domContainer = document.createElement("div"); + domContainer = safeDocument().createElement("div"); domContainer.id = id; domContainer.dataset[generatedAttribute] = generatedTrue; - document.body.append(domContainer); + safeDocument().body.append(domContainer); return domContainer; }; /** - * Engine class for creating the singleton on window. + * Engine class for creating the singleton on globalThis. * It's a singleton class for initializing {@link Container} instances, * and for Plugins class responsible for every external feature */ @@ -244,6 +251,8 @@ export class Engine { private readonly _initializers: Initializers; + private readonly _loadPromises: Set; + /** * Engine constructor, initializes plugins, loader and the containers array */ @@ -252,7 +261,7 @@ export class Engine { this._domArray = []; this._eventDispatcher = new EventDispatcher(); this._initialized = false; - + this._loadPromises = new Set(); this.plugins = []; this.colorManagers = new Map(); this.easingFunctions = new Map(); @@ -290,12 +299,9 @@ export class Engine { /** * @param manager - - * @param refresh - */ - async addColorManager(manager: IColorManager, refresh = true): Promise { + addColorManager(manager: IColorManager): void { this.colorManagers.set(manager.key, manager); - - await this.refresh(refresh); } addConfig(config: ISourceOptions): void { @@ -308,32 +314,26 @@ export class Engine { /** * @param name - * @param easing - - * @param refresh - */ - async addEasing(name: EasingType | EasingTypeAlt, easing: EasingFunction, refresh = true): Promise { - if (this.getEasing(name)) { + addEasing(name: EasingType | EasingTypeAlt, easing: EasingFunction): void { + if (this.easingFunctions.get(name)) { return; } this.easingFunctions.set(name, easing); - - await this.refresh(refresh); } /** * addEffect adds effect to tsParticles, it will be available to all future instances created * @param effect - the effect name * @param drawer - the effect drawer function or class instance that draws the effect in the canvas - * @param refresh - should refresh the dom after adding the effect */ - async addEffect(effect: SingleOrMultiple, drawer: IEffectDrawer, refresh = true): Promise { - executeOnSingleOrMultiple(effect, type => { - if (!this.getEffectDrawer(type)) { - this.effectDrawers.set(type, drawer); - } - }); + addEffect(effect: string, drawer: IEffectDrawer): void { + if (this.getEffectDrawer(effect)) { + return; + } - await this.refresh(refresh); + this.effectDrawers.set(effect, drawer); } /** @@ -349,62 +349,51 @@ export class Engine { * Adds an interaction manager to the current collection * @param name - the interaction manager name * @param interactorInitializer - the interaction manager initializer - * @param refresh - if true the engine will refresh all the containers */ - async addInteractor(name: string, interactorInitializer: InteractorInitializer, refresh = true): Promise { + addInteractor(name: string, interactorInitializer: InteractorInitializer): void { this._initializers.interactors.set(name, interactorInitializer); - - await this.refresh(refresh); } /** * @param name - the mover name * @param moverInitializer - the mover initializer - * @param refresh - if true the engine will refresh all the containers */ - async addMover(name: string, moverInitializer: MoverInitializer, refresh = true): Promise { + addMover(name: string, moverInitializer: MoverInitializer): void { this._initializers.movers.set(name, moverInitializer); - - await this.refresh(refresh); } /** * Adds a particle updater to the collection * @param name - the particle updater name used as a key * @param updaterInitializer - the particle updater initializer - * @param refresh - if true the engine will refresh all the containers */ - async addParticleUpdater(name: string, updaterInitializer: UpdaterInitializer, refresh = true): Promise { + addParticleUpdater(name: string, updaterInitializer: UpdaterInitializer): void { this._initializers.updaters.set(name, updaterInitializer); - - await this.refresh(refresh); } /** * addPathGenerator adds a named path generator to tsParticles, this can be called by options * @param name - the path generator name * @param generator - the path generator object - * @param refresh - should refresh the dom after adding the path generator */ - async addPathGenerator(name: string, generator: IMovePathGenerator, refresh = true): Promise { - if (!this.getPathGenerator(name)) { - this.pathGenerators.set(name, generator); + addPathGenerator(name: string, generator: IMovePathGenerator): void { + if (this.getPathGenerator(name)) { + return; } - await this.refresh(refresh); + this.pathGenerators.set(name, generator); } /** * addPlugin adds plugin to tsParticles, if an instance needs it, it will be loaded * @param plugin - the plugin implementation of {@link IPlugin} - * @param refresh - should refresh the dom after adding the plugin */ - async addPlugin(plugin: IPlugin, refresh = true): Promise { - if (!this.getPlugin(plugin.id)) { - this.plugins.push(plugin); + addPlugin(plugin: IPlugin): void { + if (this.getPlugin(plugin.id)) { + return; } - await this.refresh(refresh); + this.plugins.push(plugin); } /** @@ -412,27 +401,20 @@ export class Engine { * @param preset - the preset name * @param options - the options to add to the preset * @param override - if true, the preset will override any existing with the same name - * @param refresh - should refresh the dom after adding the preset - */ - async addPreset( - preset: string, - options: Readonly, - override = false, - refresh = true, - ): Promise { - if (override || !this.getPreset(preset)) { - this.presets.set(preset, options); + */ + addPreset(preset: string, options: Readonly, override = false): void { + if (!(override || !this.getPreset(preset))) { + return; } - await this.refresh(refresh); + this.presets.set(preset, options); } /** * addShape adds shape to tsParticles, it will be available to all future instances created * @param drawer - the shape drawer function or class instance that draws the shape in the canvas - * @param refresh - should refresh the dom after adding the shape */ - async addShape(drawer: IShapeDrawer, refresh = true): Promise { + addShape(drawer: IShapeDrawer): void { for (const validType of drawer.validTypes) { if (this.getShapeDrawer(validType)) { continue; @@ -440,8 +422,6 @@ export class Engine { this.shapeDrawers.set(validType, drawer); } - - await this.refresh(refresh); } /** @@ -604,11 +584,17 @@ export class Engine { /** * init method, used by imports */ - init(): void { + async init(): Promise { if (this._initialized) { return; } + for (const loadPromise of this._loadPromises) { + await loadPromise(this); + } + + this._loadPromises.clear(); + this._initialized = true; } @@ -621,7 +607,7 @@ export class Engine { const { items } = this, item = items[index]; - if (!item || item.destroyed) { + if (item?.destroyed) { items.splice(index, removeDeleteCount); return; @@ -636,7 +622,13 @@ export class Engine { * @returns A Promise with the {@link Container} object created */ async load(params: ILoadParams): Promise { - const id = params.id ?? params.element?.id ?? `tsparticles${Math.floor(getRandom() * loadRandomFactor)}`, + await this.init(); + + const { Container } = await import("./Container.js"), + id = + params.id ?? + params.element?.id ?? + `tsparticles${Math.floor(getRandom() * loadRandomFactor).toString()}`, { index, url } = params, options = url ? await getDataFromUrl({ fallback: params.options, url, index }) : params.options, /* elements */ @@ -675,7 +667,9 @@ export class Engine { * @param sourceOptions - the source options to read */ loadOptions(options: Options, sourceOptions: ISourceOptions): void { - this.plugins.forEach(plugin => plugin.loadOptions?.(options, sourceOptions)); + this.plugins.forEach(plugin => { + plugin.loadOptions(options, sourceOptions); + }); } /** @@ -710,6 +704,16 @@ export class Engine { await Promise.all(this.items.map(t => t.refresh())); } + register(...loadPromises: LoadPluginFunction[]): void { + if (this._initialized) { + throw new Error(`Register plugins can only be done before calling tsParticles.load()`); + } + + for (const loadPromise of loadPromises) { + this._loadPromises.add(loadPromise); + } + } + /** * Removes a listener from the specified event * @param type - The event to stop listening to @@ -727,9 +731,11 @@ export class Engine { const { items } = this; if (!items.length) { - throw new Error(`${errorPrefix} can only set click handlers after calling tsParticles.load()`); + throw new Error("Click handlers can only be set after calling tsParticles.load()"); } - items.forEach(item => item.addClickHandler(callback)); + items.forEach(item => { + item.addClickHandler(callback); + }); } } diff --git a/engine/src/Core/Interfaces/Colors.ts b/engine/src/Core/Interfaces/Colors.ts index 4022a50d02e..a77c2ee1833 100644 --- a/engine/src/Core/Interfaces/Colors.ts +++ b/engine/src/Core/Interfaces/Colors.ts @@ -20,7 +20,9 @@ export interface IColor { /** * Color value, can be a single or an array of {@link IValueColor}, {@link IRgb}, {@link IHsl} or string */ - value: SingleOrMultiple>; + value: SingleOrMultiple< + IValueColor | IRgb | IHsl | IHsv | IHwb | ILab | ILch | IOklab | IOklch | SingleOrMultiple + >; } /** @@ -31,7 +33,17 @@ export interface IRangeColor { /** * Color value, can be a single or an array of {@link IValueColor}, {@link IRgb}, {@link IHsl} or string */ - value: SingleOrMultiple>; + value: SingleOrMultiple< + | IRangeValueColor + | IRangeRgb + | IRangeHsl + | IRangeHsv + | IRangeHwb + | IRangeLab + | IRangeLch + | IRangeOklab + | SingleOrMultiple + >; } /** @@ -274,6 +286,132 @@ export interface IOklcha extends IOklch, IAlphaColor {} */ export interface ILcha extends ILch, IAlphaColor {} +/** + * OKLAB Color + * [[include:Color.md]] + */ +export interface IOklab { + /** + * a axis (green–red) + */ + aAxis: number; + + /** + * b axis (blue–yellow) + */ + bAxis: number; + + /** + * Lightness + */ + l: number; +} + +/** + * Range OKLAB Color + * [[include:Color.md]] + */ +export interface IRangeOklab { + /** + * a axis (green–red) + */ + aAxis: RangeValue; + + /** + * b axis (blue–yellow) + */ + bAxis: RangeValue; + + /** + * Lightness + */ + l: RangeValue; +} + +/** + * OKLABA Color + * [[include:Color.md]] + */ +export interface IOklaba extends IOklab, IAlphaColor {} + +/** + * OKLAB Color + * [[include:Color.md]] + */ +export interface ILab { + /** + * a axis (green–red) + */ + aAxis: number; + + /** + * b axis (blue–yellow) + */ + bAxis: number; + + /** + * Lightness + */ + l: number; +} + +/** + * Range OKLAB Color + * [[include:Color.md]] + */ +export interface IRangeLab { + /** + * a axis (green–red) + */ + aAxis: RangeValue; + + /** + * b axis (blue–yellow) + */ + bAxis: RangeValue; + + /** + * Lightness + */ + l: RangeValue; +} + +/** + * OKLABA Color + * [[include:Color.md]] + */ +export interface ILaba extends IOklab, IAlphaColor {} + +/** + * HWB Color + * [[include:Color.md]] + */ +export interface IHwb { + b: number; + h: number; + w: number; +} + +/** + * HWBA Color + * [[include:Color.md]] + */ +export interface IHwba extends IHwb, IAlphaColor {} + +/** + * Range HWB Color + */ +export interface IRangeHwb { + b: RangeValue; + h: RangeValue; + w: RangeValue; +} + +/** + * Range HWBA Color + */ +export interface IRangeHwba extends IRangeHwb, IAlphaColor {} + /** * Mixed Value Color * [[include:Color.md]] @@ -289,11 +427,26 @@ export interface IValueColor { */ hsv?: IHsv; + /** + * HWB value + */ + hwb?: IHwb; + + /** + * Lab Value + */ + lab?: ILab; + /** * Lch Value */ lch?: ILch; + /** + * Oklab Value + */ + oklab?: IOklab; + /** * Oklch Value */ @@ -320,11 +473,26 @@ export interface IRangeValueColor { */ hsv?: IRangeHsv; + /** + * HWB value + */ + hwb?: IRangeHwb; + + /** + * Lab Value + */ + lab?: IRangeLab; + /** * Lch Value */ lch?: IRangeLch; + /** + * Oklab Value + */ + oklab?: IRangeOklab; + /** * Oklch Value */ diff --git a/engine/src/Core/Interfaces/IColorManager.ts b/engine/src/Core/Interfaces/IColorManager.ts index 47d89a59abc..c87684042df 100644 --- a/engine/src/Core/Interfaces/IColorManager.ts +++ b/engine/src/Core/Interfaces/IColorManager.ts @@ -2,7 +2,8 @@ import type { IColor, IRangeColor, IRgb, IRgba } from "./Colors.js"; export interface IColorManager { readonly key: string; - readonly stringPrefix: string; + + accepts(input: string): boolean; handleColor(color: IColor): IRgb | undefined; diff --git a/engine/src/Core/Interfaces/IContainerPlugin.ts b/engine/src/Core/Interfaces/IContainerPlugin.ts index dfa9d2699df..0105f755b38 100644 --- a/engine/src/Core/Interfaces/IContainerPlugin.ts +++ b/engine/src/Core/Interfaces/IContainerPlugin.ts @@ -8,6 +8,10 @@ import type { Particle } from "../Particle.js"; /** */ export interface IContainerPlugin { + canvasClear?: () => boolean; + canvasPaint?: () => boolean; + checkParticlePosition?: (particle: Particle, position: ICoordinates, tryCount: number) => boolean; + clearDraw?: (context: CanvasRenderingContext2D, delta: IDelta) => void; clickPositionValid?: (position: ICoordinates) => boolean; draw?: (context: CanvasRenderingContext2D, delta: IDelta) => void; drawParticle?: (context: CanvasRenderingContext2D, particle: Particle, delta: IDelta) => void; diff --git a/engine/src/Core/Interfaces/IDrawParticleParams.ts b/engine/src/Core/Interfaces/IDrawParticleParams.ts index 61b3bff448c..4538bd29489 100644 --- a/engine/src/Core/Interfaces/IDrawParticleParams.ts +++ b/engine/src/Core/Interfaces/IDrawParticleParams.ts @@ -2,22 +2,13 @@ import type { Container } from "../Container.js"; import type { IDelta } from "./IDelta.js"; import type { IParticleColorStyle } from "./IParticleColorStyle.js"; import type { IParticleTransformValues } from "./IParticleTransformValues.js"; -import type { IShadow } from "../../Options/Interfaces/Particles/IShadow.js"; import type { Particle } from "../Particle.js"; export interface IDrawParticleParams { - /** - * If enabled, the composite value will be used for blending the particle in the canvas - */ - backgroundMask: boolean; /** * The color styles value */ colorStyles: IParticleColorStyle; - /** - * The composite value to use for blending the particle in the canvas - */ - composite: GlobalCompositeOperation; /** * The container of the particle */ @@ -42,10 +33,6 @@ export interface IDrawParticleParams { * The radius of the particle */ radius: number; - /** - * The shadow of the particle - */ - shadow: IShadow; /** * The particle transform values */ diff --git a/engine/src/Core/Interfaces/IEffectDrawer.ts b/engine/src/Core/Interfaces/IEffectDrawer.ts index 5e2b1295bd5..6acf7fef2fe 100644 --- a/engine/src/Core/Interfaces/IEffectDrawer.ts +++ b/engine/src/Core/Interfaces/IEffectDrawer.ts @@ -10,10 +10,16 @@ export interface IEffectDrawer { destroy?: (container: Container) => void; /** - * Shape draw function + * Shape draw after function * @param data - the data used for drawing */ - draw: (data: IShapeDrawData) => void; + drawAfter?: (data: IShapeDrawData) => void; + + /** + * Shape draw before function + * @param data - the data used for drawing + */ + drawBefore?: (data: IShapeDrawData) => void; /** * Shape init function diff --git a/engine/src/Core/Interfaces/IPositionFromSizeParams.ts b/engine/src/Core/Interfaces/IPositionFromSizeParams.ts index 30322b92da7..1af8c7ff644 100644 --- a/engine/src/Core/Interfaces/IPositionFromSizeParams.ts +++ b/engine/src/Core/Interfaces/IPositionFromSizeParams.ts @@ -1,6 +1,6 @@ import type { ICoordinates, IRangedCoordinates } from "./ICoordinates.js"; // eslint-disable-next-line @typescript-eslint/no-unused-vars -import { calcPositionFromSize, calcPositionOrRandomFromSize } from "../../Utils/NumberUtils.js"; +import { calcPositionFromSize, calcPositionOrRandomFromSize } from "../../Utils/MathUtils.js"; import type { IDimension } from "./IDimension.js"; /** diff --git a/engine/src/Core/Interfaces/IShapeDrawData.ts b/engine/src/Core/Interfaces/IShapeDrawData.ts index 0e74e2f5260..bd2b912ed53 100644 --- a/engine/src/Core/Interfaces/IShapeDrawData.ts +++ b/engine/src/Core/Interfaces/IShapeDrawData.ts @@ -12,6 +12,11 @@ export interface IShapeDrawData { */ delta: IDelta; + /** + * the particle fill status + */ + fill: boolean; + /** * the particle opacity */ @@ -32,6 +37,11 @@ export interface IShapeDrawData { */ radius: number; + /** + * the particle stroke status + */ + stroke: boolean; + /** * the transform data of the particle */ diff --git a/engine/src/Core/Interfaces/IShapeDrawer.ts b/engine/src/Core/Interfaces/IShapeDrawer.ts index 6682f0a312a..4a3dd147650 100644 --- a/engine/src/Core/Interfaces/IShapeDrawer.ts +++ b/engine/src/Core/Interfaces/IShapeDrawer.ts @@ -11,6 +11,12 @@ export interface IShapeDrawer { */ afterDraw?: (data: IShapeDrawData) => void; + /** + * Shape before draw effect function + * @param data - the data used for drawing + */ + beforeDraw?: (data: IShapeDrawData) => void; + /** * Shape destroy function * @param container - the container initializing the shape diff --git a/engine/src/Core/Interfaces/ITrailFillData.ts b/engine/src/Core/Interfaces/ITrailFillData.ts deleted file mode 100644 index 9c1c2eb44a5..00000000000 --- a/engine/src/Core/Interfaces/ITrailFillData.ts +++ /dev/null @@ -1,7 +0,0 @@ -import type { IRgb } from "./Colors.js"; - -export interface ITrailFillData { - color?: IRgb; - image?: HTMLImageElement; - opacity: number; -} diff --git a/engine/src/Core/Particle.ts b/engine/src/Core/Particle.ts index 46589c80f3b..b904063768d 100644 --- a/engine/src/Core/Particle.ts +++ b/engine/src/Core/Particle.ts @@ -1,27 +1,23 @@ import type { ICenterCoordinates, ICoordinates, ICoordinates3d } from "./Interfaces/ICoordinates.js"; -import type { IHsl, IRgb } from "./Interfaces/Colors.js"; import { Vector, Vector3d } from "./Utils/Vectors.js"; import { calcExactPositionOrRandomFromSize, clamp, degToRad, - getDistance, getParticleBaseVelocity, getParticleDirectionAngle, getRandom, getRangeValue, - randomInRange, + randomInRangeValue, setRangeValue, -} from "../Utils/NumberUtils.js"; +} from "../Utils/MathUtils.js"; import { decayOffset, - defaultRadius, + defaultAngle, defaultRetryCount, double, - errorPrefix, half, millisecondsToSeconds, - minRetries, minZ, none, randomColorValue, @@ -36,13 +32,14 @@ import { isInArray, itemFromSingleOrMultiple, } from "../Utils/Utils.js"; -import { getHslFromAnimation, rangeColorToRgb } from "../Utils/ColorUtils.js"; import type { Container } from "./Container.js"; import type { Engine } from "./Engine.js"; import { EventType } from "../Enums/Types/EventType.js"; import type { IBubbleParticleData } from "./Interfaces/IBubbleParticleData.js"; import type { IDelta } from "./Interfaces/IDelta.js"; import type { IEffect } from "../Options/Interfaces/Particles/Effect/IEffect.js"; +import type { IEffectDrawer } from "./Interfaces/IEffectDrawer.js"; +import type { IHsl } from "./Interfaces/Colors.js"; import type { IMovePathGenerator } from "./Interfaces/IMovePathGenerator.js"; import type { IParticleHslAnimation } from "./Interfaces/IParticleHslAnimation.js"; import type { IParticleNumericValueAnimation } from "./Interfaces/IParticleValueAnimation.js"; @@ -50,6 +47,7 @@ import type { IParticleRetinaProps } from "./Interfaces/IParticleRetinaProps.js" import type { IParticleRoll } from "./Interfaces/IParticleRoll.js"; import type { IParticlesOptions } from "../Options/Interfaces/Particles/IParticlesOptions.js"; import type { IShape } from "../Options/Interfaces/Particles/Shape/IShape.js"; +import type { IShapeDrawer } from "./Interfaces/IShapeDrawer.js"; import type { IShapeValues } from "./Interfaces/IShapeValues.js"; import type { ISlowParticleData } from "./Interfaces/ISlowParticleData.js"; import { Interactivity } from "../Options/Classes/Interactivity/Interactivity.js"; @@ -57,9 +55,9 @@ import { MoveDirection } from "../Enums/Directions/MoveDirection.js"; import { OutMode } from "../Enums/Modes/OutMode.js"; import { ParticleOutType } from "../Enums/Types/ParticleOutType.js"; import type { ParticlesOptions } from "../Options/Classes/Particles/ParticlesOptions.js"; -import { PixelMode } from "../Enums/Modes/PixelMode.js"; import type { RecursivePartial } from "../Types/RecursivePartial.js"; import { alterHsl } from "../Utils/CanvasUtils.js"; +import { getHslFromAnimation } from "../Utils/ColorUtils.js"; import { loadParticlesOptions } from "../Utils/OptionsUtils.js"; /** @@ -103,10 +101,6 @@ function loadEffectData( ): IShapeValues | undefined { const effectData = effectOptions.options[effect]; - if (!effectData) { - return; - } - return deepExtend( { close: effectOptions.close, @@ -132,10 +126,6 @@ function loadShapeData( ): IShapeValues | undefined { const shapeData = shapeOptions.options[shape]; - if (!shapeData) { - return; - } - return deepExtend( { close: shapeOptions.close, @@ -196,7 +186,7 @@ export class Particle { /** * Gets particle effect type */ - effect!: string; + effect?: string; /** * Checks if the particle effect needs a closed path @@ -310,15 +300,10 @@ export class Particle { */ rotation!: number; - /** - * Gets particle shadow color - */ - shadowColor?: IRgb; - /** * Gets particle shape type */ - shape!: string; + shape?: string; /** * Checks if the particle shape needs a closed path @@ -345,6 +330,9 @@ export class Particle { */ size!: IParticleNumericValueAnimation; + /** + * Gets particle slow options + */ slow!: ISlowParticleData; /** @@ -406,7 +394,7 @@ export class Particle { const container = this.container, pathGenerator = this.pathGenerator, - shapeDrawer = container.shapeDrawers.get(this.shape); + shapeDrawer = this.shape ? container.shapeDrawers.get(this.shape) : undefined; shapeDrawer?.particleDestroy?.(this); @@ -439,6 +427,10 @@ export class Particle { canvas.drawParticle(this, delta); } + getAngle(): number { + return this.rotation + (this.pathRotation ? this.velocity.angle : defaultAngle); + } + getFillColor(): IHsl | undefined { return this._getRollColor(this.bubble.color ?? getHslFromAnimation(this.color)); } @@ -494,7 +486,7 @@ export class Particle { const pxRatio = container.retina.pixelRatio, mainOptions = container.actualOptions, particlesOptions = loadParticlesOptions(this._engine, container, mainOptions.particles), - { reduceDuplicates } = particlesOptions, + reduceDuplicates = particlesOptions.reduceDuplicates, effectType = particlesOptions.effect.type, shapeType = particlesOptions.shape.type; @@ -540,8 +532,10 @@ export class Particle { this.shape = availableShapes[Math.floor(getRandom() * availableShapes.length)]; } - this.effectData = loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates); - this.shapeData = loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates); + this.effectData = this.effect + ? loadEffectData(this.effect, effectOptions, this.id, reduceDuplicates) + : undefined; + this.shapeData = this.shape ? loadShapeData(this.shape, shapeOptions, this.id, reduceDuplicates) : undefined; particlesOptions.load(overrideOptions); @@ -611,13 +605,17 @@ export class Particle { this.zIndexFactor = this.position.z / container.zLayers; this.sides = 24; - let effectDrawer = container.effectDrawers.get(this.effect); + let effectDrawer: IEffectDrawer | undefined, shapeDrawer: IShapeDrawer | undefined; + + if (this.effect) { + effectDrawer = container.effectDrawers.get(this.effect); - if (!effectDrawer) { - effectDrawer = this._engine.getEffectDrawer(this.effect); + if (!effectDrawer) { + effectDrawer = this._engine.getEffectDrawer(this.effect); - if (effectDrawer) { - container.effectDrawers.set(this.effect, effectDrawer); + if (effectDrawer) { + container.effectDrawers.set(this.effect, effectDrawer); + } } } @@ -625,13 +623,15 @@ export class Particle { effectDrawer.loadEffect(this); } - let shapeDrawer = container.shapeDrawers.get(this.shape); + if (this.shape) { + shapeDrawer = container.shapeDrawers.get(this.shape); - if (!shapeDrawer) { - shapeDrawer = this._engine.getShapeDrawer(this.shape); + if (!shapeDrawer) { + shapeDrawer = this._engine.getShapeDrawer(this.shape); - if (shapeDrawer) { - container.shapeDrawers.set(this.shape, shapeDrawer); + if (shapeDrawer) { + container.shapeDrawers.set(this.shape, shapeDrawer); + } } } @@ -646,14 +646,13 @@ export class Particle { } this.spawning = false; - this.shadowColor = rangeColorToRgb(this._engine, this.options.shadow.color); for (const updater of particles.updaters) { updater.init(this); } for (const mover of particles.movers) { - mover.init?.(this); + mover.init(this); } effectDrawer?.particleInit?.(container, this); @@ -696,9 +695,10 @@ export class Particle { zIndex: number, tryCount?: number, ) => Vector3d = (container, position, zIndex, tryCount = defaultRetryCount) => { - for (const plugin of container.plugins.values()) { - const pluginPos = - plugin.particlePosition !== undefined ? plugin.particlePosition(position, this) : undefined; + const plugins = container.plugins.values(); + + for (const plugin of plugins) { + const pluginPos = plugin.particlePosition?.(position, this); if (pluginPos) { return Vector3d.create(pluginPos.x, pluginPos.y, zIndex); @@ -740,7 +740,17 @@ export class Particle { fixVertical(outModes.top ?? outModes.default); fixVertical(outModes.bottom ?? outModes.default); - if (this._checkOverlap(pos, tryCount)) { + let isValidPosition: boolean | undefined = true; + + for (const plugin of plugins) { + isValidPosition = plugin.checkParticlePosition?.(this, pos, tryCount); + + if (isValidPosition === false) { + break; + } + } + + if (!isValidPosition) { return this._calcPosition(container, undefined, zIndex, tryCount + tryCountIncrement); } @@ -764,7 +774,7 @@ export class Particle { }; if (!moveOptions.straight) { - res.angle += randomInRange(setRangeValue(range.left, range.right)); + res.angle += randomInRangeValue(setRangeValue(range.left, range.right)); } if (moveOptions.random && typeof moveOptions.speed === "number") { @@ -774,34 +784,6 @@ export class Particle { return res; }; - private readonly _checkOverlap: (pos: ICoordinates, tryCount?: number) => boolean = ( - pos, - tryCount = defaultRetryCount, - ) => { - const collisionsOptions = this.options.collisions, - radius = this.getRadius(); - - if (!collisionsOptions.enable) { - return false; - } - - const overlapOptions = collisionsOptions.overlap; - - if (overlapOptions.enable) { - return false; - } - - const retries = overlapOptions.retries; - - if (retries >= minRetries && tryCount > retries) { - throw new Error(`${errorPrefix} particle is overlapping and can't be placed`); - } - - return !!this.container.particles.find( - particle => getDistance(pos, particle.position) < radius + particle.getRadius(), - ); - }; - private readonly _getRollColor: (color?: IHsl) => IHsl | undefined = color => { if (!color || !this.roll || (!this.backColor && !this.roll.alter)) { return color; @@ -809,7 +791,7 @@ export class Particle { const backFactor = this.roll.horizontal && this.roll.vertical ? double * rollFactor : rollFactor, backSum = this.roll.horizontal ? Math.PI * half : none, - rolled = Math.floor(((this.roll.angle ?? none) + backSum) / (Math.PI / backFactor)) % double; + rolled = Math.floor((this.roll.angle + backSum) / (Math.PI / backFactor)) % double; if (!rolled) { return color; @@ -837,8 +819,8 @@ export class Particle { this.moveCenter = { ...getPosition(this.options.move.center, canvasSize), - radius: this.options.move.center.radius ?? defaultRadius, - mode: this.options.move.center.mode ?? PixelMode.percent, + radius: this.options.move.center.radius, + mode: this.options.move.center.mode, }; this.direction = getParticleDirectionAngle(this.options.move.direction, this.position, this.moveCenter); diff --git a/engine/src/Core/Particles.ts b/engine/src/Core/Particles.ts index 63036f956dd..ac0590f7b87 100644 --- a/engine/src/Core/Particles.ts +++ b/engine/src/Core/Particles.ts @@ -3,7 +3,6 @@ import { defaultDensityFactor, defaultRemoveQuantity, deleteCount, - errorPrefix, lengthOffset, minCount, minIndex, @@ -13,7 +12,6 @@ import { sizeFactor, squareExp, } from "./Utils/Constants.js"; -import { getLogger, getPosition } from "../Utils/Utils.js"; import type { Container } from "./Container.js"; import type { Engine } from "./Engine.js"; import { EventType } from "../Enums/Types/EventType.js"; @@ -28,10 +26,14 @@ import type { IParticlesOptions } from "../Options/Interfaces/Particles/IParticl import { InteractionManager } from "./Utils/InteractionManager.js"; import { LimitMode } from "../Enums/Modes/LimitMode.js"; import { Particle } from "./Particle.js"; +import { type ParticlesOptions } from "../Options/Classes/Particles/ParticlesOptions.js"; import { Point } from "./Utils/Point.js"; import { QuadTree } from "./Utils/QuadTree.js"; import { Rectangle } from "./Utils/Ranges.js"; import type { RecursivePartial } from "../Types/RecursivePartial.js"; +import { getLogger } from "../Utils/LogUtils.js"; +import { getPosition } from "../Utils/Utils.js"; +import { loadParticlesOptions } from "../Utils/OptionsUtils.js"; const qTreeRectangle = (canvasSize: IDimension): Rectangle => { const { height, width } = canvasSize; @@ -158,28 +160,9 @@ export class Particles { this.updaters = []; } - draw(delta: IDelta): void { - const container = this._container, - canvas = container.canvas; - - /* clear canvas */ - canvas.clear(); - - /* update each particle before drawing */ - this.update(delta); - - /* draw polygon shape in debug mode */ - for (const plugin of container.plugins.values()) { - canvas.drawPlugin(plugin, delta); - } - - /* container.canvas.draw((ctx) => { - this.quadTree.draw(ctx); - }); */ - - /* draw each particle */ - for (const p of this._zArray) { - p.draw(delta); + drawParticles(delta: IDelta): void { + for (const particle of this._zArray) { + particle.draw(delta); } } @@ -228,9 +211,13 @@ export class Particles { for (const group in groups) { const groupOptions = groups[group]; + if (!groupOptions) { + continue; + } + for ( let i = this.count, j = 0; - j < groupOptions.number?.value && i < particlesOptions.number.value; + j < groupOptions.number.value && i < particlesOptions.number.value; i++, j++ ) { this.addParticle(undefined, groupOptions, group); @@ -269,7 +256,7 @@ export class Particles { this.clear(); await this.init(); - this.draw({ value: 0, factor: 0 }); + this._container.canvas.drawParticles({ value: 0, factor: 0 }); } remove(particle: Particle, group?: string, override?: boolean): void { @@ -301,7 +288,15 @@ export class Particles { manualCount = options.manualParticles.length; for (const group in groups) { - this._applyDensity(groups[group], manualCount, group); + const groupData = groups[group]; + + if (!groupData) { + continue; + } + + const groupDataOptions = loadParticlesOptions(this._engine, this._container, groupData); + + this._applyDensity(groupDataOptions, manualCount, group); } this._applyDensity(options.particles, manualCount); @@ -405,7 +400,13 @@ export class Particles { zArray.sort((a, b) => b.position.z - a.position.z || a.id - b.id); - this._lastZIndex = zArray[zArray.length - lengthOffset].position.z; + const lastItem = zArray[zArray.length - lengthOffset]; + + if (!lastItem) { + return; + } + + this._lastZIndex = lastItem.position.z; this._needsSort = false; } } @@ -415,18 +416,18 @@ export class Particles { }; private readonly _applyDensity = ( - options: IParticlesOptions, + options: ParticlesOptions, manualCount: number, group?: string, - groupOptions?: IParticlesOptions, + groupOptions?: ParticlesOptions, ): void => { const numberOptions = options.number; - if (!options.number.density?.enable) { + if (!numberOptions.density.enable) { if (group === undefined) { this._limit = numberOptions.limit.value; - } else if (groupOptions?.number.limit?.value ?? numberOptions.limit.value) { - this._groupLimits.set(group, groupOptions?.number.limit?.value ?? numberOptions.limit.value); + } else if (groupOptions?.number.limit.value ?? numberOptions.limit.value) { + this._groupLimits.set(group, groupOptions?.number.limit.value ?? numberOptions.limit.value); } return; @@ -471,11 +472,7 @@ export class Particles { initializer?: (particle: Particle) => boolean, ): Particle | undefined => { try { - let particle = this._pool.pop(); - - if (!particle) { - particle = new Particle(this._engine, this._container); - } + const particle = this._pool.pop() ?? new Particle(this._engine, this._container); particle.init(this._nextId, position, overrideOptions, group); @@ -503,14 +500,20 @@ export class Particles { return particle; } catch (e: unknown) { - getLogger().warning(`${errorPrefix} adding particle: ${e as string}`); + getLogger().warning(`error adding particle: ${e as string}`); } + + return undefined; }; private readonly _removeParticle = (index: number, group?: string, override?: boolean): boolean => { const particle = this._array[index]; - if (!particle || particle.group !== group) { + if (!particle) { + return false; + } + + if (particle.group !== group) { return false; } diff --git a/engine/src/Core/Retina.ts b/engine/src/Core/Retina.ts index b96a5f423b5..2e6fec49d0c 100644 --- a/engine/src/Core/Retina.ts +++ b/engine/src/Core/Retina.ts @@ -1,8 +1,7 @@ import { defaultRatio, defaultReduceFactor } from "./Utils/Constants.js"; import type { Container } from "./Container.js"; import type { Particle } from "./Particle.js"; -import { getRangeValue } from "../Utils/NumberUtils.js"; -import { isSsr } from "../Utils/Utils.js"; +import { getRangeValue } from "../Utils/MathUtils.js"; /** */ @@ -24,7 +23,7 @@ export class Retina { const container = this.container, options = container.actualOptions; - this.pixelRatio = !options.detectRetina || isSsr() ? defaultRatio : devicePixelRatio; + this.pixelRatio = options.detectRetina ? devicePixelRatio : defaultRatio; this.reduceFactor = defaultReduceFactor; const ratio = this.pixelRatio, diff --git a/engine/src/Core/Utils/Constants.ts b/engine/src/Core/Utils/Constants.ts index d0e35475367..9b86b7d37c0 100644 --- a/engine/src/Core/Utils/Constants.ts +++ b/engine/src/Core/Utils/Constants.ts @@ -15,7 +15,6 @@ export const generatedAttribute = "generated", touchCancelEvent = "touchcancel", resizeEvent = "resize", visibilityChangeEvent = "visibilitychange", - errorPrefix = "tsParticles - Error", percentDenominator = 100, half = 0.5, millisecondsToSeconds = 1000, @@ -23,7 +22,7 @@ export const generatedAttribute = "generated", x: 0, y: 0, z: 0, - }, + } as const, defaultTransform = { a: 1, b: 0, @@ -98,7 +97,6 @@ export const generatedAttribute = "generated", minStrokeWidth = 0, lFactor = 1, lMin = 0, - rgbFactor = 255, triple = 3, sextuple = 6, sNormalizedOffset = 1, diff --git a/engine/src/Core/Utils/EventListeners.ts b/engine/src/Core/Utils/EventListeners.ts index 16d4f7ea9ab..6e7944e530d 100644 --- a/engine/src/Core/Utils/EventListeners.ts +++ b/engine/src/Core/Utils/EventListeners.ts @@ -2,7 +2,6 @@ import { double, lengthOffset, millisecondsToSeconds, - minCoordinate, mouseDownEvent, mouseLeaveEvent, mouseMoveEvent, @@ -16,7 +15,7 @@ import { touchStartEvent, visibilityChangeEvent, } from "./Constants.js"; -import { executeOnSingleOrMultiple, safeMatchMedia } from "../../Utils/Utils.js"; +import { executeOnSingleOrMultiple, safeDocument, safeMatchMedia } from "../../Utils/Utils.js"; import type { Container } from "../Container.js"; import type { ICoordinates } from "../Interfaces/ICoordinates.js"; import { InteractivityDetect } from "../../Enums/InteractivityDetect.js"; @@ -31,7 +30,7 @@ import { isBoolean } from "../../Utils/TypeUtils.js"; * @param options - event listener options object */ function manageListener( - element: HTMLElement | Node | Window | MediaQueryList, + element: HTMLElement | Node | Window | MediaQueryList | typeof globalThis, event: string, handler: EventListenerOrEventListenerObject, add: boolean, @@ -74,9 +73,10 @@ interface EventListenersHandlers { * Particles container event listeners manager */ export class EventListeners { - private _canPush: boolean; + private _canPush = true; private readonly _handlers: EventListenersHandlers; + private readonly _matchMedia; private _resizeObserver?: ResizeObserver; private _resizeTimeout?: NodeJS.Timeout; private readonly _touches: Map; @@ -86,22 +86,45 @@ export class EventListeners { * @param container - the calling container */ constructor(private readonly container: Container) { - this._canPush = true; - + this._matchMedia = safeMatchMedia("(prefers-color-scheme: dark)"); this._touches = new Map(); this._handlers = { - mouseDown: (): void => this._mouseDown(), - mouseLeave: (): void => this._mouseTouchFinish(), - mouseMove: (e): void => this._mouseTouchMove(e), - mouseUp: (e): void => this._mouseTouchClick(e), - touchStart: (e): void => this._touchStart(e), - touchMove: (e): void => this._mouseTouchMove(e), - touchEnd: (e): void => this._touchEnd(e), - touchCancel: (e: Event): void => this._touchEnd(e), - touchEndClick: (e): void => this._touchEndClick(e), - visibilityChange: (): void => this._handleVisibilityChange(), - themeChange: (e): void => this._handleThemeChange(e), - oldThemeChange: (e): void => this._handleThemeChange(e), + mouseDown: (): void => { + this._mouseDown(); + }, + mouseLeave: (): void => { + this._mouseTouchFinish(); + }, + mouseMove: (e): void => { + this._mouseTouchMove(e); + }, + mouseUp: (e): void => { + this._mouseTouchClick(e); + }, + touchStart: (e): void => { + this._touchStart(e); + }, + touchMove: (e): void => { + this._mouseTouchMove(e); + }, + touchEnd: (e): void => { + this._touchEnd(e); + }, + touchCancel: (e: Event): void => { + this._touchEnd(e); + }, + touchEndClick: (e): void => { + this._touchEndClick(e); + }, + visibilityChange: (): void => { + this._handleVisibilityChange(); + }, + themeChange: (e): void => { + this._handleThemeChange(e); + }, + oldThemeChange: (e): void => { + this._handleThemeChange(e); + }, resize: (): void => { this._handleWindowResize(); }, @@ -139,15 +162,19 @@ export class EventListeners { } mouseInteractivity.clickPosition = { ...mousePos }; - mouseInteractivity.clickTime = new Date().getTime(); + mouseInteractivity.clickTime = Date.now(); const onClick = options.interactivity.events.onClick; - executeOnSingleOrMultiple(onClick.mode, mode => this.container.handleClickMode(mode)); + executeOnSingleOrMultiple(onClick.mode, mode => { + this.container.handleClickMode(mode); + }); } if (e.type === "touchend") { - setTimeout(() => this._mouseTouchFinish(), touchDelay); + setTimeout(() => { + this._mouseTouchFinish(); + }, touchDelay); } }; @@ -183,7 +210,7 @@ export class EventListeners { return; } - if (document?.hidden) { + if (safeDocument().hidden) { container.pageHidden = true; container.pause(); @@ -191,9 +218,9 @@ export class EventListeners { container.pageHidden = false; if (container.animationStatus) { - void container.play(true); + container.play(true); } else { - void container.draw(true); + container.draw(true); } } }; @@ -212,7 +239,7 @@ export class EventListeners { const handleResize = async (): Promise => { const canvas = this.container.canvas; - await canvas?.windowResize(); + await canvas.windowResize(); }; this._resizeTimeout = setTimeout( @@ -248,13 +275,13 @@ export class EventListeners { manageListener(interactivityEl, touchStartEvent, handlers.touchStart, add); manageListener(interactivityEl, touchMoveEvent, handlers.touchMove, add); - if (!options.interactivity.events.onClick.enable) { - /* el on touchend */ - manageListener(interactivityEl, touchEndEvent, handlers.touchEnd, add); - } else { + if (options.interactivity.events.onClick.enable) { manageListener(interactivityEl, touchEndEvent, handlers.touchEndClick, add); manageListener(interactivityEl, mouseUpEvent, handlers.mouseUp, add); manageListener(interactivityEl, mouseDownEvent, handlers.mouseDown, add); + } else { + /* el on touchend */ + manageListener(interactivityEl, touchEndEvent, handlers.touchEnd, add); } manageListener(interactivityEl, mouseLeaveTmpEvent, handlers.mouseLeave, add); @@ -289,34 +316,17 @@ export class EventListeners { this._manageResize(add); this._manageInteractivityListeners(mouseLeaveTmpEvent, add); - if (document) { - manageListener(document, visibilityChangeEvent, handlers.visibilityChange, add, false); - } + manageListener(document, visibilityChangeEvent, handlers.visibilityChange, add, false); }; private readonly _manageMediaMatch: (add: boolean) => void = add => { - const handlers = this._handlers, - mediaMatch = safeMatchMedia("(prefers-color-scheme: dark)"); + const handlers = this._handlers; - if (!mediaMatch) { + if (!this._matchMedia) { return; } - if (mediaMatch.addEventListener !== undefined) { - manageListener(mediaMatch, "change", handlers.themeChange, add); - - return; - } - - if (mediaMatch.addListener === undefined) { - return; - } - - if (add) { - mediaMatch.addListener(handlers.oldThemeChange); - } else { - mediaMatch.removeListener(handlers.oldThemeChange); - } + manageListener(this._matchMedia, "change", handlers.themeChange, add); }; private readonly _manageResize: (add: boolean) => void = add => { @@ -324,12 +334,12 @@ export class EventListeners { container = this.container, options = container.actualOptions; - if (!options.interactivity.events.resize) { + if (!options.interactivity.events.resize.enable) { return; } if (typeof ResizeObserver === "undefined") { - manageListener(window, resizeEvent, handlers.resize, add); + manageListener(globalThis, resizeEvent, handlers.resize, add); return; } @@ -364,13 +374,8 @@ export class EventListeners { * @internal */ private readonly _mouseDown: () => void = () => { - const { interactivity } = this.container; - - if (!interactivity) { - return; - } - - const { mouse } = interactivity; + const { interactivity } = this.container, + { mouse } = interactivity; mouse.clicking = true; mouse.downPosition = mouse.position; @@ -418,13 +423,8 @@ export class EventListeners { * Mouse/Touch event finish */ private readonly _mouseTouchFinish: () => void = () => { - const interactivity = this.container.interactivity; - - if (!interactivity) { - return; - } - - const mouse = interactivity.mouse; + const { interactivity } = this.container, + { mouse } = interactivity; delete mouse.position; delete mouse.clickPosition; @@ -446,7 +446,7 @@ export class EventListeners { interactivity = container.interactivity, canvasEl = container.canvas.element; - if (!interactivity?.element) { + if (!interactivity.element) { return; } @@ -472,7 +472,7 @@ export class EventListeners { const source = mouseEvent.target as HTMLElement, target = mouseEvent.currentTarget as HTMLElement; - if (source && target && canvasEl) { + if (canvasEl) { const sourceRect = source.getBoundingClientRect(), targetRect = target.getBoundingClientRect(), canvasRect = canvasEl.getBoundingClientRect(); @@ -483,14 +483,14 @@ export class EventListeners { }; } else { pos = { - x: mouseEvent.offsetX ?? mouseEvent.clientX, - y: mouseEvent.offsetY ?? mouseEvent.clientY, + x: mouseEvent.offsetX, + y: mouseEvent.offsetY, }; } } else if (mouseEvent.target === canvasEl) { pos = { - x: mouseEvent.offsetX ?? mouseEvent.clientX, - y: mouseEvent.offsetY ?? mouseEvent.clientY, + x: mouseEvent.offsetX, + y: mouseEvent.offsetY, }; } } else { @@ -501,9 +501,13 @@ export class EventListeners { lastTouch = touchEvent.touches[touchEvent.touches.length - lengthOffset], canvasRect = canvasEl.getBoundingClientRect(); + if (!lastTouch) { + return; + } + pos = { - x: lastTouch.clientX - (canvasRect.left ?? minCoordinate), - y: lastTouch.clientY - (canvasRect.top ?? minCoordinate), + x: lastTouch.clientX - canvasRect.left, + y: lastTouch.clientY - canvasRect.top, }; } } diff --git a/engine/src/Core/Utils/ExternalInteractorBase.ts b/engine/src/Core/Utils/ExternalInteractorBase.ts index 1cc8b47b423..57ec4b7de19 100644 --- a/engine/src/Core/Utils/ExternalInteractorBase.ts +++ b/engine/src/Core/Utils/ExternalInteractorBase.ts @@ -10,8 +10,7 @@ import type { Particle } from "../Particle.js"; export abstract class ExternalInteractorBase< TContainer extends Container = Container, TParticle extends Particle = Particle, -> implements IExternalInteractor -{ +> implements IExternalInteractor { /** * External Interactivity type */ diff --git a/engine/src/Core/Utils/ParticlesInteractorBase.ts b/engine/src/Core/Utils/ParticlesInteractorBase.ts index 836e6d9fad8..6e4eaf21dcf 100644 --- a/engine/src/Core/Utils/ParticlesInteractorBase.ts +++ b/engine/src/Core/Utils/ParticlesInteractorBase.ts @@ -10,8 +10,7 @@ import type { Particle } from "../Particle.js"; export abstract class ParticlesInteractorBase< TContainer extends Container = Container, TParticle extends Particle = Particle, -> implements IParticlesInteractor -{ +> implements IParticlesInteractor { /** * Particles interactions type */ diff --git a/engine/src/Core/Utils/QuadTree.ts b/engine/src/Core/Utils/QuadTree.ts index 9a25f797507..70137a5e4db 100644 --- a/engine/src/Core/Utils/QuadTree.ts +++ b/engine/src/Core/Utils/QuadTree.ts @@ -4,7 +4,7 @@ import type { ICoordinates } from "../Interfaces/ICoordinates.js"; import type { IDimension } from "../Interfaces/IDimension.js"; import type { Particle } from "../Particle.js"; import type { Point } from "./Point.js"; -import { getDistance } from "../../Utils/NumberUtils.js"; +import { getDistance } from "../../Utils/MathUtils.js"; /** */ diff --git a/engine/src/Core/Utils/Ranges.ts b/engine/src/Core/Utils/Ranges.ts index 68421542e81..4a961f4b58f 100644 --- a/engine/src/Core/Utils/Ranges.ts +++ b/engine/src/Core/Utils/Ranges.ts @@ -1,7 +1,7 @@ import type { ICoordinates } from "../Interfaces/ICoordinates.js"; import type { IDimension } from "../Interfaces/IDimension.js"; -import { RangeType } from "../../Types/RangeType.js"; -import { getDistance } from "../../Utils/NumberUtils.js"; +import { RangeType } from "../../Enums/RangeType.js"; +import { getDistance } from "../../Utils/MathUtils.js"; import { squareExp } from "./Constants.js"; /** diff --git a/engine/src/Core/Utils/Vectors.ts b/engine/src/Core/Utils/Vectors.ts index 400124a5242..c4a8e24221e 100644 --- a/engine/src/Core/Utils/Vectors.ts +++ b/engine/src/Core/Utils/Vectors.ts @@ -1,6 +1,5 @@ import type { ICoordinates, ICoordinates3d } from "../Interfaces/ICoordinates.js"; -import { errorPrefix, inverseFactorNumerator, none, originPoint, squareExp } from "./Constants.js"; -import { isNumber } from "../../Utils/TypeUtils.js"; +import { inverseFactorNumerator, none, originPoint, squareExp } from "./Constants.js"; /** */ @@ -22,26 +21,15 @@ export class Vector3d implements ICoordinates3d { /** * Vector3d constructor, creating an instance with the given coordinates - * @param xOrCoords - X coordinate or the whole {@link ICoordinates} object + * @param x - X coordinate * @param y - Y coordinate * @param z - Z coordinate * @internal */ - protected constructor(xOrCoords: number | ICoordinates3d | ICoordinates, y?: number, z?: number) { - if (!isNumber(xOrCoords) && xOrCoords) { - this.x = xOrCoords.x; - this.y = xOrCoords.y; - - const coords3d = xOrCoords as ICoordinates3d; - - this.z = coords3d.z ? coords3d.z : originPoint.z; - } else if (xOrCoords !== undefined && y !== undefined) { - this.x = xOrCoords; - this.y = y; - this.z = z ?? originPoint.z; - } else { - throw new Error(`${errorPrefix} Vector3d not initialized correctly`); - } + protected constructor(x = originPoint.x, y = originPoint.y, z = originPoint.z) { + this.x = x; + this.y = y; + this.z = z; } /** @@ -100,8 +88,12 @@ export class Vector3d implements ICoordinates3d { * @param z - Z coordinate * @returns the new vector created */ - static create(x: number | ICoordinates3d, y?: number, z?: number): Vector3d { - return new Vector3d(x, y, z); + static create(x: number | ICoordinates | ICoordinates3d, y?: number, z?: number): Vector3d { + if (typeof x === "number") { + return new Vector3d(x, y ?? originPoint.y, z ?? originPoint.z); + } + + return new Vector3d(x.x, x.y, Object.hasOwn(x, "z") ? (x as ICoordinates3d).z : originPoint.z); } /** @@ -268,19 +260,19 @@ export class Vector3d implements ICoordinates3d { export class Vector extends Vector3d { /** * Vector constructor, creating an instance with the given coordinates - * @param xOrCoords - X coordinate or the whole {@link ICoordinates} object + * @param x - X coordinate * @param y - Y coordinate * @internal */ - protected constructor(xOrCoords: number | ICoordinates, y?: number) { - super(xOrCoords, y, originPoint.z); + protected constructor(x = originPoint.x, y = originPoint.y) { + super(x, y, originPoint.z); } /** * A new vector, with coordinates in the origin point * @returns a new vector, with coordinates in the origin point */ - static get origin(): Vector { + static override get origin(): Vector { return Vector.create(originPoint.x, originPoint.y); } @@ -289,7 +281,7 @@ export class Vector extends Vector3d { * @param source - the vector to clone * @returns a new vector instance, created from the given one */ - static clone(source: Vector): Vector { + static override clone(source: Vector): Vector { return Vector.create(source.x, source.y); } @@ -299,7 +291,11 @@ export class Vector extends Vector3d { * @param y - Y coordinate * @returns the new vector created */ - static create(x: number | ICoordinates, y?: number): Vector { - return new Vector(x, y); + static override create(x: number | ICoordinates, y?: number): Vector { + if (typeof x === "number") { + return new Vector(x, y ?? originPoint.y); + } + + return new Vector(x.x, x.y); } } diff --git a/engine/src/Types/RangeType.ts b/engine/src/Enums/RangeType.ts similarity index 100% rename from engine/src/Types/RangeType.ts rename to engine/src/Enums/RangeType.ts diff --git a/engine/src/Options/Classes/AnimatableColor.ts b/engine/src/Options/Classes/AnimatableColor.ts index f82b2af5f5b..e51e8936b49 100644 --- a/engine/src/Options/Classes/AnimatableColor.ts +++ b/engine/src/Options/Classes/AnimatableColor.ts @@ -20,7 +20,7 @@ export class AnimatableColor extends OptionsColor implements IAnimatableColor, I this.animation = new HslAnimation(); } - static create( + static override create( source?: AnimatableColor, data?: SingleOrMultiple | RecursivePartial, ): AnimatableColor { @@ -39,20 +39,20 @@ export class AnimatableColor extends OptionsColor implements IAnimatableColor, I return color; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { return; } - const colorAnimation = data.animation as IColorAnimation; + const colorAnimation = data.animation as RecursivePartial; if (colorAnimation !== undefined) { - if (colorAnimation.enable !== undefined) { - this.animation.h.load(colorAnimation); - } else { + if (colorAnimation.enable === undefined) { this.animation.load(data.animation as IHslAnimation); + } else { + this.animation.h.load(colorAnimation); } } } diff --git a/engine/src/Options/Classes/AnimationOptions.ts b/engine/src/Options/Classes/AnimationOptions.ts index 38335a752db..884cd2c8ef0 100644 --- a/engine/src/Options/Classes/AnimationOptions.ts +++ b/engine/src/Options/Classes/AnimationOptions.ts @@ -5,7 +5,7 @@ import type { RangeValue } from "../../Types/RangeValue.js"; import type { RecursivePartial } from "../../Types/RecursivePartial.js"; import { StartValueType } from "../../Enums/Types/StartValueType.js"; import { isNull } from "../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../Utils/MathUtils.js"; export class AnimationOptions implements IAnimation, IOptionLoader { count: RangeValue; @@ -67,7 +67,7 @@ export class RangedAnimationOptions extends AnimationOptions implements IOptionL this.startValue = StartValueType.random; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/engine/src/Options/Classes/ColorAnimation.ts b/engine/src/Options/Classes/ColorAnimation.ts index 91279b7a618..98119cd3749 100644 --- a/engine/src/Options/Classes/ColorAnimation.ts +++ b/engine/src/Options/Classes/ColorAnimation.ts @@ -4,7 +4,7 @@ import type { IOptionLoader } from "../Interfaces/IOptionLoader.js"; import type { RangeValue } from "../../Types/RangeValue.js"; import type { RecursivePartial } from "../../Types/RecursivePartial.js"; import { isNull } from "../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../Utils/MathUtils.js"; /** */ @@ -18,7 +18,7 @@ export class ColorAnimation extends AnimationOptions implements IColorAnimation, this.sync = true; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/engine/src/Options/Classes/Interactivity/Modes/Modes.ts b/engine/src/Options/Classes/Interactivity/Modes/Modes.ts index 18924d075c0..d8d1ae1ade4 100644 --- a/engine/src/Options/Classes/Interactivity/Modes/Modes.ts +++ b/engine/src/Options/Classes/Interactivity/Modes/Modes.ts @@ -29,7 +29,7 @@ export class Modes implements IModes, IOptionLoader { return; } - const interactors = this._engine.interactors.get(this._container) as IExternalInteractor[]; + const interactors = this._engine.interactors.get(this._container) as IExternalInteractor[] | undefined; if (!interactors) { return; diff --git a/engine/src/Options/Classes/Options.ts b/engine/src/Options/Classes/Options.ts index 0628eddd609..20043a40ee7 100644 --- a/engine/src/Options/Classes/Options.ts +++ b/engine/src/Options/Classes/Options.ts @@ -1,7 +1,6 @@ import { deepExtend, executeOnSingleOrMultiple, safeMatchMedia } from "../../Utils/Utils.js"; import { isBoolean, isNull } from "../../Utils/TypeUtils.js"; import { Background } from "./Background/Background.js"; -import { BackgroundMask } from "./BackgroundMask/BackgroundMask.js"; import type { Container } from "../../Core/Container.js"; import type { Engine } from "../../Core/Engine.js"; import { FullScreen } from "./FullScreen/FullScreen.js"; @@ -18,7 +17,7 @@ import type { SingleOrMultiple } from "../../Types/SingleOrMultiple.js"; import { Theme } from "./Theme/Theme.js"; import { ThemeMode } from "../../Enums/Modes/ThemeMode.js"; import { loadParticlesOptions } from "../../Utils/OptionsUtils.js"; -import { setRangeValue } from "../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../Utils/MathUtils.js"; interface DefaultThemes { dark?: string; @@ -33,7 +32,6 @@ export class Options implements IOptions, IOptionLoader { autoPlay; readonly background; - readonly backgroundMask; clear: boolean; defaultThemes: DefaultThemes; delay: RangeValue; @@ -41,6 +39,7 @@ export class Options implements IOptions, IOptionLoader { duration: RangeValue; fpsLimit; readonly fullScreen; + hdr; readonly interactivity; key?: string; manualParticles: ManualParticle[]; @@ -63,7 +62,6 @@ export class Options implements IOptions, IOptionLoader { this._container = container; this.autoPlay = true; this.background = new Background(); - this.backgroundMask = new BackgroundMask(); this.clear = true; this.defaultThemes = {}; this.delay = 0; @@ -71,6 +69,7 @@ export class Options implements IOptions, IOptionLoader { this.detectRetina = true; this.duration = 0; this.fpsLimit = 120; + this.hdr = true; this.interactivity = new Interactivity(engine, container); this.manualParticles = []; this.particles = loadParticlesOptions(this._engine, this._container); @@ -93,7 +92,9 @@ export class Options implements IOptions, IOptionLoader { } if (data.preset !== undefined) { - executeOnSingleOrMultiple(data.preset, preset => this._importPreset(preset)); + executeOnSingleOrMultiple(data.preset, preset => { + this._importPreset(preset); + }); } if (data.autoPlay !== undefined) { @@ -132,6 +133,10 @@ export class Options implements IOptions, IOptionLoader { this.fpsLimit = fpsLimit; } + if (data.hdr !== undefined) { + this.hdr = data.hdr; + } + if (data.pauseOnBlur !== undefined) { this.pauseOnBlur = data.pauseOnBlur; } @@ -154,7 +159,6 @@ export class Options implements IOptions, IOptionLoader { this.fullScreen.load(fullScreen); } - this.backgroundMask.load(data.backgroundMask); this.interactivity.load(data.interactivity); if (data.manualParticles) { @@ -201,14 +205,14 @@ export class Options implements IOptions, IOptionLoader { for (const theme of data.themes) { const existingTheme = this.themes.find(t => t.name === theme.name); - if (!existingTheme) { + if (existingTheme) { + existingTheme.load(theme); + } else { const optTheme = new Theme(); optTheme.load(theme); this.themes.push(optTheme); - } else { - existingTheme.load(theme); } } } @@ -221,7 +225,7 @@ export class Options implements IOptions, IOptionLoader { this.load(defaultOptions); const responsiveOptions = this.responsive.find(t => - t.mode === ResponsiveMode.screen && screen ? t.maxWidth > screen.availWidth : t.maxWidth * pxRatio > width, + t.mode === ResponsiveMode.screen ? t.maxWidth > screen.availWidth : t.maxWidth * pxRatio > width, ); this.load(responsiveOptions?.options); diff --git a/engine/src/Options/Classes/OptionsColor.ts b/engine/src/Options/Classes/OptionsColor.ts index bb4e5a02948..b0706e37903 100644 --- a/engine/src/Options/Classes/OptionsColor.ts +++ b/engine/src/Options/Classes/OptionsColor.ts @@ -1,4 +1,14 @@ -import type { IRangeHsl, IRangeHsv, IRangeRgb, IRangeValueColor } from "../../Core/Interfaces/Colors.js"; +import type { + IRangeHsl, + IRangeHsv, + IRangeHwb, + IRangeLab, + IRangeLch, + IRangeOklab, + IRangeOklch, + IRangeRgb, + IRangeValueColor, +} from "../../Core/Interfaces/Colors.js"; import { isArray, isNull, isString } from "../../Utils/TypeUtils.js"; import type { IOptionLoader } from "../Interfaces/IOptionLoader.js"; import type { IOptionsColor } from "../Interfaces/IOptionsColor.js"; @@ -9,7 +19,18 @@ import type { SingleOrMultiple } from "../../Types/SingleOrMultiple.js"; * [[include:Color.md]] */ export class OptionsColor implements IOptionsColor, IOptionLoader { - value: SingleOrMultiple | IRangeValueColor | IRangeRgb | IRangeHsl | IRangeHsv>; + value: SingleOrMultiple< + | SingleOrMultiple + | IRangeValueColor + | IRangeRgb + | IRangeHsl + | IRangeHsv + | IRangeHwb + | IRangeLab + | IRangeLch + | IRangeOklab + | IRangeOklch + >; constructor() { this.value = ""; diff --git a/engine/src/Options/Classes/Particles/Move/Move.ts b/engine/src/Options/Classes/Particles/Move/Move.ts index d7946764c78..555d847f677 100644 --- a/engine/src/Options/Classes/Particles/Move/Move.ts +++ b/engine/src/Options/Classes/Particles/Move/Move.ts @@ -8,12 +8,11 @@ import { MoveAttract } from "./MoveAttract.js"; import { MoveCenter } from "./MoveCenter.js"; import { MoveGravity } from "./MoveGravity.js"; import { MovePath } from "./Path/MovePath.js"; -import { MoveTrail } from "./MoveTrail.js"; import { OutModes } from "./OutModes.js"; import type { RangeValue } from "../../../../Types/RangeValue.js"; import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; import { Spin } from "./Spin.js"; -import { setRangeValue } from "../../../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../../../Utils/MathUtils.js"; /** * [[include:Options/Particles/Move.md]] @@ -35,7 +34,6 @@ export class Move implements IMove, IOptionLoader { speed: RangeValue; readonly spin; straight; - readonly trail; vibrate; warp; @@ -56,7 +54,6 @@ export class Move implements IMove, IOptionLoader { this.speed = 2; this.spin = new Spin(); this.straight = false; - this.trail = new MoveTrail(); this.vibrate = false; this.warp = false; } @@ -130,8 +127,6 @@ export class Move implements IMove, IOptionLoader { this.straight = data.straight; } - this.trail.load(data.trail); - if (data.vibrate !== undefined) { this.vibrate = data.vibrate; } diff --git a/engine/src/Options/Classes/Particles/Move/MoveAngle.ts b/engine/src/Options/Classes/Particles/Move/MoveAngle.ts index 4579f7bc14c..4b2e4f8cfab 100644 --- a/engine/src/Options/Classes/Particles/Move/MoveAngle.ts +++ b/engine/src/Options/Classes/Particles/Move/MoveAngle.ts @@ -3,7 +3,7 @@ import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; import type { RangeValue } from "../../../../Types/RangeValue.js"; import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; import { isNull } from "../../../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../../../Utils/MathUtils.js"; /** */ diff --git a/engine/src/Options/Classes/Particles/Move/MoveAttract.ts b/engine/src/Options/Classes/Particles/Move/MoveAttract.ts index 38933d88196..42e7f6416ef 100644 --- a/engine/src/Options/Classes/Particles/Move/MoveAttract.ts +++ b/engine/src/Options/Classes/Particles/Move/MoveAttract.ts @@ -4,7 +4,7 @@ import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; import type { RangeValue } from "../../../../Types/RangeValue.js"; import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; import { isNull } from "../../../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../../../Utils/MathUtils.js"; /** */ diff --git a/engine/src/Options/Classes/Particles/Move/MoveGravity.ts b/engine/src/Options/Classes/Particles/Move/MoveGravity.ts index df4eab4812c..2269a83b70d 100644 --- a/engine/src/Options/Classes/Particles/Move/MoveGravity.ts +++ b/engine/src/Options/Classes/Particles/Move/MoveGravity.ts @@ -3,7 +3,7 @@ import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; import type { RangeValue } from "../../../../Types/RangeValue.js"; import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; import { isNull } from "../../../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../../../Utils/MathUtils.js"; export class MoveGravity implements IMoveGravity, IOptionLoader { acceleration: RangeValue; diff --git a/engine/src/Options/Classes/Particles/Move/MoveTrail.ts b/engine/src/Options/Classes/Particles/Move/MoveTrail.ts deleted file mode 100644 index 316c9a857f5..00000000000 --- a/engine/src/Options/Classes/Particles/Move/MoveTrail.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { IMoveTrail } from "../../../Interfaces/Particles/Move/IMoveTrail.js"; -import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; -import { MoveTrailFill } from "./MoveTrailFill.js"; -import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; -import { isNull } from "../../../../Utils/TypeUtils.js"; - -/** - */ -export class MoveTrail implements IMoveTrail, IOptionLoader { - enable; - readonly fill; - length; - - constructor() { - this.enable = false; - this.length = 10; - this.fill = new MoveTrailFill(); - } - - load(data?: RecursivePartial): void { - if (isNull(data)) { - return; - } - - if (data.enable !== undefined) { - this.enable = data.enable; - } - - if (data.fill !== undefined) { - this.fill.load(data.fill); - } - - if (data.length !== undefined) { - this.length = data.length; - } - } -} diff --git a/engine/src/Options/Classes/Particles/Move/MoveTrailFill.ts b/engine/src/Options/Classes/Particles/Move/MoveTrailFill.ts deleted file mode 100644 index 50202eb5ae2..00000000000 --- a/engine/src/Options/Classes/Particles/Move/MoveTrailFill.ts +++ /dev/null @@ -1,24 +0,0 @@ -import type { IMoveTrailFill } from "../../../Interfaces/Particles/Move/IMoveTrailFill.js"; -import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; -import { OptionsColor } from "../../OptionsColor.js"; -import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; -import { isNull } from "../../../../Utils/TypeUtils.js"; - -export class MoveTrailFill implements IMoveTrailFill, IOptionLoader { - color?: OptionsColor; - image?: string; - - load(data?: RecursivePartial): void { - if (isNull(data)) { - return; - } - - if (data.color !== undefined) { - this.color = OptionsColor.create(this.color, data.color); - } - - if (data.image !== undefined) { - this.image = data.image; - } - } -} diff --git a/engine/src/Options/Classes/Particles/Move/Spin.ts b/engine/src/Options/Classes/Particles/Move/Spin.ts index afa007b8c70..314afb7055d 100644 --- a/engine/src/Options/Classes/Particles/Move/Spin.ts +++ b/engine/src/Options/Classes/Particles/Move/Spin.ts @@ -5,7 +5,7 @@ import type { RangeValue } from "../../../../Types/RangeValue.js"; import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; import { deepExtend } from "../../../../Utils/Utils.js"; import { isNull } from "../../../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../../../Utils/MathUtils.js"; export class Spin implements ISpin, IOptionLoader { acceleration: RangeValue; diff --git a/engine/src/Options/Classes/Particles/Opacity/Opacity.ts b/engine/src/Options/Classes/Particles/Opacity/Opacity.ts index 01ce1071edc..5dd7ccc4402 100644 --- a/engine/src/Options/Classes/Particles/Opacity/Opacity.ts +++ b/engine/src/Options/Classes/Particles/Opacity/Opacity.ts @@ -9,7 +9,7 @@ import { isNull } from "../../../../Utils/TypeUtils.js"; * [[include:Options/Particles/Opacity.md]] */ export class Opacity extends RangedAnimationValueWithRandom implements IOpacity, IOptionLoader { - readonly animation; + override readonly animation; constructor() { super(); @@ -17,7 +17,7 @@ export class Opacity extends RangedAnimationValueWithRandom implements IOpacity, this.value = 1; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/engine/src/Options/Classes/Particles/Opacity/OpacityAnimation.ts b/engine/src/Options/Classes/Particles/Opacity/OpacityAnimation.ts index fcea41061cb..72de8fce9ee 100644 --- a/engine/src/Options/Classes/Particles/Opacity/OpacityAnimation.ts +++ b/engine/src/Options/Classes/Particles/Opacity/OpacityAnimation.ts @@ -19,7 +19,7 @@ export class OpacityAnimation this.speed = 2; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/engine/src/Options/Classes/Particles/ParticlesOptions.ts b/engine/src/Options/Classes/Particles/ParticlesOptions.ts index e84dacfcd02..e1c6a3e8b1e 100644 --- a/engine/src/Options/Classes/Particles/ParticlesOptions.ts +++ b/engine/src/Options/Classes/Particles/ParticlesOptions.ts @@ -1,6 +1,5 @@ import { deepExtend, executeOnSingleOrMultiple } from "../../../Utils/Utils.js"; import { AnimatableColor } from "../AnimatableColor.js"; -import { Collisions } from "./Collisions/Collisions.js"; import type { Container } from "../../../Core/Container.js"; import { Effect } from "./Effect/Effect.js"; import type { Engine } from "../../../Core/Engine.js"; @@ -13,7 +12,6 @@ import { ParticlesBounce } from "./Bounce/ParticlesBounce.js"; import type { ParticlesGroups } from "../../../Types/ParticlesGroups.js"; import { ParticlesNumber } from "./Number/ParticlesNumber.js"; import type { RecursivePartial } from "../../../Types/RecursivePartial.js"; -import { Shadow } from "./Shadow.js"; import { Shape } from "./Shape/Shape.js"; import type { SingleOrMultiple } from "../../../Types/SingleOrMultiple.js"; import { Size } from "./Size/Size.js"; @@ -28,7 +26,6 @@ export class ParticlesOptions implements IParticlesOptions, IOptionLoader; @@ -51,7 +47,6 @@ export class ParticlesOptions implements IParticlesOptions, IOptionLoader; diff --git a/engine/src/Options/Classes/Particles/Shadow.ts b/engine/src/Options/Classes/Particles/Shadow.ts deleted file mode 100644 index b925f3e29a2..00000000000 --- a/engine/src/Options/Classes/Particles/Shadow.ts +++ /dev/null @@ -1,56 +0,0 @@ -import type { ICoordinates } from "../../../Core/Interfaces/ICoordinates.js"; -import type { IOptionLoader } from "../../Interfaces/IOptionLoader.js"; -import type { IShadow } from "../../Interfaces/Particles/IShadow.js"; -import { OptionsColor } from "../OptionsColor.js"; -import type { RecursivePartial } from "../../../Types/RecursivePartial.js"; -import { isNull } from "../../../Utils/TypeUtils.js"; - -/** - * [[include:Shadow.md]] - */ -export class Shadow implements IShadow, IOptionLoader { - blur; - color; - enable; - offset: ICoordinates; - - constructor() { - this.blur = 0; - this.color = new OptionsColor(); - this.enable = false; - this.offset = { - x: 0, - y: 0, - }; - - this.color.value = "#000"; - } - - load(data?: RecursivePartial): void { - if (isNull(data)) { - return; - } - - if (data.blur !== undefined) { - this.blur = data.blur; - } - - this.color = OptionsColor.create(this.color, data.color); - - if (data.enable !== undefined) { - this.enable = data.enable; - } - - if (data.offset === undefined) { - return; - } - - if (data.offset.x !== undefined) { - this.offset.x = data.offset.x; - } - - if (data.offset.y !== undefined) { - this.offset.y = data.offset.y; - } - } -} diff --git a/engine/src/Options/Classes/Particles/Size/Size.ts b/engine/src/Options/Classes/Particles/Size/Size.ts index 7fd645941f9..68deb4397a6 100644 --- a/engine/src/Options/Classes/Particles/Size/Size.ts +++ b/engine/src/Options/Classes/Particles/Size/Size.ts @@ -9,7 +9,7 @@ import { isNull } from "../../../../Utils/TypeUtils.js"; * [[include:Options/Particles/Size.md]] */ export class Size extends RangedAnimationValueWithRandom implements ISize, IOptionLoader { - readonly animation; + override readonly animation; constructor() { super(); @@ -17,7 +17,7 @@ export class Size extends RangedAnimationValueWithRandom implements ISize, IOpti this.value = 3; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/engine/src/Options/Classes/Particles/Size/SizeAnimation.ts b/engine/src/Options/Classes/Particles/Size/SizeAnimation.ts index ad91b511838..7ad5b1a44f0 100644 --- a/engine/src/Options/Classes/Particles/Size/SizeAnimation.ts +++ b/engine/src/Options/Classes/Particles/Size/SizeAnimation.ts @@ -17,7 +17,7 @@ export class SizeAnimation extends RangedAnimationOptions implements ISizeAnimat this.speed = 5; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/engine/src/Options/Classes/Particles/Stroke.ts b/engine/src/Options/Classes/Particles/Stroke.ts index 73e80d07505..656cfba370a 100644 --- a/engine/src/Options/Classes/Particles/Stroke.ts +++ b/engine/src/Options/Classes/Particles/Stroke.ts @@ -4,7 +4,7 @@ import type { IStroke } from "../../Interfaces/Particles/IStroke.js"; import type { RangeValue } from "../../../Types/RangeValue.js"; import type { RecursivePartial } from "../../../Types/RecursivePartial.js"; import { isNull } from "../../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../../Utils/MathUtils.js"; /** * [[include:Options/Particles/Stroke.md]] diff --git a/engine/src/Options/Classes/Particles/ZIndex/ZIndex.ts b/engine/src/Options/Classes/Particles/ZIndex/ZIndex.ts index 88bfca6b5b9..b018a742335 100644 --- a/engine/src/Options/Classes/Particles/ZIndex/ZIndex.ts +++ b/engine/src/Options/Classes/Particles/ZIndex/ZIndex.ts @@ -18,7 +18,7 @@ export class ZIndex extends ValueWithRandom implements IZIndex, IOptionLoader): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/engine/src/Options/Classes/ValueWithRandom.ts b/engine/src/Options/Classes/ValueWithRandom.ts index 04dbff0b598..deef5497b31 100644 --- a/engine/src/Options/Classes/ValueWithRandom.ts +++ b/engine/src/Options/Classes/ValueWithRandom.ts @@ -8,7 +8,7 @@ import type { IOptionLoader } from "../Interfaces/IOptionLoader.js"; import type { RangeValue } from "../../Types/RangeValue.js"; import type { RecursivePartial } from "../../Types/RecursivePartial.js"; import { isNull } from "../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../Utils/NumberUtils.js"; +import { setRangeValue } from "../../Utils/MathUtils.js"; export class ValueWithRandom implements IValueWithRandom, IOptionLoader { value: RangeValue; @@ -37,7 +37,7 @@ export class AnimationValueWithRandom extends ValueWithRandom implements IOption this.animation = new AnimationOptions(); } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { @@ -56,7 +56,7 @@ export class RangedAnimationValueWithRandom extends AnimationValueWithRandom implements IOptionLoader { - readonly animation: RangedAnimationOptions; + override readonly animation: RangedAnimationOptions; constructor() { super(); @@ -64,7 +64,7 @@ export class RangedAnimationValueWithRandom this.animation = new RangedAnimationOptions(); } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); } } diff --git a/engine/src/Options/Interfaces/IOptions.ts b/engine/src/Options/Interfaces/IOptions.ts index ee61322acd7..9dc47ff4cb6 100644 --- a/engine/src/Options/Interfaces/IOptions.ts +++ b/engine/src/Options/Interfaces/IOptions.ts @@ -1,7 +1,6 @@ // eslint-disable-next-line @typescript-eslint/no-unused-vars import type { Container } from "../../Core/Container.js"; import type { IBackground } from "./Background/IBackground.js"; -import type { IBackgroundMask } from "./BackgroundMask/IBackgroundMask.js"; import type { IFullScreen } from "./FullScreen/IFullScreen.js"; import type { IInteractivity } from "./Interactivity/IInteractivity.js"; import type { IManualParticle } from "./IManualParticle.js"; @@ -32,11 +31,6 @@ export interface IOptions { */ background: IBackground; - /** - * Background Mask options, what's behind the canvas will become hidden and particles will uncover it - */ - backgroundMask: IBackgroundMask; - /** * Clears the canvas on every frame if enabled */ @@ -67,6 +61,11 @@ export interface IOptions { */ fullScreen: RecursivePartial | boolean; + /** + * Enables or disables the HDR mode, if enabled the particles will be rendered in a higher color precision + */ + hdr: boolean; + /** * The particles interaction options */ diff --git a/engine/src/Options/Interfaces/Particles/IParticlesOptions.ts b/engine/src/Options/Interfaces/Particles/IParticlesOptions.ts index 24c3f800927..703d7089fde 100644 --- a/engine/src/Options/Interfaces/Particles/IParticlesOptions.ts +++ b/engine/src/Options/Interfaces/Particles/IParticlesOptions.ts @@ -2,14 +2,12 @@ * [[include:Options/Particles.md]] */ import type { IAnimatableColor } from "../IAnimatableColor.js"; -import type { ICollisions } from "./Collisions/ICollisions.js"; import type { IEffect } from "./Effect/IEffect.js"; import type { IInteractivity } from "../Interactivity/IInteractivity.js"; import type { IMove } from "./Move/IMove.js"; import type { IOpacity } from "./Opacity/IOpacity.js"; import type { IParticlesBounce } from "./Bounce/IParticlesBounce.js"; import type { IParticlesNumber } from "./Number/IParticlesNumber.js"; -import type { IShadow } from "./IShadow.js"; import type { IShape } from "./Shape/IShape.js"; import type { ISize } from "./Size/ISize.js"; import type { IStroke } from "./IStroke.js"; @@ -29,11 +27,6 @@ export interface IParticlesOptions { */ bounce: IParticlesBounce; - /** - * Particles collisions options - */ - collisions: ICollisions; - /** * Particles color options */ @@ -74,11 +67,6 @@ export interface IParticlesOptions { */ reduceDuplicates: boolean; - /** - * Particles shadow options - */ - shadow: IShadow; - /** * Particles shape options */ diff --git a/engine/src/Options/Interfaces/Particles/IShadow.ts b/engine/src/Options/Interfaces/Particles/IShadow.ts deleted file mode 100644 index 6f4c42ab519..00000000000 --- a/engine/src/Options/Interfaces/Particles/IShadow.ts +++ /dev/null @@ -1,27 +0,0 @@ -import type { ICoordinates } from "../../../Core/Interfaces/ICoordinates.js"; -import type { IOptionsColor } from "../IOptionsColor.js"; - -/** - * [[include:Shadow.md]] - */ -export interface IShadow { - /** - * The blur of the shadow. - */ - blur: number; - - /** - * The color of the shadow. - */ - color: string | IOptionsColor; - - /** - * Sets if the shadow is enabled. - */ - enable: boolean; - - /** - * The distance of the shadow from the particle. - */ - offset: ICoordinates; -} diff --git a/engine/src/Options/Interfaces/Particles/Move/IMove.ts b/engine/src/Options/Interfaces/Particles/Move/IMove.ts index 7c54bc19e69..80967b8a33a 100644 --- a/engine/src/Options/Interfaces/Particles/Move/IMove.ts +++ b/engine/src/Options/Interfaces/Particles/Move/IMove.ts @@ -5,7 +5,6 @@ import type { IMoveAttract } from "./IMoveAttract.js"; import type { IMoveCenter } from "./IMoveCenter.js"; import type { IMoveGravity } from "./IMoveGravity.js"; import type { IMovePath } from "./Path/IMovePath.js"; -import type { IMoveTrail } from "./IMoveTrail.js"; import type { IOutModes } from "./IOutModes.js"; import type { ISpin } from "./ISpin.js"; import type { OutMode } from "../../../../Enums/Modes/OutMode.js"; @@ -95,11 +94,6 @@ export interface IMove { */ straight: boolean; - /** - * The particles trail options. - */ - trail: IMoveTrail; - /** * Sets if the particles will vibrate or not. */ diff --git a/engine/src/Options/Interfaces/Particles/Move/IMoveTrail.ts b/engine/src/Options/Interfaces/Particles/Move/IMoveTrail.ts deleted file mode 100644 index 2f03526e305..00000000000 --- a/engine/src/Options/Interfaces/Particles/Move/IMoveTrail.ts +++ /dev/null @@ -1,11 +0,0 @@ -import type { IMoveTrailFill } from "./IMoveTrailFill.js"; - -/** - */ -export interface IMoveTrail { - enable: boolean; - - fill: IMoveTrailFill; - - length: number; -} diff --git a/engine/src/Options/Interfaces/Particles/Move/IMoveTrailFill.ts b/engine/src/Options/Interfaces/Particles/Move/IMoveTrailFill.ts deleted file mode 100644 index 036531a61a8..00000000000 --- a/engine/src/Options/Interfaces/Particles/Move/IMoveTrailFill.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { IOptionsColor } from "../../IOptionsColor.js"; - -export interface IMoveTrailFill { - color?: string | IOptionsColor; - image?: string; -} diff --git a/engine/src/Utils/CanvasUtils.ts b/engine/src/Utils/CanvasUtils.ts index 611a69f8988..301305d8f39 100644 --- a/engine/src/Utils/CanvasUtils.ts +++ b/engine/src/Utils/CanvasUtils.ts @@ -1,11 +1,4 @@ -import { - defaultAngle, - defaultTransform, - identity, - lFactor, - minStrokeWidth, - originPoint, -} from "../Core/Utils/Constants.js"; +import { defaultTransform, identity, lFactor, minStrokeWidth, originPoint } from "../Core/Utils/Constants.js"; import { AlterType } from "../Enums/Types/AlterType.js"; import type { Container } from "../Core/Container.js"; import type { IContainerPlugin } from "../Core/Interfaces/IContainerPlugin.js"; @@ -15,7 +8,20 @@ import type { IDimension } from "../Core/Interfaces/IDimension.js"; import type { IDrawParticleParams } from "../Core/Interfaces/IDrawParticleParams.js"; import type { IHsl } from "../Core/Interfaces/Colors.js"; import type { Particle } from "../Core/Particle.js"; -import { getStyleFromRgb } from "./ColorUtils.js"; + +/** + * Clear the context after the given plugin draws in the canvas. + * @param context - The canvas context. + * @param plugin - The plugin to clear. + * @param delta - this variable contains the delta between the current frame and the previous frame + */ +export function clearDrawPlugin(context: CanvasRenderingContext2D, plugin: IContainerPlugin, delta: IDelta): void { + if (!plugin.clearDraw) { + return; + } + + plugin.clearDraw(context, delta); +} /** * Draws a line between two points using canvas API in the given context. @@ -77,26 +83,14 @@ export function clear(context: CanvasRenderingContext2D, dimension: IDimension): * @param data - The function parameters. */ export function drawParticle(data: IDrawParticleParams): void { - const { - container, - context, - particle, - delta, - colorStyles, - backgroundMask, - composite, - radius, - opacity, - shadow, - transform, - } = data, + const { container, context, particle, delta, colorStyles, radius, opacity, transform } = data, pos = particle.getPosition(), - angle = particle.rotation + (particle.pathRotation ? particle.velocity.angle : defaultAngle), + angle = particle.getAngle(), rotateData = { sin: Math.sin(angle), cos: Math.cos(angle), }, - rotating = !!angle, + rotating = particle.isRotating, transformData = { a: rotateData.cos * (transform.a ?? defaultTransform.a), b: rotating ? rotateData.sin * (transform.b ?? identity) : (transform.b ?? defaultTransform.b), @@ -106,19 +100,6 @@ export function drawParticle(data: IDrawParticleParams): void { context.setTransform(transformData.a, transformData.b, transformData.c, transformData.d, pos.x, pos.y); - if (backgroundMask) { - context.globalCompositeOperation = composite; - } - - const shadowColor = particle.shadowColor; - - if (shadow.enable && shadowColor) { - context.shadowBlur = shadow.blur; - context.shadowColor = getStyleFromRgb(shadowColor); - context.shadowOffsetX = shadow.offset.x; - context.shadowOffsetY = shadow.offset.y; - } - if (colorStyles.fill) { context.fillStyle = colorStyles.fill; } @@ -142,11 +123,11 @@ export function drawParticle(data: IDrawParticleParams): void { strokeWidth, }; + drawBeforeEffect(drawData); + drawShapeBeforeDraw(drawData); drawShape(drawData); drawShapeAfterDraw(drawData); - drawEffect(drawData); - - context.globalCompositeOperation = "source-over"; + drawAfterEffect(drawData); context.resetTransform(); } @@ -199,11 +180,42 @@ interface DrawShapeData { } /** - * Draws the particle shape using the plugin's shape renderer. + * Draws the particle effect using the plugin's shape renderer. * @param data - the function parameters. */ -export function drawEffect(data: DrawShapeData): void { - const { container, context, particle, radius, opacity, delta, transformData } = data; +export function drawAfterEffect(data: DrawShapeData): void { + const { container, context, particle, radius, opacity, strokeWidth, delta, transformData } = data; + + if (!particle.effect) { + return; + } + + const drawer = container.effectDrawers.get(particle.effect), + drawFunc = drawer?.drawAfter; + + if (!drawFunc) { + return; + } + + drawFunc({ + context, + particle, + radius, + opacity, + delta, + pixelRatio: container.retina.pixelRatio, + fill: particle.shapeFill, + stroke: strokeWidth > minStrokeWidth || !particle.shapeFill, + transformData: { ...transformData }, + }); +} + +/** + * Draws the particle effect using the plugin's shape renderer. + * @param data - the function parameters. + */ +export function drawBeforeEffect(data: DrawShapeData): void { + const { container, context, particle, radius, opacity, strokeWidth, delta, transformData } = data; if (!particle.effect) { return; @@ -211,17 +223,19 @@ export function drawEffect(data: DrawShapeData): void { const drawer = container.effectDrawers.get(particle.effect); - if (!drawer) { + if (!drawer?.drawBefore) { return; } - drawer.draw({ + drawer.drawBefore({ context, particle, radius, opacity, delta, pixelRatio: container.retina.pixelRatio, + fill: particle.shapeFill, + stroke: strokeWidth > minStrokeWidth || !particle.shapeFill, transformData: { ...transformData }, }); } @@ -252,6 +266,8 @@ export function drawShape(data: DrawShapeData): void { opacity, delta, pixelRatio: container.retina.pixelRatio, + fill: particle.shapeFill, + stroke: strokeWidth > minStrokeWidth || !particle.shapeFill, transformData: { ...transformData }, }); @@ -273,7 +289,7 @@ export function drawShape(data: DrawShapeData): void { * @param data - the function parameters. */ export function drawShapeAfterDraw(data: DrawShapeData): void { - const { container, context, particle, radius, opacity, delta, transformData } = data; + const { container, context, particle, radius, opacity, strokeWidth, delta, transformData } = data; if (!particle.shape) { return; @@ -292,6 +308,38 @@ export function drawShapeAfterDraw(data: DrawShapeData): void { opacity, delta, pixelRatio: container.retina.pixelRatio, + fill: particle.shapeFill, + stroke: strokeWidth > minStrokeWidth || !particle.shapeFill, + transformData: { ...transformData }, + }); +} + +/** + * Calls the beforeDraw function of the plugin's shape renderer, this is called before drawShape.' + * @param data - the function parameters. + */ +export function drawShapeBeforeDraw(data: DrawShapeData): void { + const { container, context, particle, radius, opacity, strokeWidth, delta, transformData } = data; + + if (!particle.shape) { + return; + } + + const drawer = container.shapeDrawers.get(particle.shape); + + if (!drawer?.beforeDraw) { + return; + } + + drawer.beforeDraw({ + context, + particle, + radius, + opacity, + delta, + pixelRatio: container.retina.pixelRatio, + fill: particle.shapeFill, + stroke: strokeWidth > minStrokeWidth || !particle.shapeFill, transformData: { ...transformData }, }); } diff --git a/engine/src/Utils/ColorUtils.ts b/engine/src/Utils/ColorUtils.ts index 95aedf17ce6..308df32592f 100644 --- a/engine/src/Utils/ColorUtils.ts +++ b/engine/src/Utils/ColorUtils.ts @@ -2,13 +2,14 @@ import type { IColor, IHsl, IHsla, IRangeColor, IRgb, IRgba } from "../Core/Inte import { clamp, getRandom, + getRandomInRange, getRangeMax, getRangeMin, getRangeValue, mix, - randomInRange, + randomInRangeValue, setRangeValue, -} from "./NumberUtils.js"; +} from "./MathUtils.js"; import { decayOffset, defaultLoops, @@ -29,7 +30,6 @@ import { percentDenominator, phaseNumerator, randomColorValue, - rgbFactor, rgbMax, sMax, sMin, @@ -62,10 +62,12 @@ function stringToRgba(engine: Engine, input: string): IRgba | undefined { } for (const manager of engine.colorManagers.values()) { - if (input.startsWith(manager.stringPrefix)) { + if (manager.accepts(input)) { return manager.parseString(input); } } + + return undefined; } /** @@ -93,8 +95,14 @@ export function rangeColorToRgb( } if (isArray(color.value)) { + const value = itemFromArray(color.value, index, useIndex); + + if (!value) { + return; + } + return rangeColorToRgb(engine, { - value: itemFromArray(color.value, index, useIndex), + value, }); } @@ -105,6 +113,8 @@ export function rangeColorToRgb( return res; } } + + return undefined; } /** @@ -127,8 +137,14 @@ export function colorToRgb(engine: Engine, input?: string | IColor, index?: numb } if (isArray(color.value)) { + const value = itemFromArray(color.value, index, useIndex); + + if (!value) { + return; + } + return colorToRgb(engine, { - value: itemFromArray(color.value, index, useIndex), + value, }); } @@ -139,6 +155,8 @@ export function colorToRgb(engine: Engine, input?: string | IColor, index?: numb return res; } } + + return undefined; } /** @@ -201,10 +219,13 @@ export function rgbToHsl(color: IRgb): IHsl { // Calculate S: res.s = res.l < half ? (max - min) / (max + min) : (max - min) / (double - max - min); // Calculate H: - res.h = - r1 === max - ? (g1 - b1) / (max - min) - : (res.h = g1 === max ? double + (b1 - r1) / (max - min) : double * double + (r1 - g1) / (max - min)); + if (r1 === max) { + res.h = (g1 - b1) / (max - min); + } else if (g1 === max) { + res.h = double + (b1 - r1) / (max - min); + } else { + res.h = double * double + (r1 - g1) / (max - min); + } } res.l *= lMax; @@ -259,7 +280,8 @@ export function hslToRgb(hsl: IHsl): IRgb { if (s === sMin) { // If saturation is 0, the color is grayscale - const grayscaleValue = Math.round(lNormalized * rgbFactor); + const grayscaleValue = Math.round(lNormalized * rgbMax); + return { r: grayscaleValue, g: grayscaleValue, b: grayscaleValue }; } @@ -297,9 +319,9 @@ export function hslToRgb(hsl: IHsl): IRgb { : lNormalized + sNormalized - lNormalized * sNormalized, temp2 = double * lNormalized - temp1, phaseThird = phaseNumerator / triple, - red = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized + phaseThird)), - green = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized)), - blue = Math.min(rgbFactor, rgbFactor * channel(temp2, temp1, hNormalized - phaseThird)); + red = Math.min(rgbMax, rgbMax * channel(temp2, temp1, hNormalized + phaseThird)), + green = Math.min(rgbMax, rgbMax * channel(temp2, temp1, hNormalized)), + blue = Math.min(rgbMax, rgbMax * channel(temp2, temp1, hNormalized - phaseThird)); return { r: Math.round(red), g: Math.round(green), b: Math.round(blue) }; } @@ -327,33 +349,76 @@ export function hslaToRgba(hsla: IHsla): IRgba { */ export function getRandomRgbColor(min?: number): IRgb { const fixedMin = min ?? defaultRgbMin, - fixedMax = rgbMax + identity; + fixedMax = rgbMax + identity, + getRgbInRangeValue = (): number => Math.floor(getRandomInRange(fixedMin, fixedMax)); return { - b: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))), - g: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))), - r: Math.floor(randomInRange(setRangeValue(fixedMin, fixedMax))), + b: getRgbInRangeValue(), + g: getRgbInRangeValue(), + r: getRgbInRangeValue(), }; } +/** + * Gets a CSS style string from a {@link IRgb} object and opacity value + * @param color - the {@link IRgb} input color + * @param hdr - whether the color is in HDR mode or not + * @param opacity - the opacity value + * @returns the CSS style string + */ +export function getStyleFromRgb(color: IRgb, hdr: boolean, opacity?: number): string { + return hdr ? getHdrStyleFromRgb(color, opacity) : getSdrStyleFromRgb(color, opacity); +} + +/** + * Gets a CSS style string from a {@link IRgb} object and opacity value + * @param color - the {@link IRgb} input color + * @param opacity - the opacity value + * @returns the CSS style string + */ +function getHdrStyleFromRgb(color: IRgb, opacity?: number): string { + return `color(display-p3 ${(color.r / rgbMax).toString()} ${(color.g / rgbMax).toString()} ${(color.b / rgbMax).toString()} / ${(opacity ?? defaultOpacity).toString()})`; +} + /** * Gets a CSS style string from a {@link IRgb} object and opacity value * @param color - the {@link IRgb} input color * @param opacity - the opacity value * @returns the CSS style string */ -export function getStyleFromRgb(color: IRgb, opacity?: number): string { - return `rgba(${color.r}, ${color.g}, ${color.b}, ${opacity ?? defaultOpacity})`; +function getSdrStyleFromRgb(color: IRgb, opacity?: number): string { + return `rgba(${color.r.toString()}, ${color.g.toString()}, ${color.b.toString()}, ${(opacity ?? defaultOpacity).toString()})`; } /** * Gets a CSS style string from a {@link IHsl} object and opacity value * @param color - the {@link IHsl} input color + * @param hdr - whether the color is in HDR mode or not * @param opacity - the opacity value * @returns the CSS style string */ -export function getStyleFromHsl(color: IHsl, opacity?: number): string { - return `hsla(${color.h}, ${color.s}%, ${color.l}%, ${opacity ?? defaultOpacity})`; +export function getStyleFromHsl(color: IHsl, hdr: boolean, opacity?: number): string { + return hdr ? getHdrStyleFromHsl(color, opacity) : getSdrStyleFromHsl(color, opacity); +} + +/** + * Gets a CSS style string from a {@link IHsl} object and opacity value + * @param color - the {@link IHsl} input color + * @param opacity - the opacity value + * @returns the CSS style string + */ +function getHdrStyleFromHsl(color: IHsl, opacity?: number): string { + return getHdrStyleFromRgb(hslToRgb(color), opacity); +} + +/** + * Gets a CSS style string from a {@link IHsl} object and opacity value + * @param color - the {@link IHsl} input color + * @param opacity - the opacity value + * @returns the CSS style string + */ +function getSdrStyleFromHsl(color: IHsl, opacity?: number): string { + return `hsla(${color.h.toString()}, ${color.s.toString()}%, ${color.l.toString()}%, ${(opacity ?? defaultOpacity).toString()})`; } /** @@ -367,11 +432,11 @@ export function colorMix(color1: IRgb | IHsl, color2: IRgb | IHsl, size1: number let rgb1 = color1 as IRgb, rgb2 = color2 as IRgb; - if (rgb1.r === undefined) { + if (!Object.hasOwn(rgb1, "r")) { rgb1 = hslToRgb(color1 as IHsl); } - if (rgb2.r === undefined) { + if (!Object.hasOwn(rgb2, "r")) { rgb2 = hslToRgb(color2 as IHsl); } @@ -407,6 +472,8 @@ export function getLinkColor(p1: Particle, p2?: Particle, linkColor?: string | I } else { return linkColor as IRgb; } + + return undefined; } /** @@ -548,16 +615,13 @@ export function updateColorValue( velocityFactor = 3.6; if ( - !data || !data.enable || ((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops)) ) { return; } - if (!data.time) { - data.time = 0; - } + data.time ??= 0; if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) { data.time += delta.value; @@ -567,7 +631,7 @@ export function updateColorValue( return; } - const offset = data.offset ? randomInRange(data.offset) : minOffset, + const offset = data.offset ? randomInRangeValue(data.offset) : minOffset, velocity = (data.velocity ?? minVelocity) * delta.factor + offset * velocityFactor, decay = data.decay ?? identity, max = getRangeMax(range), @@ -577,10 +641,7 @@ export function updateColorValue( data.value += velocity; if (data.value > max) { - if (!data.loops) { - data.loops = 0; - } - + data.loops ??= 0; data.loops++; if (decrease) { @@ -595,10 +656,7 @@ export function updateColorValue( const minValue = 0; if (data.value < minValue) { - if (!data.loops) { - data.loops = 0; - } - + data.loops ??= 0; data.loops++; data.status = AnimationStatus.increasing; @@ -623,20 +681,12 @@ export function updateColor(color: IParticleHslAnimation | undefined, delta: IDe const { h, s, l } = color, ranges = { - h: { min: 0, max: 360 }, - s: { min: 0, max: 100 }, - l: { min: 0, max: 100 }, + h: { min: hMin, max: hMax }, + s: { min: sMin, max: sMax }, + l: { min: lMin, max: lMax }, }; - if (h) { - updateColorValue(h, ranges.h, false, delta); - } - - if (s) { - updateColorValue(s, ranges.s, true, delta); - } - - if (l) { - updateColorValue(l, ranges.l, true, delta); - } + updateColorValue(h, ranges.h, false, delta); + updateColorValue(s, ranges.s, true, delta); + updateColorValue(l, ranges.l, true, delta); } diff --git a/engine/src/Utils/EventDispatcher.ts b/engine/src/Utils/EventDispatcher.ts index 5fb52ebd3f7..995475e4d8c 100644 --- a/engine/src/Utils/EventDispatcher.ts +++ b/engine/src/Utils/EventDispatcher.ts @@ -28,7 +28,9 @@ export class EventDispatcher { dispatchEvent(type: string, args: CustomEventArgs): void { const listeners = this._listeners.get(type); - listeners?.forEach(handler => handler(args)); + listeners?.forEach(handler => { + handler(args); + }); } hasEventListener(type: string): boolean { diff --git a/engine/src/Utils/LogUtils.ts b/engine/src/Utils/LogUtils.ts new file mode 100644 index 00000000000..eea3cad5935 --- /dev/null +++ b/engine/src/Utils/LogUtils.ts @@ -0,0 +1,55 @@ +/* eslint-disable no-console */ +const errorPrefix = "tsParticles - Error"; + +interface ILogger { + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + debug(this: void, message?: unknown, ...optionalParams: unknown[]): void; + + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + error(this: void, message?: unknown, ...optionalParams: unknown[]): void; + + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + info(this: void, message?: unknown, ...optionalParams: unknown[]): void; + + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + log(this: void, message?: unknown, ...optionalParams: unknown[]): void; + + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + verbose(this: void, message?: unknown, ...optionalParams: unknown[]): void; + + // eslint-disable-next-line @typescript-eslint/no-invalid-void-type + warning(this: void, message?: unknown, ...optionalParams: unknown[]): void; +} + +const _logger: ILogger = { + debug: console.debug, + error: (message, optionalParams) => { + // eslint-disable-next-line @typescript-eslint/restrict-template-expressions + console.error(`${errorPrefix} - ${message}`, optionalParams); + }, + info: console.info, + log: console.log, + verbose: console.log, + warning: console.warn, +}; + +/** + * Replaces the library log functions with a custom one. + * @param logger - A logger object responsible for logging messages. + */ +export function setLogger(logger: ILogger): void { + _logger.debug = logger.debug; + _logger.error = logger.error; + _logger.info = logger.info; + _logger.log = logger.log; + _logger.verbose = logger.verbose; + _logger.warning = logger.warning; +} + +/** + * Returns the logger object. + * @returns the logger + */ +export function getLogger(): ILogger { + return _logger; +} diff --git a/engine/src/Utils/NumberUtils.ts b/engine/src/Utils/MathUtils.ts similarity index 93% rename from engine/src/Utils/NumberUtils.ts rename to engine/src/Utils/MathUtils.ts index b4d80b845e5..f928ce352bd 100644 --- a/engine/src/Utils/NumberUtils.ts +++ b/engine/src/Utils/MathUtils.ts @@ -9,6 +9,9 @@ import type { RangeValue } from "../Types/RangeValue.js"; import { Vector } from "../Core/Utils/Vectors.js"; import { isNumber } from "./TypeUtils.js"; +const piDeg = 180, + degToRadFactor = Math.PI / piDeg; + interface AnimationLoop { cancel: (handle: number) => void; nextFrame: (callback: FrameRequestCallback) => number; @@ -18,7 +21,9 @@ let _random = Math.random; const _animationLoop: AnimationLoop = { nextFrame: (cb: FrameRequestCallback): number => requestAnimationFrame(cb), - cancel: (idx: number): void => cancelAnimationFrame(idx), + cancel: (idx: number): void => { + cancelAnimationFrame(idx); + }, }; /** @@ -40,6 +45,16 @@ export function getRandom(): number { return clamp(_random(), min, max - Number.EPSILON); } +/** + * Returns a random number between the given range using the library random function. + * @param min - The minimum value of the range. + * @param max - The maximum value of the range. + * @returns a random number between the given range + */ +export function getRandomInRange(min: number, max: number): number { + return getRandom() * (max - min) + min; +} + /** * Replaces the library animation functions with custom ones. * @param nextFrame - A function that will be called with a callback to be executed in the next frame. @@ -50,7 +65,9 @@ export function setAnimationFunctions( cancel: (handle: number) => void, ): void { _animationLoop.nextFrame = (callback: FrameRequestCallback): number => nextFrame(callback); - _animationLoop.cancel = (handle: number): void => cancel(handle); + _animationLoop.cancel = (handle: number): void => { + cancel(handle); + }; } /** @@ -96,16 +113,17 @@ export function mix(comp1: number, comp2: number, weight1: number, weight2: numb * @param r - * @returns the random value in the given range */ -export function randomInRange(r: RangeValue): number { +export function randomInRangeValue(r: RangeValue): number { const max = getRangeMax(r), minOffset = 0; + let min = getRangeMin(r); if (max === min) { min = minOffset; } - return getRandom() * (max - min) + min; + return getRandomInRange(min, max); } /** @@ -113,7 +131,7 @@ export function randomInRange(r: RangeValue): number { * @returns gets a value in the given range, if the range is a number, the source is returned, if the range is an object, a random value is returned */ export function getRangeValue(value: RangeValue): number { - return isNumber(value) ? value : randomInRange(value); + return isNumber(value) ? value : randomInRangeValue(value); } /** @@ -183,9 +201,7 @@ export function getDistance(pointA: ICoordinates, pointB: ICoordinates): number * @returns the radians value of the given degrees */ export function degToRad(degrees: number): number { - const PIDeg = 180; - - return (degrees * Math.PI) / PIDeg; + return degrees * degToRadFactor; } /** diff --git a/engine/src/Utils/TypeUtils.ts b/engine/src/Utils/TypeUtils.ts index 4f2a48bd138..ff6c9013fc4 100644 --- a/engine/src/Utils/TypeUtils.ts +++ b/engine/src/Utils/TypeUtils.ts @@ -30,8 +30,7 @@ export function isNumber(arg: unknown): arg is number { * @param arg - the object to check * @returns true if the argument is a function */ -// eslint-disable-next-line @typescript-eslint/ban-types -export function isFunction(arg: unknown): arg is Function { +export function isFunction(arg: unknown): arg is (...args: unknown[]) => unknown { return typeof arg === "function"; } @@ -40,7 +39,7 @@ export function isFunction(arg: unknown): arg is Function { * @param arg - the object to check * @returns true if the argument is an object */ -export function isObject(arg: unknown): arg is T { +export function isObject(arg: unknown): arg is object { return typeof arg === "object" && arg !== null; } diff --git a/engine/src/Utils/Utils.ts b/engine/src/Utils/Utils.ts index 70e304d7ccb..54fad43d8d8 100644 --- a/engine/src/Utils/Utils.ts +++ b/engine/src/Utils/Utils.ts @@ -8,9 +8,9 @@ import { getRangeMax, getRangeMin, getRangeValue, - randomInRange, -} from "./NumberUtils.js"; -import { half, millisecondsToSeconds, minVelocity, percentDenominator } from "../Core/Utils/Constants.js"; + randomInRangeValue, +} from "./MathUtils.js"; +import { half, millisecondsToSeconds, percentDenominator } from "../Core/Utils/Constants.js"; import { isArray, isNull, isObject } from "./TypeUtils.js"; import { AnimationMode } from "../Enums/Modes/AnimationMode.js"; import { AnimationStatus } from "../Enums/AnimationStatus.js"; @@ -21,8 +21,6 @@ import type { ICircleBouncer } from "../Core/Interfaces/ICircleBouncer.js"; import type { IDelta } from "../Core/Interfaces/IDelta.js"; import type { IModeDiv } from "../Options/Interfaces/Interactivity/Modes/IModeDiv.js"; import type { IParticleNumericValueAnimation } from "../Core/Interfaces/IParticleValueAnimation.js"; -import type { IRangeValue } from "../Core/Interfaces/IRangeValue.js"; -import type { IRectSideResult } from "../Core/Interfaces/IRectSideResult.js"; import { OutModeDirection } from "../Enums/Directions/OutModeDirection.js"; import type { Particle } from "../Core/Particle.js"; import { PixelMode } from "../Enums/Modes/PixelMode.js"; @@ -31,82 +29,7 @@ import type { SingleOrMultiple } from "../Types/SingleOrMultiple.js"; import { StartValueType } from "../Enums/Types/StartValueType.js"; import { Vector } from "../Core/Utils/Vectors.js"; -interface RectSideBounceData { - /** - * bounce factor - */ - factor: number; - /** - * particle bounce other side - */ - pOtherSide: IRangeValue; - /** - * particle bounce side - */ - pSide: IRangeValue; - /** - * rectangle bounce other side - */ - rectOtherSide: IRangeValue; - /** - * rectangle bounce side - */ - rectSide: IRangeValue; - /** - * particle velocity - */ - velocity: number; -} - -interface ILogger { - debug(this: void, message?: unknown, ...optionalParams: unknown[]): void; - - error(this: void, message?: unknown, ...optionalParams: unknown[]): void; - - info(this: void, message?: unknown, ...optionalParams: unknown[]): void; - - log(this: void, message?: unknown, ...optionalParams: unknown[]): void; - - verbose(this: void, message?: unknown, ...optionalParams: unknown[]): void; - - warning(this: void, message?: unknown, ...optionalParams: unknown[]): void; -} - -const _logger: ILogger = { - // eslint-disable-next-line no-console - debug: console.debug, - // eslint-disable-next-line no-console - error: console.error, - // eslint-disable-next-line no-console - info: console.info, - // eslint-disable-next-line no-console - log: console.log, - // eslint-disable-next-line no-console - verbose: console.log, - // eslint-disable-next-line no-console - warning: console.warn, -}; - -/** - * Replaces the library log functions with a custom one. - * @param logger - A logger object responsible for logging messages. - */ -export function setLogger(logger: ILogger): void { - _logger.debug = logger.debug || _logger.debug; - _logger.error = logger.error || _logger.error; - _logger.info = logger.info || _logger.info; - _logger.log = logger.log || _logger.log; - _logger.verbose = logger.verbose || _logger.verbose; - _logger.warning = logger.warning || _logger.warning; -} - -/** - * Returns the logger object. - * @returns the logger - */ -export function getLogger(): ILogger { - return _logger; -} +const minRadius = 0; /** * @@ -120,7 +43,7 @@ function memoize(fn: (...args: Args) => Result): const key = JSON.stringify(args); // Serialize arguments as the cache key if (cache.has(key)) { - return cache.get(key)!; // Return cached result if available + return cache.get(key) as Result; // Return cached result if available } const result = fn(...args); // Compute the result @@ -131,35 +54,6 @@ function memoize(fn: (...args: Args) => Result): }; } -/** - * Calculates the bounce on a rectangle side - * @param data - the rectangle side bounce values - * @returns the rectangle side bounce values - */ -function rectSideBounce(data: RectSideBounceData): IRectSideResult { - const res: IRectSideResult = { bounced: false }, - { pSide, pOtherSide, rectSide, rectOtherSide, velocity, factor } = data; - - if ( - pOtherSide.min < rectOtherSide.min || - pOtherSide.min > rectOtherSide.max || - pOtherSide.max < rectOtherSide.min || - pOtherSide.max > rectOtherSide.max - ) { - return res; - } - - if ( - (pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min) * half && velocity > minVelocity) || - (pSide.min <= rectSide.max && pSide.min > (rectSide.max + rectSide.min) * half && velocity < minVelocity) - ) { - res.velocity = velocity * -factor; - res.bounced = true; - } - - return res; -} - /** * Checks if the given selectors matches the element * @param element - element to check @@ -175,18 +69,17 @@ function checkSelector(element: HTMLElement, selectors: SingleOrMultiple } /** - * Checks if the script is executed server side - * @returns true if the environment is server side + * @returns true if the environment supports matchMedia feature */ -export function isSsr(): boolean { - return typeof window === "undefined" || !window || typeof window.document === "undefined" || !window.document; +export function hasMatchMedia(): boolean { + return typeof matchMedia !== "undefined"; } /** - * @returns true if the environment supports matchMedia feature + * @returns the document object */ -export function hasMatchMedia(): boolean { - return !isSsr() && typeof matchMedia !== "undefined"; +export function safeDocument(): Document { + return globalThis.document; } /** @@ -208,7 +101,7 @@ export function safeMatchMedia(query: string): MediaQueryList | undefined { export function safeIntersectionObserver( callback: (records: IntersectionObserverEntry[]) => void, ): IntersectionObserver | undefined { - if (isSsr() || typeof IntersectionObserver === "undefined") { + if (typeof IntersectionObserver === "undefined") { return; } @@ -220,7 +113,7 @@ export function safeIntersectionObserver( * @returns the mutation observer, if supported */ export function safeMutationObserver(callback: (records: MutationRecord[]) => void): MutationObserver | undefined { - if (isSsr() || typeof MutationObserver === "undefined") { + if (typeof MutationObserver === "undefined") { return; } @@ -234,9 +127,7 @@ export function safeMutationObserver(callback: (records: MutationRecord[]) => vo * @returns true if the value is equal to the destination, if same type, or is in the provided array */ export function isInArray(value: T, array: SingleOrMultiple): boolean { - const invalidIndex = -1; - - return value === array || (isArray(array) && array.indexOf(value) > invalidIndex); + return value === array || (isArray(array) && array.includes(value)); } /** @@ -246,7 +137,7 @@ export function isInArray(value: T, array: SingleOrMultiple): boolean { */ export async function loadFont(font?: string, weight?: string): Promise { try { - await document.fonts.load(`${weight ?? "400"} 36px '${font ?? "Verdana"}'`); + await safeDocument().fonts.load(`${weight ?? "400"} 36px '${font ?? "Verdana"}'`); } catch { // ignores any error } @@ -257,7 +148,7 @@ export async function loadFont(font?: string, weight?: string): Promise { * @param array - the array to get the index from * @returns a random array index */ -export function arrayRandomIndex(array: T[]): number { +export function arrayRandomIndex(array: unknown[]): number { return Math.floor(getRandom() * array.length); } @@ -268,7 +159,7 @@ export function arrayRandomIndex(array: T[]): number { * @param useIndex - if true, the index will be used instead of a random index * @returns the item found */ -export function itemFromArray(array: T[], index?: number, useIndex = true): T { +export function itemFromArray(array: T[], index?: number, useIndex = true): T | undefined { return array[index !== undefined && useIndex ? index % array.length : arrayRandomIndex(array)]; } @@ -288,8 +179,6 @@ export function isPointInside( radius?: number, direction?: OutModeDirection, ): boolean { - const minRadius = 0; - return areBoundsInside(calculateBounds(point, radius ?? minRadius), size, offset, direction); } @@ -498,79 +387,6 @@ export function circleBounce(p1: ICircleBouncer, p2: ICircleBouncer): void { p2.velocity.y = vFinal2.y * p2.factor.y; } -/** - * Executes the bounce between a particle and div bounds - * @param particle - the particle to bounce - * @param divBounds - the div bounds to bounce - */ -export function rectBounce(particle: Particle, divBounds: IBounds): void { - const pPos = particle.getPosition(), - size = particle.getRadius(), - bounds = calculateBounds(pPos, size), - bounceOptions = particle.options.bounce, - resH = rectSideBounce({ - pSide: { - min: bounds.left, - max: bounds.right, - }, - pOtherSide: { - min: bounds.top, - max: bounds.bottom, - }, - rectSide: { - min: divBounds.left, - max: divBounds.right, - }, - rectOtherSide: { - min: divBounds.top, - max: divBounds.bottom, - }, - velocity: particle.velocity.x, - factor: getRangeValue(bounceOptions.horizontal.value), - }); - - if (resH.bounced) { - if (resH.velocity !== undefined) { - particle.velocity.x = resH.velocity; - } - - if (resH.position !== undefined) { - particle.position.x = resH.position; - } - } - - const resV = rectSideBounce({ - pSide: { - min: bounds.top, - max: bounds.bottom, - }, - pOtherSide: { - min: bounds.left, - max: bounds.right, - }, - rectSide: { - min: divBounds.top, - max: divBounds.bottom, - }, - rectOtherSide: { - min: divBounds.left, - max: divBounds.right, - }, - velocity: particle.velocity.y, - factor: getRangeValue(bounceOptions.vertical.value), - }); - - if (resV.bounced) { - if (resV.velocity !== undefined) { - particle.velocity.y = resV.velocity; - } - - if (resV.position !== undefined) { - particle.position.y = resV.position; - } - } -} - /** * @param obj - * @param callback - @@ -591,7 +407,11 @@ export function executeOnSingleOrMultiple( * @param useIndex - * @returns the selected item */ -export function itemFromSingleOrMultiple(obj: SingleOrMultiple, index?: number, useIndex?: boolean): T { +export function itemFromSingleOrMultiple( + obj: SingleOrMultiple, + index?: number, + useIndex?: boolean, +): T | undefined { return isArray(obj) ? itemFromArray(obj, index, useIndex) : obj; } @@ -678,7 +498,7 @@ export function initParticleNumericAnimationValue( case StartValueType.random: default: - res.value = randomInRange(res); + res.value = randomInRangeValue(res); if (autoStatus) { res.status = getRandom() >= half ? AnimationStatus.increasing : AnimationStatus.decreasing; @@ -762,11 +582,13 @@ function checkDestroy( if (value >= maxValue) { particle.destroy(); } + break; case DestroyType.min: if (value <= minValue) { particle.destroy(); } + break; } } @@ -793,7 +615,6 @@ export function updateAnimation( if ( particle.destroyed || - !data || !data.enable || ((data.maxLoops ?? minLoops) > minLoops && (data.loops ?? minLoops) > (data.maxLoops ?? minLoops)) ) { @@ -805,9 +626,7 @@ export function updateAnimation( maxValue = data.max, decay = data.decay ?? minDecay; - if (!data.time) { - data.time = 0; - } + data.time ??= 0; if ((data.delayTime ?? minDelay) > minDelay && data.time < (data.delayTime ?? minDelay)) { data.time += delta.value; @@ -826,10 +645,7 @@ export function updateAnimation( data.value -= maxValue; } - if (!data.loops) { - data.loops = minLoops; - } - + data.loops ??= minLoops; data.loops++; } else { data.value += velocity; @@ -844,10 +660,7 @@ export function updateAnimation( data.value += maxValue; } - if (!data.loops) { - data.loops = minLoops; - } - + data.loops ??= minLoops; data.loops++; } else { data.value -= velocity; @@ -860,9 +673,7 @@ export function updateAnimation( checkDestroy(particle, destroyType, data.value, minValue, maxValue); - if (!particle.destroyed) { - data.value = clamp(data.value, minValue, maxValue); - } + data.value = clamp(data.value, minValue, maxValue); } /** @@ -871,11 +682,7 @@ export function updateAnimation( * @returns the cloned style */ export function cloneStyle(style: Partial): CSSStyleDeclaration { - const clonedStyle: CSSStyleDeclaration = document.createElement("div").style; - - if (!style) { - return clonedStyle; - } + const clonedStyle: CSSStyleDeclaration = safeDocument().createElement("div").style; for (const key in style) { const styleKey = style[key]; @@ -893,9 +700,9 @@ export function cloneStyle(style: Partial): CSSStyleDeclara const stylePriority = style.getPropertyPriority?.(styleKey); if (!stylePriority) { - clonedStyle.setProperty?.(styleKey, styleValue); + clonedStyle.setProperty(styleKey, styleValue); } else { - clonedStyle.setProperty?.(styleKey, styleValue, stylePriority); + clonedStyle.setProperty(styleKey, styleValue, stylePriority); } } @@ -908,7 +715,7 @@ export function cloneStyle(style: Partial): CSSStyleDeclara * @returns the full screen style */ function computeFullScreenStyle(zIndex: number): CSSStyleDeclaration { - const fullScreenStyle = document.createElement("div").style, + const fullScreenStyle = safeDocument().createElement("div").style, radix = 10, style: Record = { width: "100%", @@ -926,6 +733,10 @@ function computeFullScreenStyle(zIndex: number): CSSStyleDeclaration { for (const key in style) { const value = style[key]; + if (value === undefined) { + continue; + } + fullScreenStyle.setProperty(key, value); } diff --git a/engine/src/bundle.ts b/engine/src/bundle.ts index 7cb88485554..b2546d635ba 100644 --- a/engine/src/bundle.ts +++ b/engine/src/bundle.ts @@ -1,8 +1,8 @@ -import { init } from "./init.js"; +import { initEngine } from "./initEngine.js"; -const tsParticles = init(); +const tsParticles = initEngine(); -window.tsParticles = tsParticles; +globalThis.tsParticles = tsParticles; export * from "./exports.js"; diff --git a/engine/src/export-types.ts b/engine/src/export-types.ts index f674a49e0a9..4020a6f56bb 100644 --- a/engine/src/export-types.ts +++ b/engine/src/export-types.ts @@ -1,121 +1,108 @@ -import type { Engine } from "./Core/Engine.js"; - -export * from "./Core/Interfaces/Colors.js"; -export * from "./Core/Interfaces/IBounds.js"; -export * from "./Core/Interfaces/IBubbleParticleData.js"; -export * from "./Core/Interfaces/ICircleBouncer.js"; -export * from "./Core/Interfaces/IColorManager.js"; -export * from "./Core/Interfaces/IContainerInteractivity.js"; -export * from "./Core/Interfaces/IContainerPlugin.js"; -export * from "./Core/Interfaces/ICoordinates.js"; -export * from "./Core/Interfaces/IDelta.js"; -export * from "./Core/Interfaces/IDimension.js"; -export * from "./Core/Interfaces/IDistance.js"; -export * from "./Core/Interfaces/IDrawParticleParams.js"; -export * from "./Core/Interfaces/IEffectDrawer.js"; -export * from "./Core/Interfaces/IExternalInteractor.js"; -export * from "./Core/Interfaces/IInteractor.js"; -export * from "./Core/Interfaces/ILoadParams.js"; -export * from "./Core/Interfaces/IMouseData.js"; -export * from "./Core/Interfaces/IMovePathGenerator.js"; -export * from "./Core/Interfaces/IParticleColorStyle.js"; -export * from "./Core/Interfaces/IParticleHslAnimation.js"; -export * from "./Core/Interfaces/IParticleLife.js"; -export * from "./Core/Interfaces/IParticleMover.js"; -export * from "./Core/Interfaces/IParticleRetinaProps.js"; -export * from "./Core/Interfaces/IParticleRoll.js"; -export * from "./Core/Interfaces/IParticleTransformValues.js"; -export * from "./Core/Interfaces/IParticleUpdater.js"; -export * from "./Core/Interfaces/IParticleValueAnimation.js"; -export * from "./Core/Interfaces/IParticlesInteractor.js"; -export * from "./Core/Interfaces/IPlugin.js"; -export * from "./Core/Interfaces/IPositionFromSizeParams.js"; -export * from "./Core/Interfaces/IRangeValue.js"; -export * from "./Core/Interfaces/IRectSideResult.js"; -export * from "./Core/Interfaces/IShapeDrawData.js"; -export * from "./Core/Interfaces/IShapeDrawer.js"; -export * from "./Core/Interfaces/IShapeValues.js"; -export * from "./Core/Interfaces/ISlowParticleData.js"; -export * from "./Core/Interfaces/ITrailFillData.js"; - -export * from "./Options/Interfaces/Background/IBackground.js"; - -export * from "./Options/Interfaces/BackgroundMask/IBackgroundMask.js"; -export * from "./Options/Interfaces/BackgroundMask/IBackgroundMaskCover.js"; - -export * from "./Options/Interfaces/FullScreen/IFullScreen.js"; - -export * from "./Options/Interfaces/IAnimatable.js"; -export * from "./Options/Interfaces/IAnimatableColor.js"; -export * from "./Options/Interfaces/IAnimation.js"; -export * from "./Options/Interfaces/IColorAnimation.js"; -export * from "./Options/Interfaces/IHslAnimation.js"; -export * from "./Options/Interfaces/IManualParticle.js"; -export * from "./Options/Interfaces/IOptionLoader.js"; -export * from "./Options/Interfaces/IOptions.js"; -export * from "./Options/Interfaces/IOptionsColor.js"; -export * from "./Options/Interfaces/IResponsive.js"; -export * from "./Options/Interfaces/IValueWithRandom.js"; - -export * from "./Options/Interfaces/Interactivity/Events/IClickEvent.js"; -export * from "./Options/Interfaces/Interactivity/Events/IDivEvent.js"; -export * from "./Options/Interfaces/Interactivity/Events/IEvents.js"; -export * from "./Options/Interfaces/Interactivity/Events/IHoverEvent.js"; -export * from "./Options/Interfaces/Interactivity/Events/IParallax.js"; -export * from "./Options/Interfaces/Interactivity/Events/IResizeEvent.js"; -export * from "./Options/Interfaces/Interactivity/Modes/IModeDiv.js"; -export * from "./Options/Interfaces/Interactivity/Modes/IModes.js"; -export * from "./Options/Interfaces/Interactivity/IInteractivity.js"; - -export * from "./Options/Interfaces/Particles/Bounce/IParticlesBounce.js"; - -export * from "./Options/Interfaces/Particles/Collisions/ICollisions.js"; -export * from "./Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.js"; -export * from "./Options/Interfaces/Particles/Collisions/ICollisionsOverlap.js"; - -export * from "./Options/Interfaces/Particles/Effect/IEffect.js"; - -export * from "./Options/Interfaces/Particles/IParticlesOptions.js"; -export * from "./Options/Interfaces/Particles/IShadow.js"; -export * from "./Options/Interfaces/Particles/IStroke.js"; - -export * from "./Options/Interfaces/Particles/Move/IMoveAttract.js"; -export * from "./Options/Interfaces/Particles/Move/IMove.js"; -export * from "./Options/Interfaces/Particles/Move/IMoveAngle.js"; -export * from "./Options/Interfaces/Particles/Move/IMoveCenter.js"; -export * from "./Options/Interfaces/Particles/Move/IMoveGravity.js"; -export * from "./Options/Interfaces/Particles/Move/Path/IMovePath.js"; -export * from "./Options/Interfaces/Particles/Move/IOutModes.js"; -export * from "./Options/Interfaces/Particles/Move/ISpin.js"; -export * from "./Options/Interfaces/Particles/Move/IMoveTrail.js"; - -export * from "./Options/Interfaces/Particles/Number/IParticlesDensity.js"; -export * from "./Options/Interfaces/Particles/Number/IParticlesNumber.js"; -export * from "./Options/Interfaces/Particles/Number/IParticlesNumberLimit.js"; - -export * from "./Options/Interfaces/Particles/Opacity/IOpacity.js"; -export * from "./Options/Interfaces/Particles/Opacity/IOpacityAnimation.js"; - -export * from "./Options/Interfaces/Particles/Shape/IShape.js"; - -export * from "./Options/Interfaces/Particles/Size/ISize.js"; -export * from "./Options/Interfaces/Particles/Size/ISizeAnimation.js"; - -export * from "./Options/Interfaces/Particles/ZIndex/IZIndex.js"; - -export * from "./Options/Interfaces/Theme/ITheme.js"; -export * from "./Options/Interfaces/Theme/IThemeDefault.js"; - -export * from "./Types/CustomEventArgs.js"; -export * from "./Types/CustomEventListener.js"; -export * from "./Types/ExportResult.js"; -export * from "./Types/ISourceOptions.js"; -export * from "./Types/ParticlesGroups.js"; -export * from "./Types/PathOptions.js"; -export * from "./Types/RangeValue.js"; -export * from "./Types/RecursivePartial.js"; -export * from "./Types/ShapeData.js"; -export * from "./Types/SingleOrMultiple.js"; +export type * from "./Core/Interfaces/Colors.js"; +export type * from "./Core/Interfaces/IBounds.js"; +export type * from "./Core/Interfaces/IBubbleParticleData.js"; +export type * from "./Core/Interfaces/ICircleBouncer.js"; +export type * from "./Core/Interfaces/IColorManager.js"; +export type * from "./Core/Interfaces/IContainerInteractivity.js"; +export type * from "./Core/Interfaces/IContainerPlugin.js"; +export type * from "./Core/Interfaces/ICoordinates.js"; +export type * from "./Core/Interfaces/IDelta.js"; +export type * from "./Core/Interfaces/IDimension.js"; +export type * from "./Core/Interfaces/IDistance.js"; +export type * from "./Core/Interfaces/IDrawParticleParams.js"; +export type * from "./Core/Interfaces/IEffectDrawer.js"; +export type * from "./Core/Interfaces/IExternalInteractor.js"; +export type * from "./Core/Interfaces/IInteractor.js"; +export type * from "./Core/Interfaces/ILoadParams.js"; +export type * from "./Core/Interfaces/IMouseData.js"; +export type * from "./Core/Interfaces/IMovePathGenerator.js"; +export type * from "./Core/Interfaces/IParticleColorStyle.js"; +export type * from "./Core/Interfaces/IParticleHslAnimation.js"; +export type * from "./Core/Interfaces/IParticleLife.js"; +export type * from "./Core/Interfaces/IParticleMover.js"; +export type * from "./Core/Interfaces/IParticleRetinaProps.js"; +export type * from "./Core/Interfaces/IParticleRoll.js"; +export type * from "./Core/Interfaces/IParticleTransformValues.js"; +export type * from "./Core/Interfaces/IParticleUpdater.js"; +export type * from "./Core/Interfaces/IParticleValueAnimation.js"; +export type * from "./Core/Interfaces/IParticlesInteractor.js"; +export type * from "./Core/Interfaces/IPlugin.js"; +export type * from "./Core/Interfaces/IPositionFromSizeParams.js"; +export type * from "./Core/Interfaces/IRangeValue.js"; +export type * from "./Core/Interfaces/IShapeDrawData.js"; +export type * from "./Core/Interfaces/IShapeDrawer.js"; +export type * from "./Core/Interfaces/IShapeValues.js"; +export type * from "./Core/Interfaces/ISlowParticleData.js"; + +export type * from "./Options/Interfaces/Background/IBackground.js"; + +export type * from "./Options/Interfaces/FullScreen/IFullScreen.js"; + +export type * from "./Options/Interfaces/IAnimatable.js"; +export type * from "./Options/Interfaces/IAnimatableColor.js"; +export type * from "./Options/Interfaces/IAnimation.js"; +export type * from "./Options/Interfaces/IColorAnimation.js"; +export type * from "./Options/Interfaces/IHslAnimation.js"; +export type * from "./Options/Interfaces/IManualParticle.js"; +export type * from "./Options/Interfaces/IOptionLoader.js"; +export type * from "./Options/Interfaces/IOptions.js"; +export type * from "./Options/Interfaces/IOptionsColor.js"; +export type * from "./Options/Interfaces/IResponsive.js"; +export type * from "./Options/Interfaces/IValueWithRandom.js"; + +export type * from "./Options/Interfaces/Interactivity/Events/IClickEvent.js"; +export type * from "./Options/Interfaces/Interactivity/Events/IDivEvent.js"; +export type * from "./Options/Interfaces/Interactivity/Events/IEvents.js"; +export type * from "./Options/Interfaces/Interactivity/Events/IHoverEvent.js"; +export type * from "./Options/Interfaces/Interactivity/Events/IParallax.js"; +export type * from "./Options/Interfaces/Interactivity/Events/IResizeEvent.js"; +export type * from "./Options/Interfaces/Interactivity/Modes/IModeDiv.js"; +export type * from "./Options/Interfaces/Interactivity/Modes/IModes.js"; +export type * from "./Options/Interfaces/Interactivity/IInteractivity.js"; + +export type * from "./Options/Interfaces/Particles/Bounce/IParticlesBounce.js"; + +export type * from "./Options/Interfaces/Particles/Effect/IEffect.js"; + +export type * from "./Options/Interfaces/Particles/IParticlesOptions.js"; +export type * from "./Options/Interfaces/Particles/IStroke.js"; + +export type * from "./Options/Interfaces/Particles/Move/IMoveAttract.js"; +export type * from "./Options/Interfaces/Particles/Move/IMove.js"; +export type * from "./Options/Interfaces/Particles/Move/IMoveAngle.js"; +export type * from "./Options/Interfaces/Particles/Move/IMoveCenter.js"; +export type * from "./Options/Interfaces/Particles/Move/IMoveGravity.js"; +export type * from "./Options/Interfaces/Particles/Move/Path/IMovePath.js"; +export type * from "./Options/Interfaces/Particles/Move/IOutModes.js"; +export type * from "./Options/Interfaces/Particles/Move/ISpin.js"; + +export type * from "./Options/Interfaces/Particles/Number/IParticlesDensity.js"; +export type * from "./Options/Interfaces/Particles/Number/IParticlesNumber.js"; +export type * from "./Options/Interfaces/Particles/Number/IParticlesNumberLimit.js"; + +export type * from "./Options/Interfaces/Particles/Opacity/IOpacity.js"; +export type * from "./Options/Interfaces/Particles/Opacity/IOpacityAnimation.js"; + +export type * from "./Options/Interfaces/Particles/Shape/IShape.js"; + +export type * from "./Options/Interfaces/Particles/Size/ISize.js"; +export type * from "./Options/Interfaces/Particles/Size/ISizeAnimation.js"; + +export type * from "./Options/Interfaces/Particles/ZIndex/IZIndex.js"; + +export type * from "./Options/Interfaces/Theme/ITheme.js"; +export type * from "./Options/Interfaces/Theme/IThemeDefault.js"; + +export type * from "./Types/CustomEventArgs.js"; +export type * from "./Types/CustomEventListener.js"; +export type * from "./Types/ExportResult.js"; +export type * from "./Types/ISourceOptions.js"; +export type * from "./Types/ParticlesGroups.js"; +export type * from "./Types/PathOptions.js"; +export type * from "./Types/RangeValue.js"; +export type * from "./Types/RecursivePartial.js"; +export type * from "./Types/ShapeData.js"; +export type * from "./Types/SingleOrMultiple.js"; export type { EventListeners } from "./Core/Utils/EventListeners.js"; export type { InteractionManager } from "./Core/Utils/InteractionManager.js"; @@ -125,5 +112,5 @@ export type { Container } from "./Core/Container.js"; export type { Particle } from "./Core/Particle.js"; export type { Particles } from "./Core/Particles.js"; export type { Retina } from "./Core/Retina.js"; -export type { Engine, Engine as Main }; +export type { Engine } from "./Core/Engine.js"; export type { IParticlesNumberLimit } from "./Options/Interfaces/Particles/Number/IParticlesNumberLimit.js"; diff --git a/engine/src/exports.ts b/engine/src/exports.ts index 28dd2975b3e..03a0bd1e7aa 100644 --- a/engine/src/exports.ts +++ b/engine/src/exports.ts @@ -10,7 +10,6 @@ export * from "./Enums/Directions/RotateDirection.js"; export * from "./Enums/Directions/OutModeDirection.js"; export * from "./Enums/Modes/AnimationMode.js"; -export * from "./Enums/Modes/CollisionMode.js"; export * from "./Enums/Modes/LimitMode.js"; export * from "./Enums/Modes/OutMode.js"; export * from "./Enums/Modes/PixelMode.js"; @@ -34,8 +33,6 @@ export * from "./Options/Classes/AnimatableColor.js"; export * from "./Options/Classes/AnimationOptions.js"; export * from "./Options/Classes/Background/Background.js"; -export * from "./Options/Classes/BackgroundMask/BackgroundMask.js"; -export * from "./Options/Classes/BackgroundMask/BackgroundMaskCover.js"; export * from "./Options/Classes/ColorAnimation.js"; @@ -61,12 +58,7 @@ export * from "./Options/Classes/OptionsColor.js"; export * from "./Options/Classes/Particles/Bounce/ParticlesBounce.js"; export * from "./Options/Classes/Particles/Bounce/ParticlesBounceFactor.js"; -export * from "./Options/Classes/Particles/Collisions/Collisions.js"; -export * from "./Options/Classes/Particles/Collisions/CollisionsAbsorb.js"; -export * from "./Options/Classes/Particles/Collisions/CollisionsOverlap.js"; - export * from "./Options/Classes/Particles/ParticlesOptions.js"; -export * from "./Options/Classes/Particles/Shadow.js"; export * from "./Options/Classes/Particles/Stroke.js"; export * from "./Options/Classes/Particles/Move/MoveAttract.js"; @@ -77,7 +69,6 @@ export * from "./Options/Classes/Particles/Move/MoveGravity.js"; export * from "./Options/Classes/Particles/Move/OutModes.js"; export * from "./Options/Classes/Particles/Move/Path/MovePath.js"; export * from "./Options/Classes/Particles/Move/Spin.js"; -export * from "./Options/Classes/Particles/Move/MoveTrail.js"; export * from "./Options/Classes/Particles/Number/ParticlesNumber.js"; export * from "./Options/Classes/Particles/Number/ParticlesNumberLimit.js"; @@ -102,7 +93,8 @@ export * from "./Options/Classes/ValueWithRandom.js"; export * from "./Utils/CanvasUtils.js"; export * from "./Utils/ColorUtils.js"; -export * from "./Utils/NumberUtils.js"; +export * from "./Utils/LogUtils.js"; +export * from "./Utils/MathUtils.js"; export * from "./Utils/OptionsUtils.js"; export * from "./Utils/Utils.js"; export * from "./Utils/TypeUtils.js"; diff --git a/engine/src/index.ts b/engine/src/index.ts index 60681486e91..aa2f6282228 100644 --- a/engine/src/index.ts +++ b/engine/src/index.ts @@ -1,13 +1,10 @@ -import { init } from "./init.js"; -import { isSsr } from "./Utils/Utils.js"; +import { initEngine } from "./initEngine.js"; -const tsParticles = init(); +const tsParticles = initEngine(); -if (!isSsr()) { - window.tsParticles = tsParticles; -} +globalThis.tsParticles = tsParticles; export * from "./exports.js"; -export * from "./export-types.js"; +export type * from "./export-types.js"; export { tsParticles }; diff --git a/engine/src/init.ts b/engine/src/initEngine.ts similarity index 59% rename from engine/src/init.ts rename to engine/src/initEngine.ts index 4f407038b5b..87188c3dec5 100644 --- a/engine/src/init.ts +++ b/engine/src/initEngine.ts @@ -4,13 +4,9 @@ import { Engine } from "./Core/Engine.js"; * * @returns the initialized engine object */ -export function init(): Engine { +export function initEngine(): Engine { /** * The exposed tsParticles instance */ - const engine = new Engine(); - - engine.init(); - - return engine; + return new Engine(); } diff --git a/engine/webpack.config.js b/engine/webpack.config.js index b6033fe0150..b5a049cf93e 100644 --- a/engine/webpack.config.js +++ b/engine/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesEngine } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesEngine } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesEngine({ version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesEngine({ version, dir: __dirname }); diff --git a/interactions/external/attract/.eslintignore b/interactions/external/attract/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/attract/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/attract/.eslintrc.js b/interactions/external/attract/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/attract/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/attract/CHANGELOG.md b/interactions/external/attract/CHANGELOG.md index 8d60e84aa60..f6ae47ec78b 100644 --- a/interactions/external/attract/CHANGELOG.md +++ b/interactions/external/attract/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-attract + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-attract diff --git a/interactions/external/attract/eslint.config.js b/interactions/external/attract/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/attract/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/attract/package.dist.json b/interactions/external/attract/package.dist.json index 832a407e233..c3f933485d0 100644 --- a/interactions/external/attract/package.dist.json +++ b/interactions/external/attract/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-attract", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles attract external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/attract/package.json b/interactions/external/attract/package.json index 6841921f826..1036c81a92b 100644 --- a/interactions/external/attract/package.json +++ b/interactions/external/attract/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-attract", - "version": "3.9.1", - "description": "tsParticles attract external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-attract", + "version": "4.0.0-alpha.0", + "description": "tsParticles attract external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/attract" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/attract" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/attract/src/Attractor.ts b/interactions/external/attract/src/Attractor.ts index 1746cb23c99..d6d2a5bd9f0 100644 --- a/interactions/external/attract/src/Attractor.ts +++ b/interactions/external/attract/src/Attractor.ts @@ -28,9 +28,7 @@ export class Attractor extends ExternalInteractorBase { this._engine = engine; - if (!container.attract) { - container.attract = { particles: [] }; - } + container.attract ??= { particles: [] }; this.handleClickMode = (mode): void => { const options = this.container.actualOptions, @@ -40,9 +38,7 @@ export class Attractor extends ExternalInteractorBase { return; } - if (!container.attract) { - container.attract = { particles: [] }; - } + container.attract ??= { particles: [] }; container.attract.clicking = true; container.attract.count = 0; @@ -63,9 +59,7 @@ export class Attractor extends ExternalInteractorBase { return; } - if (!container.attract) { - container.attract = { particles: [] }; - } + container.attract ??= { particles: [] }; container.attract.clicking = false; }, attract.duration * millisecondsToSeconds); @@ -122,9 +116,7 @@ export class Attractor extends ExternalInteractorBase { options: Modes & AttractMode, ...sources: RecursivePartial<(IModes & IAttractMode) | undefined>[] ): void { - if (!options.attract) { - options.attract = new Attract(); - } + options.attract ??= new Attract(); for (const source of sources) { options.attract.load(source?.attract); diff --git a/interactions/external/attract/src/Utils.ts b/interactions/external/attract/src/Utils.ts index f68bb2db4eb..68ef2bb7005 100644 --- a/interactions/external/attract/src/Utils.ts +++ b/interactions/external/attract/src/Utils.ts @@ -67,17 +67,12 @@ export function clickAttract( container: AttractContainer, enabledCb: (particle: Particle) => boolean, ): void { - if (!container.attract) { - container.attract = { particles: [] }; - } + container.attract ??= { particles: [] }; const { attract } = container; if (!attract.finish) { - if (!attract.count) { - attract.count = 0; - } - + attract.count ??= 0; attract.count++; if (attract.count === container.particles.count) { diff --git a/interactions/external/attract/src/index.ts b/interactions/external/attract/src/index.ts index 0dfd2b5f7dd..007e61f3170 100644 --- a/interactions/external/attract/src/index.ts +++ b/interactions/external/attract/src/index.ts @@ -1,23 +1,21 @@ -import { Attractor } from "./Attractor.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalAttractInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalAttractInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalAttract", - container => { - return Promise.resolve(new Attractor(engine, container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalAttract", async container => { + const { Attractor } = await import("./Attractor.js"); + + return new Attractor(e, container); + }); + }); } export * from "./Options/Classes/Attract.js"; -export * from "./Options/Interfaces/IAttract.js"; +export type * from "./Options/Interfaces/IAttract.js"; diff --git a/interactions/external/attract/webpack.config.js b/interactions/external/attract/webpack.config.js index 2a2118f8c8a..23e9825c883 100644 --- a/interactions/external/attract/webpack.config.js +++ b/interactions/external/attract/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "attract", pluginName: "Attract", version, diff --git a/interactions/external/bounce/.eslintignore b/interactions/external/bounce/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/bounce/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/bounce/.eslintrc.js b/interactions/external/bounce/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/bounce/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/bounce/CHANGELOG.md b/interactions/external/bounce/CHANGELOG.md index 656bd0da40a..7685d89b524 100644 --- a/interactions/external/bounce/CHANGELOG.md +++ b/interactions/external/bounce/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Bug Fixes + +- fixed rotation movement when angle was 0 ([6d02bfb](https://github.com/tsparticles/tsparticles/commit/6d02bfb69b03c111d21af7d1727338ba46272829)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-bounce diff --git a/interactions/external/bounce/eslint.config.js b/interactions/external/bounce/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/bounce/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/bounce/package.dist.json b/interactions/external/bounce/package.dist.json index 3f6a0951a4e..472e9fdc8b4 100644 --- a/interactions/external/bounce/package.dist.json +++ b/interactions/external/bounce/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-bounce", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles bounce external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/bounce/package.json b/interactions/external/bounce/package.json index b0ffcfb3501..83b0a692eef 100644 --- a/interactions/external/bounce/package.json +++ b/interactions/external/bounce/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-bounce", - "version": "3.9.1", - "description": "tsParticles bounce external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-bounce", + "version": "4.0.0-alpha.0", + "description": "tsParticles bounce external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/bounce" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/bounce" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/bounce/src/Bouncer.ts b/interactions/external/bounce/src/Bouncer.ts index 4622e5f86f9..81da4ea5d96 100644 --- a/interactions/external/bounce/src/Bouncer.ts +++ b/interactions/external/bounce/src/Bouncer.ts @@ -68,9 +68,7 @@ export class Bouncer extends ExternalInteractorBase { options: Modes & BounceMode, ...sources: RecursivePartial<(IModes & IBounceMode) | undefined>[] ): void { - if (!options.bounce) { - options.bounce = new Bounce(); - } + options.bounce ??= new Bounce(); for (const source of sources) { options.bounce.load(source?.bounce); diff --git a/engine/src/Core/Interfaces/IRectSideResult.ts b/interactions/external/bounce/src/IRectSideResult.ts similarity index 100% rename from engine/src/Core/Interfaces/IRectSideResult.ts rename to interactions/external/bounce/src/IRectSideResult.ts diff --git a/interactions/external/bounce/src/Utils.ts b/interactions/external/bounce/src/Utils.ts index 1dbabbc946a..913325bc5fb 100644 --- a/interactions/external/bounce/src/Utils.ts +++ b/interactions/external/bounce/src/Utils.ts @@ -3,7 +3,9 @@ import { Circle, type DivEvent, DivType, + type IBounds, type ICoordinates, + type IRangeValue, type Particle, Rectangle, type SingleOrMultiple, @@ -12,16 +14,46 @@ import { circleBounce, circleBounceDataFromParticle, divModeExecute, - rectBounce, + getRangeValue, + safeDocument, } from "@tsparticles/engine"; import type { BounceContainer } from "./Types.js"; +import type { IRectSideResult } from "./IRectSideResult.js"; const squareExp = 2, half = 0.5, halfPI = Math.PI * half, double = 2, toleranceFactor = 10, - minRadius = 0; + minRadius = 0, + minVelocity = 0; + +interface RectSideBounceData { + /** + * bounce factor + */ + factor: number; + /** + * particle bounce other side + */ + pOtherSide: IRangeValue; + /** + * particle bounce side + */ + pSide: IRangeValue; + /** + * rectangle bounce other side + */ + rectOtherSide: IRangeValue; + /** + * rectangle bounce side + */ + rectSide: IRangeValue; + /** + * particle velocity + */ + velocity: number; +} /** * @@ -68,7 +100,7 @@ function singleSelectorBounce( div: DivEvent, bounceCb: (position: ICoordinates, radius: number, range: BaseRange) => void, ): void { - const query = document.querySelectorAll(selector); + const query = safeDocument().querySelectorAll(selector); if (!query.length) { return; @@ -110,11 +142,11 @@ export function divBounce( bounceMode: string, enabledCb: (p: Particle) => boolean, ): void { - divModeExecute(bounceMode, divs, (selector, div): void => - singleSelectorBounce(container, selector, div, (pos, radius, area): void => - processBounce(container, pos, radius, area, enabledCb), - ), - ); + divModeExecute(bounceMode, divs, (selector, div): void => { + singleSelectorBounce(container, selector, div, (pos, radius, area): void => { + processBounce(container, pos, radius, area, enabledCb); + }); + }); } /** @@ -134,3 +166,105 @@ export function mouseBounce(container: BounceContainer, enabledCb: (p: Particle) processBounce(container, mousePos, radius, new Circle(mousePos.x, mousePos.y, radius + tolerance), enabledCb); } + +/** + * Calculates the bounce on a rectangle side + * @param data - the rectangle side bounce values + * @returns the rectangle side bounce values + */ +function rectSideBounce(data: RectSideBounceData): IRectSideResult { + const res: IRectSideResult = { bounced: false }, + { pSide, pOtherSide, rectSide, rectOtherSide, velocity, factor } = data; + + if ( + pOtherSide.min < rectOtherSide.min || + pOtherSide.min > rectOtherSide.max || + pOtherSide.max < rectOtherSide.min || + pOtherSide.max > rectOtherSide.max + ) { + return res; + } + + if ( + (pSide.max >= rectSide.min && pSide.max <= (rectSide.max + rectSide.min) * half && velocity > minVelocity) || + (pSide.min <= rectSide.max && pSide.min > (rectSide.max + rectSide.min) * half && velocity < minVelocity) + ) { + res.velocity = velocity * -factor; + res.bounced = true; + } + + return res; +} + +/** + * Executes the bounce between a particle and div bounds + * @param particle - the particle to bounce + * @param divBounds - the div bounds to bounce + */ +export function rectBounce(particle: Particle, divBounds: IBounds): void { + const pPos = particle.getPosition(), + size = particle.getRadius(), + bounds = calculateBounds(pPos, size), + bounceOptions = particle.options.bounce, + resH = rectSideBounce({ + pSide: { + min: bounds.left, + max: bounds.right, + }, + pOtherSide: { + min: bounds.top, + max: bounds.bottom, + }, + rectSide: { + min: divBounds.left, + max: divBounds.right, + }, + rectOtherSide: { + min: divBounds.top, + max: divBounds.bottom, + }, + velocity: particle.velocity.x, + factor: getRangeValue(bounceOptions.horizontal.value), + }); + + if (resH.bounced) { + if (resH.velocity !== undefined) { + particle.velocity.x = resH.velocity; + } + + if (resH.position !== undefined) { + particle.position.x = resH.position; + } + } + + const resV = rectSideBounce({ + pSide: { + min: bounds.top, + max: bounds.bottom, + }, + pOtherSide: { + min: bounds.left, + max: bounds.right, + }, + rectSide: { + min: divBounds.top, + max: divBounds.bottom, + }, + rectOtherSide: { + min: divBounds.left, + max: divBounds.right, + }, + velocity: particle.velocity.y, + factor: getRangeValue(bounceOptions.vertical.value), + }); + + if (resV.bounced) { + if (resV.velocity !== undefined) { + particle.velocity.y = resV.velocity; + } + + if (resV.position !== undefined) { + particle.position.y = resV.position; + } + } +} diff --git a/interactions/external/bounce/src/index.ts b/interactions/external/bounce/src/index.ts index 7713a3a711e..46988a24bd2 100644 --- a/interactions/external/bounce/src/index.ts +++ b/interactions/external/bounce/src/index.ts @@ -1,23 +1,21 @@ -import { Bouncer } from "./Bouncer.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalBounceInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalBounceInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalBounce", - container => { - return Promise.resolve(new Bouncer(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalBounce", async container => { + const { Bouncer } = await import("./Bouncer.js"); + + return new Bouncer(container); + }); + }); } export * from "./Options/Classes/Bounce.js"; -export * from "./Options/Interfaces/IBounce.js"; +export type * from "./Options/Interfaces/IBounce.js"; diff --git a/interactions/external/bounce/webpack.config.js b/interactions/external/bounce/webpack.config.js index da51dec97aa..154f8f7a25c 100644 --- a/interactions/external/bounce/webpack.config.js +++ b/interactions/external/bounce/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "bounce", pluginName: "Bounce", version, diff --git a/interactions/external/bubble/.eslintignore b/interactions/external/bubble/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/bubble/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/bubble/.eslintrc.js b/interactions/external/bubble/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/bubble/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/bubble/CHANGELOG.md b/interactions/external/bubble/CHANGELOG.md index 041819b76c3..3ea8b17c715 100644 --- a/interactions/external/bubble/CHANGELOG.md +++ b/interactions/external/bubble/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-bubble + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-bubble diff --git a/interactions/external/bubble/eslint.config.js b/interactions/external/bubble/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/bubble/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/bubble/package.dist.json b/interactions/external/bubble/package.dist.json index a97c4cd961f..198c24f2dad 100644 --- a/interactions/external/bubble/package.dist.json +++ b/interactions/external/bubble/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-bubble", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles bubble external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/bubble/package.json b/interactions/external/bubble/package.json index c563cf01808..f5a64390bc4 100644 --- a/interactions/external/bubble/package.json +++ b/interactions/external/bubble/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-bubble", - "version": "3.9.1", - "description": "tsParticles bubble external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-bubble", + "version": "4.0.0-alpha.0", + "description": "tsParticles bubble external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/bubble" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/bubble" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/bubble/src/Bubbler.ts b/interactions/external/bubble/src/Bubbler.ts index 9ae2beadb95..c5fe320f54a 100644 --- a/interactions/external/bubble/src/Bubbler.ts +++ b/interactions/external/bubble/src/Bubbler.ts @@ -24,6 +24,7 @@ import { mouseMoveEvent, rangeColorToHsl, rgbToHsl, + safeDocument, } from "@tsparticles/engine"; import { Bubble } from "./Options/Classes/Bubble.js"; import type { BubbleDiv } from "./Options/Classes/BubbleDiv.js"; @@ -50,29 +51,25 @@ export class Bubbler extends ExternalInteractorBase { private readonly _engine; - constructor(container: BubbleContainer, engine: Engine) { + constructor(engine: Engine, container: BubbleContainer) { super(container); this._engine = engine; - if (!container.bubble) { - container.bubble = {}; - } + container.bubble ??= {}; this.handleClickMode = (mode): void => { if (mode !== bubbleMode) { return; } - if (!container.bubble) { - container.bubble = {}; - } + container.bubble ??= {}; container.bubble.clicking = true; }; } - clear(particle: Particle, delta: IDelta, force?: boolean): void { + clear(particle: Particle, _delta: IDelta, force?: boolean): void { if (particle.bubble.inRange && !force) { return; } @@ -115,7 +112,9 @@ export class Bubbler extends ExternalInteractorBase { } else if (clickEnabled && isInArray(bubbleMode, clickMode)) { this._clickBubble(); } else { - divModeExecute(bubbleMode, divs, (selector, div): void => this._singleSelectorHover(delta, selector, div)); + divModeExecute(bubbleMode, divs, (selector, div): void => { + this._singleSelectorHover(delta, selector, div); + }); } } @@ -138,9 +137,7 @@ export class Bubbler extends ExternalInteractorBase { options: Modes & BubbleMode, ...sources: RecursivePartial<(IModes & IBubbleMode) | undefined>[] ): void { - if (!options.bubble) { - options.bubble = new Bubble(); - } + options.bubble ??= new Bubble(); for (const source of sources) { options.bubble.load(source?.bubble); @@ -161,9 +158,7 @@ export class Bubbler extends ExternalInteractorBase { return; } - if (!container.bubble) { - container.bubble = {}; - } + container.bubble ??= {}; const distance = container.retina.bubbleModeDistance; @@ -384,9 +379,7 @@ export class Bubbler extends ExternalInteractorBase { return; } - if (!container.bubble) { - container.bubble = {}; - } + container.bubble ??= {}; if (container.bubble.durationEnd) { if (pObjBubble) { @@ -431,7 +424,7 @@ export class Bubbler extends ExternalInteractorBase { div, ) => { const container = this.container, - selectors = document.querySelectorAll(selector), + selectors = safeDocument().querySelectorAll(selector), bubble = container.actualOptions.interactivity.modes.bubble; if (!bubble || !selectors.length) { diff --git a/interactions/external/bubble/src/Options/Classes/Bubble.ts b/interactions/external/bubble/src/Options/Classes/Bubble.ts index 735a7e7acc2..858ff21563c 100644 --- a/interactions/external/bubble/src/Options/Classes/Bubble.ts +++ b/interactions/external/bubble/src/Options/Classes/Bubble.ts @@ -14,7 +14,7 @@ import type { IBubble } from "../Interfaces/IBubble.js"; export class Bubble extends BubbleBase implements IBubble, IOptionLoader { divs?: SingleOrMultiple; - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/interactions/external/bubble/src/Options/Classes/BubbleDiv.ts b/interactions/external/bubble/src/Options/Classes/BubbleDiv.ts index fc9bc039c59..c93a4271109 100644 --- a/interactions/external/bubble/src/Options/Classes/BubbleDiv.ts +++ b/interactions/external/bubble/src/Options/Classes/BubbleDiv.ts @@ -13,7 +13,7 @@ export class BubbleDiv extends BubbleBase implements IBubbleDiv, IOptionLoader): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/interactions/external/bubble/src/Utils.ts b/interactions/external/bubble/src/Utils.ts index a651da07599..cfee66735b6 100644 --- a/interactions/external/bubble/src/Utils.ts +++ b/interactions/external/bubble/src/Utils.ts @@ -22,4 +22,6 @@ export function calculateBubbleValue( return clamp(value, modeValue, particleValue); } + + return undefined; } diff --git a/interactions/external/bubble/src/index.ts b/interactions/external/bubble/src/index.ts index 645b72ef478..58af90c1093 100644 --- a/interactions/external/bubble/src/index.ts +++ b/interactions/external/bubble/src/index.ts @@ -1,27 +1,25 @@ -import { Bubbler } from "./Bubbler.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalBubbleInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalBubbleInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalBubble", - container => { - return Promise.resolve(new Bubbler(container, engine)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalBubble", async container => { + const { Bubbler } = await import("./Bubbler.js"); + + return new Bubbler(e, container); + }); + }); } export * from "./Options/Classes/BubbleBase.js"; export * from "./Options/Classes/BubbleDiv.js"; export * from "./Options/Classes/Bubble.js"; -export * from "./Options/Interfaces/IBubbleBase.js"; -export * from "./Options/Interfaces/IBubbleDiv.js"; -export * from "./Options/Interfaces/IBubble.js"; +export type * from "./Options/Interfaces/IBubbleBase.js"; +export type * from "./Options/Interfaces/IBubbleDiv.js"; +export type * from "./Options/Interfaces/IBubble.js"; diff --git a/interactions/external/bubble/webpack.config.js b/interactions/external/bubble/webpack.config.js index 97802f397f0..969071bc3a4 100644 --- a/interactions/external/bubble/webpack.config.js +++ b/interactions/external/bubble/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "bubble", pluginName: "Bubble", version, diff --git a/interactions/external/connect/.eslintignore b/interactions/external/connect/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/connect/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/connect/.eslintrc.js b/interactions/external/connect/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/connect/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/connect/CHANGELOG.md b/interactions/external/connect/CHANGELOG.md index ebb77243233..a35ce95ae17 100644 --- a/interactions/external/connect/CHANGELOG.md +++ b/interactions/external/connect/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-connect diff --git a/interactions/external/connect/eslint.config.js b/interactions/external/connect/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/connect/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/connect/package.dist.json b/interactions/external/connect/package.dist.json index 35d6efb2607..f5f74b966bd 100644 --- a/interactions/external/connect/package.dist.json +++ b/interactions/external/connect/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-connect", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles connect external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/connect/package.json b/interactions/external/connect/package.json index 086970693e0..c774849e699 100644 --- a/interactions/external/connect/package.json +++ b/interactions/external/connect/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-connect", - "version": "3.9.1", - "description": "tsParticles connect external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-connect", + "version": "4.0.0-alpha.0", + "description": "tsParticles connect external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/connect" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/connect" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/connect/src/Connector.ts b/interactions/external/connect/src/Connector.ts index 412212d7b4d..b0344ec71bb 100644 --- a/interactions/external/connect/src/Connector.ts +++ b/interactions/external/connect/src/Connector.ts @@ -96,9 +96,7 @@ export class Connector extends ExternalInteractorBase { options: Modes & ConnectMode, ...sources: RecursivePartial<(IModes & IConnectMode) | undefined>[] ): void { - if (!options.connect) { - options.connect = new Connect(); - } + options.connect ??= new Connect(); for (const source of sources) { options.connect.load(source?.connect); diff --git a/interactions/external/connect/src/Utils.ts b/interactions/external/connect/src/Utils.ts index 9f2feaefcc5..17ec9baa8a9 100644 --- a/interactions/external/connect/src/Utils.ts +++ b/interactions/external/connect/src/Utils.ts @@ -35,14 +35,15 @@ export function gradient( return; } - const sourcePos = p1.getPosition(), + const { container } = p1, + sourcePos = p1.getPosition(), destPos = p2.getPosition(), midRgb = colorMix(color1, color2, p1.getRadius(), p2.getRadius()), grad = context.createLinearGradient(sourcePos.x, sourcePos.y, destPos.x, destPos.y); - grad.addColorStop(gradientMin, getStyleFromHsl(color1, opacity)); - grad.addColorStop(clamp(gradStop, gradientMin, gradientMax), getStyleFromRgb(midRgb, opacity)); - grad.addColorStop(gradientMax, getStyleFromHsl(color2, opacity)); + grad.addColorStop(gradientMin, getStyleFromHsl(color1, container.hdr, opacity)); + grad.addColorStop(clamp(gradStop, gradientMin, gradientMax), getStyleFromRgb(midRgb, container.hdr, opacity)); + grad.addColorStop(gradientMax, getStyleFromHsl(color2, container.hdr, opacity)); return grad; } diff --git a/interactions/external/connect/src/index.ts b/interactions/external/connect/src/index.ts index f314df63bac..ea45c7b17c3 100644 --- a/interactions/external/connect/src/index.ts +++ b/interactions/external/connect/src/index.ts @@ -1,25 +1,23 @@ -import { Connector } from "./Connector.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalConnectInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalConnectInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalConnect", - container => { - return Promise.resolve(new Connector(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalConnect", async container => { + const { Connector } = await import("./Connector.js"); + + return new Connector(container); + }); + }); } export * from "./Options/Classes/Connect.js"; export * from "./Options/Classes/ConnectLinks.js"; -export * from "./Options/Interfaces/IConnect.js"; -export * from "./Options/Interfaces/IConnectLinks.js"; +export type * from "./Options/Interfaces/IConnect.js"; +export type * from "./Options/Interfaces/IConnectLinks.js"; diff --git a/interactions/external/connect/webpack.config.js b/interactions/external/connect/webpack.config.js index 71442d4051a..ba22d13bf72 100644 --- a/interactions/external/connect/webpack.config.js +++ b/interactions/external/connect/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "connect", pluginName: "Connect", version, diff --git a/interactions/external/grab/.eslintignore b/interactions/external/grab/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/grab/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/grab/.eslintrc.js b/interactions/external/grab/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/grab/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/grab/CHANGELOG.md b/interactions/external/grab/CHANGELOG.md index 453a7c1f0fb..085a245be4b 100644 --- a/interactions/external/grab/CHANGELOG.md +++ b/interactions/external/grab/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-grab diff --git a/interactions/external/grab/eslint.config.js b/interactions/external/grab/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/grab/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/grab/package.dist.json b/interactions/external/grab/package.dist.json index 8a60532e673..d8b9dafc238 100644 --- a/interactions/external/grab/package.dist.json +++ b/interactions/external/grab/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-grab", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles grab external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/grab/package.json b/interactions/external/grab/package.json index a7c4a8c134d..912ea2b5168 100644 --- a/interactions/external/grab/package.json +++ b/interactions/external/grab/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-grab", - "version": "3.9.1", - "description": "tsParticles grab external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-grab", + "version": "4.0.0-alpha.0", + "description": "tsParticles grab external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/grab" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/grab" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/grab/src/Grabber.ts b/interactions/external/grab/src/Grabber.ts index c5840734d5e..8c5689adad3 100644 --- a/interactions/external/grab/src/Grabber.ts +++ b/interactions/external/grab/src/Grabber.ts @@ -127,9 +127,7 @@ export class Grabber extends ExternalInteractorBase { } loadModeOptions(options: Modes & GrabMode, ...sources: RecursivePartial<(IModes & IGrabMode) | undefined>[]): void { - if (!options.grab) { - options.grab = new Grab(); - } + options.grab ??= new Grab(); for (const source of sources) { options.grab.load(source?.grab); diff --git a/interactions/external/grab/src/Utils.ts b/interactions/external/grab/src/Utils.ts index bb787528f55..125a5a13ef6 100644 --- a/interactions/external/grab/src/Utils.ts +++ b/interactions/external/grab/src/Utils.ts @@ -11,6 +11,7 @@ const defaultWidth = 0; * @param end - The second position of the line. * @param colorLine - The color of the line. * @param opacity - The opacity of the line. + * @param hdr - Whether the line should be drawn in HDR mode or not. */ export function drawGrabLine( context: CanvasRenderingContext2D, @@ -19,10 +20,11 @@ export function drawGrabLine( end: ICoordinates, colorLine: IRgb, opacity: number, + hdr = false, ): void { drawLine(context, begin, end); - context.strokeStyle = getStyleFromRgb(colorLine, opacity); + context.strokeStyle = getStyleFromRgb(colorLine, hdr, opacity); context.lineWidth = width; context.stroke(); } @@ -44,6 +46,14 @@ export function drawGrab( container.canvas.draw(ctx => { const beginPos = particle.getPosition(); - drawGrabLine(ctx, particle.retina.linksWidth ?? defaultWidth, beginPos, mousePos, lineColor, opacity); + drawGrabLine( + ctx, + particle.retina.linksWidth ?? defaultWidth, + beginPos, + mousePos, + lineColor, + opacity, + container.hdr, + ); }); } diff --git a/interactions/external/grab/src/index.ts b/interactions/external/grab/src/index.ts index db96add21bf..6f2f26d3fa4 100644 --- a/interactions/external/grab/src/index.ts +++ b/interactions/external/grab/src/index.ts @@ -1,25 +1,23 @@ import { type Engine } from "@tsparticles/engine"; -import { Grabber } from "./Grabber.js"; declare const __VERSION__: string; /** * @param engine - The engine to load the interaction for. - * @param refresh - */ -export async function loadExternalGrabInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalGrabInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalGrab", - container => { - return Promise.resolve(new Grabber(container, engine)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalGrab", async container => { + const { Grabber } = await import("./Grabber.js"); + + return new Grabber(container, engine); + }); + }); } export * from "./Options/Classes/Grab.js"; export * from "./Options/Classes/GrabLinks.js"; -export * from "./Options/Interfaces/IGrab.js"; -export * from "./Options/Interfaces/IGrabLinks.js"; +export type * from "./Options/Interfaces/IGrab.js"; +export type * from "./Options/Interfaces/IGrabLinks.js"; diff --git a/interactions/external/grab/webpack.config.js b/interactions/external/grab/webpack.config.js index c4be520a1d1..187e29664a0 100644 --- a/interactions/external/grab/webpack.config.js +++ b/interactions/external/grab/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ moduleName: "grab", pluginName: "Grab", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "grab", pluginName: "Grab", version, dir: __dirname }); diff --git a/interactions/external/particle/.eslintignore b/interactions/external/particle/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/particle/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/particle/.eslintrc.js b/interactions/external/particle/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/particle/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/particle/CHANGELOG.md b/interactions/external/particle/CHANGELOG.md index 8cda0e6824b..020a68edc69 100644 --- a/interactions/external/particle/CHANGELOG.md +++ b/interactions/external/particle/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-particle + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-particle diff --git a/interactions/external/particle/eslint.config.js b/interactions/external/particle/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/particle/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/particle/package.dist.json b/interactions/external/particle/package.dist.json index 8badbc3aaaf..bc6f93f51e2 100644 --- a/interactions/external/particle/package.dist.json +++ b/interactions/external/particle/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-particle", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particle external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/particle/package.json b/interactions/external/particle/package.json index 7a86892c0f6..847dd83f733 100644 --- a/interactions/external/particle/package.json +++ b/interactions/external/particle/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/interaction-external-particle", - "version": "3.9.1", - "description": "tsParticles particle external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-particle", + "version": "4.0.0-alpha.0", + "description": "tsParticles particle external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/particle" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/particle" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/particle/src/InteractivityParticleMaker.ts b/interactions/external/particle/src/InteractivityParticleMaker.ts index 19a8c35286e..0220107d052 100644 --- a/interactions/external/particle/src/InteractivityParticleMaker.ts +++ b/interactions/external/particle/src/InteractivityParticleMaker.ts @@ -8,6 +8,7 @@ import { type RecursivePartial, deepExtend, isInArray, + safeDocument, } from "@tsparticles/engine"; import type { IParticleMode, InteractivityParticleContainer, ParticleMode } from "./Types.js"; import { InteractivityParticle } from "./Options/Classes/InteractivityParticle.js"; @@ -82,7 +83,7 @@ export class InteractivityParticleMaker extends ExternalInteractorBase[] ): void { - if (!options.particle) { - options.particle = new InteractivityParticle(); - } + options.particle ??= new InteractivityParticle(); for (const source of sources) { options.particle.load(source?.particle); diff --git a/interactions/external/particle/src/index.ts b/interactions/external/particle/src/index.ts index bbfbadf4dfb..fe5008ec090 100644 --- a/interactions/external/particle/src/index.ts +++ b/interactions/external/particle/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { InteractivityParticleMaker } from "./InteractivityParticleMaker.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalParticleInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalParticleInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalParticle", - container => { - return Promise.resolve(new InteractivityParticleMaker(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalParticle", async container => { + const { InteractivityParticleMaker } = await import("./InteractivityParticleMaker.js"); + + return new InteractivityParticleMaker(container); + }); + }); } diff --git a/interactions/external/particle/webpack.config.js b/interactions/external/particle/webpack.config.js index 3716cc5789a..f6e735f5038 100644 --- a/interactions/external/particle/webpack.config.js +++ b/interactions/external/particle/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "particle", pluginName: "Particle", version, diff --git a/interactions/external/pause/.eslintignore b/interactions/external/pause/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/pause/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/pause/.eslintrc.js b/interactions/external/pause/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/pause/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/pause/CHANGELOG.md b/interactions/external/pause/CHANGELOG.md index 1e8ad99b7bd..051bb38ee0d 100644 --- a/interactions/external/pause/CHANGELOG.md +++ b/interactions/external/pause/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-pause + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-pause diff --git a/interactions/external/pause/eslint.config.js b/interactions/external/pause/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/pause/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/pause/package.dist.json b/interactions/external/pause/package.dist.json index aaa383acad6..73a829f06cf 100644 --- a/interactions/external/pause/package.dist.json +++ b/interactions/external/pause/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-pause", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles pause external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/pause/package.json b/interactions/external/pause/package.json index a44be3fedaf..44c2bd7417c 100644 --- a/interactions/external/pause/package.json +++ b/interactions/external/pause/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-pause", - "version": "3.9.1", - "description": "tsParticles pause external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-pause", + "version": "4.0.0-alpha.0", + "description": "tsParticles pause external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/pause" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/pause" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/pause/src/index.ts b/interactions/external/pause/src/index.ts index 7162727deaa..32faacdb590 100644 --- a/interactions/external/pause/src/index.ts +++ b/interactions/external/pause/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { Pauser } from "./Pauser.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalPauseInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalPauseInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalPause", - container => { - return Promise.resolve(new Pauser(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalPause", async container => { + const { Pauser } = await import("./Pauser.js"); + + return new Pauser(container); + }); + }); } diff --git a/interactions/external/pause/webpack.config.js b/interactions/external/pause/webpack.config.js index dd70955dbaf..fc6329589c1 100644 --- a/interactions/external/pause/webpack.config.js +++ b/interactions/external/pause/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "pause", pluginName: "Pause", version, diff --git a/interactions/external/pop/.eslintignore b/interactions/external/pop/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/pop/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/pop/.eslintrc.js b/interactions/external/pop/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/pop/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/pop/CHANGELOG.md b/interactions/external/pop/CHANGELOG.md index 3544f3d5935..a599d4b46cd 100644 --- a/interactions/external/pop/CHANGELOG.md +++ b/interactions/external/pop/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-pop + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-pop diff --git a/interactions/external/pop/eslint.config.js b/interactions/external/pop/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/pop/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/pop/package.dist.json b/interactions/external/pop/package.dist.json index 0aa8959da27..f330378c257 100644 --- a/interactions/external/pop/package.dist.json +++ b/interactions/external/pop/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-pop", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles pop external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/pop/package.json b/interactions/external/pop/package.json index e96377e1e9d..e9b2642a2c1 100644 --- a/interactions/external/pop/package.json +++ b/interactions/external/pop/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-pop", - "version": "3.9.1", - "description": "tsParticles pop external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-pop", + "version": "4.0.0-alpha.0", + "description": "tsParticles pop external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/pop" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/pop" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/pop/src/index.ts b/interactions/external/pop/src/index.ts index 32d20298b2e..37ebc172b05 100644 --- a/interactions/external/pop/src/index.ts +++ b/interactions/external/pop/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { Popper } from "./Popper.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalPopInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalPopInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalPop", - container => { - return Promise.resolve(new Popper(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalPop", async container => { + const { Popper } = await import("./Popper.js"); + + return new Popper(container); + }); + }); } diff --git a/interactions/external/pop/webpack.config.js b/interactions/external/pop/webpack.config.js index ea391b5f125..1676dc1ffaf 100644 --- a/interactions/external/pop/webpack.config.js +++ b/interactions/external/pop/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "pop", pluginName: "Pop", version, diff --git a/interactions/external/push/.eslintignore b/interactions/external/push/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/push/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/push/.eslintrc.js b/interactions/external/push/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/push/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/push/CHANGELOG.md b/interactions/external/push/CHANGELOG.md index f370106d97f..f51400d6294 100644 --- a/interactions/external/push/CHANGELOG.md +++ b/interactions/external/push/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-push + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-push diff --git a/interactions/external/push/eslint.config.js b/interactions/external/push/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/push/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/push/package.dist.json b/interactions/external/push/package.dist.json index 14662947afe..d49ed9724e5 100644 --- a/interactions/external/push/package.dist.json +++ b/interactions/external/push/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-push", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles push external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/push/package.json b/interactions/external/push/package.json index a21d5ddc963..37e5b58be1d 100644 --- a/interactions/external/push/package.json +++ b/interactions/external/push/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-push", - "version": "3.9.1", - "description": "tsParticles push external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-push", + "version": "4.0.0-alpha.0", + "description": "tsParticles push external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/push" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/push" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/push/src/Pusher.ts b/interactions/external/push/src/Pusher.ts index 57d1df07370..60fc65d4e13 100644 --- a/interactions/external/push/src/Pusher.ts +++ b/interactions/external/push/src/Pusher.ts @@ -48,7 +48,7 @@ export class Pusher extends ExternalInteractorBase { particlesOptions = itemFromSingleOrMultiple(pushOptions.particles), overrideOptions = deepExtend(groupOptions, particlesOptions) as RecursivePartial; - void container.particles.push(quantity, container.interactivity.mouse, overrideOptions, group); + container.particles.push(quantity, container.interactivity.mouse, overrideOptions, group); }; } @@ -69,9 +69,7 @@ export class Pusher extends ExternalInteractorBase { } loadModeOptions(options: Modes & PushMode, ...sources: RecursivePartial<(IModes & IPushMode) | undefined>[]): void { - if (!options.push) { - options.push = new Push(); - } + options.push ??= new Push(); for (const source of sources) { options.push.load(source?.push); diff --git a/interactions/external/push/src/index.ts b/interactions/external/push/src/index.ts index 5451c1473ae..3508c2ff342 100644 --- a/interactions/external/push/src/index.ts +++ b/interactions/external/push/src/index.ts @@ -1,23 +1,21 @@ import { type Engine } from "@tsparticles/engine"; -import { Pusher } from "./Pusher.js"; declare const __VERSION__: string; /** * @param engine - The engine to use for the interaction - * @param refresh - */ -export async function loadExternalPushInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalPushInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalPush", - container => { - return Promise.resolve(new Pusher(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalPush", async container => { + const { Pusher } = await import("./Pusher.js"); + + return new Pusher(container); + }); + }); } export * from "./Options/Classes/Push.js"; -export * from "./Options/Interfaces/IPush.js"; +export type * from "./Options/Interfaces/IPush.js"; diff --git a/interactions/external/push/webpack.config.js b/interactions/external/push/webpack.config.js index a529d06a76a..adc625b25c1 100644 --- a/interactions/external/push/webpack.config.js +++ b/interactions/external/push/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ moduleName: "push", pluginName: "Push", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "push", pluginName: "Push", version, dir: __dirname }); diff --git a/interactions/external/remove/.eslintignore b/interactions/external/remove/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/remove/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/remove/.eslintrc.js b/interactions/external/remove/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/remove/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/remove/CHANGELOG.md b/interactions/external/remove/CHANGELOG.md index 87a6d5b9ca7..7e0be08531e 100644 --- a/interactions/external/remove/CHANGELOG.md +++ b/interactions/external/remove/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-remove + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-remove diff --git a/interactions/external/remove/eslint.config.js b/interactions/external/remove/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/remove/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/remove/package.dist.json b/interactions/external/remove/package.dist.json index 0ccde1a2146..42c79f9fd2b 100644 --- a/interactions/external/remove/package.dist.json +++ b/interactions/external/remove/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-remove", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles remove external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/remove/package.json b/interactions/external/remove/package.json index da11859e90c..7d163eaad8f 100644 --- a/interactions/external/remove/package.json +++ b/interactions/external/remove/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-remove", - "version": "3.9.1", - "description": "tsParticles remove external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-remove", + "version": "4.0.0-alpha.0", + "description": "tsParticles remove external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/remove" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/remove" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/remove/src/Remover.ts b/interactions/external/remove/src/Remover.ts index 734d9292bb4..b316dcffef4 100644 --- a/interactions/external/remove/src/Remover.ts +++ b/interactions/external/remove/src/Remover.ts @@ -53,9 +53,7 @@ export class Remover extends ExternalInteractorBase { options: Modes & RemoveMode, ...sources: RecursivePartial<(IModes & IRemoveMode) | undefined>[] ): void { - if (!options.remove) { - options.remove = new Remove(); - } + options.remove ??= new Remove(); for (const source of sources) { options.remove.load(source?.remove); diff --git a/interactions/external/remove/src/index.ts b/interactions/external/remove/src/index.ts index e1cfbe6b3f0..85ec4f4a1f8 100644 --- a/interactions/external/remove/src/index.ts +++ b/interactions/external/remove/src/index.ts @@ -1,23 +1,21 @@ import { type Engine } from "@tsparticles/engine"; -import { Remover } from "./Remover.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalRemoveInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalRemoveInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalRemove", - container => { - return Promise.resolve(new Remover(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalRemove", async container => { + const { Remover } = await import("./Remover.js"); + + return new Remover(container); + }); + }); } export * from "./Options/Classes/Remove.js"; -export * from "./Options/Interfaces/IRemove.js"; +export type * from "./Options/Interfaces/IRemove.js"; diff --git a/interactions/external/remove/webpack.config.js b/interactions/external/remove/webpack.config.js index 313c66c26ec..b9ab89c7b5d 100644 --- a/interactions/external/remove/webpack.config.js +++ b/interactions/external/remove/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "remove", pluginName: "Remove", version, diff --git a/interactions/external/repulse/.eslintignore b/interactions/external/repulse/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/repulse/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/repulse/.eslintrc.js b/interactions/external/repulse/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/repulse/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/repulse/CHANGELOG.md b/interactions/external/repulse/CHANGELOG.md index 53a3969d182..0fa9380a912 100644 --- a/interactions/external/repulse/CHANGELOG.md +++ b/interactions/external/repulse/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-repulse + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-repulse diff --git a/interactions/external/repulse/eslint.config.js b/interactions/external/repulse/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/repulse/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/repulse/package.dist.json b/interactions/external/repulse/package.dist.json index e0637a71089..379b2779d38 100644 --- a/interactions/external/repulse/package.dist.json +++ b/interactions/external/repulse/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-repulse", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles repulse external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/repulse/package.json b/interactions/external/repulse/package.json index 6ac8ad9b947..78d5b23f4b9 100644 --- a/interactions/external/repulse/package.json +++ b/interactions/external/repulse/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-repulse", - "version": "3.9.1", - "description": "tsParticles repulse external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-repulse", + "version": "4.0.0-alpha.0", + "description": "tsParticles repulse external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/repulse" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/repulse" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/repulse/src/Options/Classes/Repulse.ts b/interactions/external/repulse/src/Options/Classes/Repulse.ts index c4beb78b3d4..151dc430019 100644 --- a/interactions/external/repulse/src/Options/Classes/Repulse.ts +++ b/interactions/external/repulse/src/Options/Classes/Repulse.ts @@ -14,7 +14,7 @@ import { RepulseDiv } from "./RepulseDiv.js"; export class Repulse extends RepulseBase implements IRepulse, IOptionLoader { divs?: SingleOrMultiple; - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/interactions/external/repulse/src/Options/Classes/RepulseDiv.ts b/interactions/external/repulse/src/Options/Classes/RepulseDiv.ts index 38c0c04bc83..c90d4833cdf 100644 --- a/interactions/external/repulse/src/Options/Classes/RepulseDiv.ts +++ b/interactions/external/repulse/src/Options/Classes/RepulseDiv.ts @@ -13,7 +13,7 @@ export class RepulseDiv extends RepulseBase implements IRepulseDiv, IOptionLoade this.selectors = []; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/interactions/external/repulse/src/Repulser.ts b/interactions/external/repulse/src/Repulser.ts index 9ac5f6ba238..480d601d86e 100644 --- a/interactions/external/repulse/src/Repulser.ts +++ b/interactions/external/repulse/src/Repulser.ts @@ -20,6 +20,7 @@ import { isInArray, millisecondsToSeconds, mouseMoveEvent, + safeDocument, } from "@tsparticles/engine"; import type { IRepulseMode, RepulseContainer, RepulseMode } from "./Types.js"; import { Repulse } from "./Options/Classes/Repulse.js"; @@ -48,9 +49,7 @@ export class Repulser extends ExternalInteractorBase { this._engine = engine; - if (!container.repulse) { - container.repulse = { particles: [] }; - } + container.repulse ??= { particles: [] }; this.handleClickMode = (mode): void => { const options = this.container.actualOptions, @@ -60,9 +59,7 @@ export class Repulser extends ExternalInteractorBase { return; } - if (!container.repulse) { - container.repulse = { particles: [] }; - } + container.repulse ??= { particles: [] }; const repulse = container.repulse; @@ -123,7 +120,9 @@ export class Repulser extends ExternalInteractorBase { } else if (clickEnabled && isInArray(repulseMode, clickMode)) { this._clickRepulse(); } else { - divModeExecute(repulseMode, divs, (selector, div): void => this._singleSelectorRepulse(selector, div)); + divModeExecute(repulseMode, divs, (selector, div): void => { + this._singleSelectorRepulse(selector, div); + }); } } @@ -151,9 +150,7 @@ export class Repulser extends ExternalInteractorBase { options: Modes & RepulseMode, ...sources: RecursivePartial<(IModes & IRepulseMode) | undefined>[] ): void { - if (!options.repulse) { - options.repulse = new Repulse(); - } + options.repulse ??= new Repulse(); for (const source of sources) { options.repulse.load(source?.repulse); @@ -175,10 +172,7 @@ export class Repulser extends ExternalInteractorBase { const repulse = container.repulse ?? { particles: [] }; if (!repulse.finish) { - if (!repulse.count) { - repulse.count = 0; - } - + repulse.count ??= 0; repulse.count++; if (repulse.count === container.particles.count) { @@ -282,7 +276,7 @@ export class Repulser extends ExternalInteractorBase { return; } - const query = document.querySelectorAll(selector); + const query = safeDocument().querySelectorAll(selector); if (!query.length) { return; @@ -584,7 +578,7 @@ export class Repulser extends ExternalInteractorBase { return; } - const query = document.querySelectorAll(selector); + const query = safeDocument().querySelectorAll(selector); if (!query.length) { return; diff --git a/interactions/external/repulse/src/index.ts b/interactions/external/repulse/src/index.ts index 49615dc2db1..fc15e9607b7 100644 --- a/interactions/external/repulse/src/index.ts +++ b/interactions/external/repulse/src/index.ts @@ -1,27 +1,25 @@ import { type Engine } from "@tsparticles/engine"; -import { Repulser } from "./Repulser.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalRepulseInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalRepulseInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalRepulse", - container => { - return Promise.resolve(new Repulser(engine, container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalRepulse", async container => { + const { Repulser } = await import("./Repulser.js"); + + return new Repulser(engine, container); + }); + }); } export * from "./Options/Classes/RepulseBase.js"; export * from "./Options/Classes/RepulseDiv.js"; export * from "./Options/Classes/Repulse.js"; -export * from "./Options/Interfaces/IRepulseBase.js"; -export * from "./Options/Interfaces/IRepulseDiv.js"; -export * from "./Options/Interfaces/IRepulse.js"; +export type * from "./Options/Interfaces/IRepulseBase.js"; +export type * from "./Options/Interfaces/IRepulseDiv.js"; +export type * from "./Options/Interfaces/IRepulse.js"; diff --git a/interactions/external/repulse/webpack.config.js b/interactions/external/repulse/webpack.config.js index d02001dad9d..a348e6806d4 100644 --- a/interactions/external/repulse/webpack.config.js +++ b/interactions/external/repulse/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "repulse", pluginName: "Repulse", version, diff --git a/interactions/external/slow/.eslintignore b/interactions/external/slow/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/slow/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/slow/.eslintrc.js b/interactions/external/slow/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/slow/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/slow/CHANGELOG.md b/interactions/external/slow/CHANGELOG.md index ef5eb09452b..ecdd3c012ab 100644 --- a/interactions/external/slow/CHANGELOG.md +++ b/interactions/external/slow/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-slow + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-slow diff --git a/interactions/external/slow/eslint.config.js b/interactions/external/slow/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/slow/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/slow/package.dist.json b/interactions/external/slow/package.dist.json index 4fc1e5ebaa8..83f00a5f92e 100644 --- a/interactions/external/slow/package.dist.json +++ b/interactions/external/slow/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-slow", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles slow external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/slow/package.json b/interactions/external/slow/package.json index fed9e397e79..c0bdb3caf73 100644 --- a/interactions/external/slow/package.json +++ b/interactions/external/slow/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-external-slow", - "version": "3.9.1", - "description": "tsParticles slow external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-slow", + "version": "4.0.0-alpha.0", + "description": "tsParticles slow external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/slow" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/slow" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/slow/src/Slower.ts b/interactions/external/slow/src/Slower.ts index 02e1a4fd785..49d9e56561e 100644 --- a/interactions/external/slow/src/Slower.ts +++ b/interactions/external/slow/src/Slower.ts @@ -23,7 +23,7 @@ export class Slower extends ExternalInteractorBase { super(container); } - clear(particle: Particle, delta: IDelta, force?: boolean): void { + clear(particle: Particle, _delta: IDelta, force?: boolean): void { if (particle.slow.inRange && !force) { return; } @@ -55,9 +55,7 @@ export class Slower extends ExternalInteractorBase { } loadModeOptions(options: Modes & SlowMode, ...sources: RecursivePartial<(IModes & ISlowMode) | undefined>[]): void { - if (!options.slow) { - options.slow = new Slow(); - } + options.slow ??= new Slow(); for (const source of sources) { options.slow.load(source?.slow); diff --git a/interactions/external/slow/src/index.ts b/interactions/external/slow/src/index.ts index db508bae9bb..71b63e02874 100644 --- a/interactions/external/slow/src/index.ts +++ b/interactions/external/slow/src/index.ts @@ -1,23 +1,21 @@ import { type Engine } from "@tsparticles/engine"; -import { Slower } from "./Slower.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalSlowInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalSlowInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalSlow", - container => { - return Promise.resolve(new Slower(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalSlow", async container => { + const { Slower } = await import("./Slower.js"); + + return new Slower(container); + }); + }); } export * from "./Options/Classes/Slow.js"; -export * from "./Options/Interfaces/ISlow.js"; +export type * from "./Options/Interfaces/ISlow.js"; diff --git a/interactions/external/slow/webpack.config.js b/interactions/external/slow/webpack.config.js index dc768d5e314..7ca81260a99 100644 --- a/interactions/external/slow/webpack.config.js +++ b/interactions/external/slow/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ moduleName: "slow", pluginName: "Slow", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "slow", pluginName: "Slow", version, dir: __dirname }); diff --git a/interactions/external/trail/.eslintignore b/interactions/external/trail/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/external/trail/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/external/trail/.eslintrc.js b/interactions/external/trail/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/external/trail/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/external/trail/CHANGELOG.md b/interactions/external/trail/CHANGELOG.md index a5f8c45dc3e..1521f6c6c50 100644 --- a/interactions/external/trail/CHANGELOG.md +++ b/interactions/external/trail/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-external-trail + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-external-trail diff --git a/interactions/external/trail/eslint.config.js b/interactions/external/trail/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/external/trail/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/external/trail/package.dist.json b/interactions/external/trail/package.dist.json index 5cfb01fea3d..fb5cda91127 100644 --- a/interactions/external/trail/package.dist.json +++ b/interactions/external/trail/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-external-trail", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles trail external interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/external/trail/package.json b/interactions/external/trail/package.json index 4d7286a0683..5d765eeaeb6 100644 --- a/interactions/external/trail/package.json +++ b/interactions/external/trail/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/interaction-external-trail", - "version": "3.9.1", - "description": "tsParticles trail external interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-external-trail", + "version": "4.0.0-alpha.0", + "description": "tsParticles trail external interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/external/trail" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/external/trail" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/external/trail/src/TrailMaker.ts b/interactions/external/trail/src/TrailMaker.ts index 51c7e890131..bb8bb86f464 100644 --- a/interactions/external/trail/src/TrailMaker.ts +++ b/interactions/external/trail/src/TrailMaker.ts @@ -97,9 +97,7 @@ export class TrailMaker extends ExternalInteractorBase { options: Modes & TrailMode, ...sources: RecursivePartial<(IModes & ITrailMode) | undefined>[] ): void { - if (!options.trail) { - options.trail = new Trail(); - } + options.trail ??= new Trail(); for (const source of sources) { options.trail.load(source?.trail); diff --git a/interactions/external/trail/src/index.ts b/interactions/external/trail/src/index.ts index d8ea82a6b30..caf4ab69b7d 100644 --- a/interactions/external/trail/src/index.ts +++ b/interactions/external/trail/src/index.ts @@ -1,23 +1,21 @@ import { type Engine } from "@tsparticles/engine"; -import { TrailMaker } from "./TrailMaker.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExternalTrailInteraction(engine: Engine, refresh = true): Promise { +export function loadExternalTrailInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalTrail", - container => { - return Promise.resolve(new TrailMaker(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalTrail", async container => { + const { TrailMaker } = await import("./TrailMaker.js"); + + return new TrailMaker(container); + }); + }); } export * from "./Options/Classes/Trail.js"; -export * from "./Options/Interfaces/ITrail.js"; +export type * from "./Options/Interfaces/ITrail.js"; diff --git a/interactions/external/trail/webpack.config.js b/interactions/external/trail/webpack.config.js index 3f68fa6ac38..384b75bacaf 100644 --- a/interactions/external/trail/webpack.config.js +++ b/interactions/external/trail/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionExternal } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionExternal } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionExternal({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionExternal({ moduleName: "trail", pluginName: "Trail", version, diff --git a/interactions/light/.eslintignore b/interactions/light/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/light/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/light/.eslintrc.js b/interactions/light/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/light/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/light/CHANGELOG.md b/interactions/light/CHANGELOG.md index b33e80afbb5..aa311dfcf6d 100644 --- a/interactions/light/CHANGELOG.md +++ b/interactions/light/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-light diff --git a/interactions/light/eslint.config.js b/interactions/light/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/light/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/light/package.dist.json b/interactions/light/package.dist.json index ae2811b87d1..b97b6466f57 100644 --- a/interactions/light/package.dist.json +++ b/interactions/light/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-light", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles Light interaction", "homepage": "https://particles.js.org", "repository": { @@ -101,9 +101,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/light/package.json b/interactions/light/package.json index 7c122929d0b..02208467ca8 100644 --- a/interactions/light/package.json +++ b/interactions/light/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/interaction-light", - "version": "3.9.1", - "description": "tsParticles Light interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-light", + "version": "4.0.0-alpha.0", + "description": "tsParticles Light interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/light" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/light" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/light/src/ExternalLighter.ts b/interactions/light/src/ExternalLighter.ts index 8da67f81723..2e5a9c29d2d 100644 --- a/interactions/light/src/ExternalLighter.ts +++ b/interactions/light/src/ExternalLighter.ts @@ -76,9 +76,7 @@ export class ExternalLighter extends ExternalInteractorBase { options: Modes & LightMode, ...sources: RecursivePartial<(IModes & ILightMode) | undefined>[] ): void { - if (!options.light) { - options.light = new Light(); - } + options.light ??= new Light(); for (const source of sources) { options.light.load(source?.light); diff --git a/interactions/light/src/ParticlesLighter.ts b/interactions/light/src/ParticlesLighter.ts index e8261e4950f..225d3b92bb2 100644 --- a/interactions/light/src/ParticlesLighter.ts +++ b/interactions/light/src/ParticlesLighter.ts @@ -41,7 +41,7 @@ export class ParticlesLighter extends ParticlesInteractorBase { isEnabled(particle: LightParticle): boolean { const container = this.container, - interactivity = particle.interactivity ?? container.actualOptions.interactivity, + interactivity = particle.interactivity, mouse = container.interactivity.mouse, events = interactivity.events; diff --git a/interactions/light/src/Utils.ts b/interactions/light/src/Utils.ts index 9ce217fe501..92c11253310 100644 --- a/interactions/light/src/Utils.ts +++ b/interactions/light/src/Utils.ts @@ -45,8 +45,8 @@ export function drawLight(container: LightContainer, context: CanvasRenderingCon return; } - gradientAmbientLight.addColorStop(gradientPos.min, getStyleFromRgb(gradientRgb.start)); - gradientAmbientLight.addColorStop(gradientPos.max, getStyleFromRgb(gradientRgb.stop)); + gradientAmbientLight.addColorStop(gradientPos.min, getStyleFromRgb(gradientRgb.start, container.hdr)); + gradientAmbientLight.addColorStop(gradientPos.max, getStyleFromRgb(gradientRgb.stop, container.hdr)); context.fillStyle = gradientAmbientLight; context.fill(); @@ -107,7 +107,7 @@ export function drawParticleShadow( }); } - const shadowColor = getStyleFromRgb(shadowRgb), + const shadowColor = getStyleFromRgb(shadowRgb, container.hdr), lastOffset = 1, firstPos = 0, last = points.length - lastOffset; @@ -115,11 +115,18 @@ export function drawParticleShadow( for (let i = last, n = 0; i >= firstPos; n = i--) { context.beginPath(); - context.moveTo(points[i].start.x, points[i].start.y); + const iPoint = points[i], + nPoint = points[n]; - context.lineTo(points[n].start.x, points[n].start.y); - context.lineTo(points[n].end.x, points[n].end.y); - context.lineTo(points[i].end.x, points[i].end.y); + if (!iPoint || !nPoint) { + continue; + } + + context.moveTo(iPoint.start.x, iPoint.start.y); + + context.lineTo(nPoint.start.x, nPoint.start.y); + context.lineTo(nPoint.end.x, nPoint.end.y); + context.lineTo(iPoint.end.x, iPoint.end.y); context.fillStyle = shadowColor; diff --git a/interactions/light/src/index.ts b/interactions/light/src/index.ts index 295fbc9d33f..d6664004268 100644 --- a/interactions/light/src/index.ts +++ b/interactions/light/src/index.ts @@ -1,37 +1,32 @@ import { type Engine } from "@tsparticles/engine"; -import { ExternalLighter } from "./ExternalLighter.js"; -import { ParticlesLighter } from "./ParticlesLighter.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadLightInteraction(engine: Engine, refresh = true): Promise { +export function loadLightInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "externalLight", - container => { - return Promise.resolve(new ExternalLighter(container, engine)); - }, - refresh, - ); - await engine.addInteractor( - "particlesLight", - container => { - return Promise.resolve(new ParticlesLighter(container, engine)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("externalLight", async container => { + const { ExternalLighter } = await import("./ExternalLighter.js"); + + return new ExternalLighter(container, engine); + }); + e.addInteractor("particlesLight", async container => { + const { ParticlesLighter } = await import("./ParticlesLighter.js"); + + return new ParticlesLighter(container, engine); + }); + }); } export * from "./Options/Classes/Light.js"; export * from "./Options/Classes/LightArea.js"; export * from "./Options/Classes/LightGradient.js"; export * from "./Options/Classes/LightShadow.js"; -export * from "./Options/Interfaces/ILight.js"; -export * from "./Options/Interfaces/ILightArea.js"; -export * from "./Options/Interfaces/ILightGradient.js"; -export * from "./Options/Interfaces/ILightShadow.js"; +export type * from "./Options/Interfaces/ILight.js"; +export type * from "./Options/Interfaces/ILightArea.js"; +export type * from "./Options/Interfaces/ILightGradient.js"; +export type * from "./Options/Interfaces/ILightShadow.js"; diff --git a/interactions/light/webpack.config.js b/interactions/light/webpack.config.js index 856d2ceb7a3..672110f9e34 100644 --- a/interactions/light/webpack.config.js +++ b/interactions/light/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesInteraction } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteraction } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteraction({ moduleName: "light", pluginName: "Light", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteraction({ moduleName: "light", pluginName: "Light", version, dir: __dirname }); diff --git a/interactions/particles/attract/.eslintignore b/interactions/particles/attract/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/particles/attract/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/particles/attract/.eslintrc.js b/interactions/particles/attract/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/particles/attract/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/particles/attract/CHANGELOG.md b/interactions/particles/attract/CHANGELOG.md index 998a910c998..0fb744cd409 100644 --- a/interactions/particles/attract/CHANGELOG.md +++ b/interactions/particles/attract/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-particles-attract + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-particles-attract diff --git a/interactions/particles/attract/eslint.config.js b/interactions/particles/attract/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/particles/attract/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/particles/attract/package.dist.json b/interactions/particles/attract/package.dist.json index cf43d0d0cb5..84de1158be2 100644 --- a/interactions/particles/attract/package.dist.json +++ b/interactions/particles/attract/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-particles-attract", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles attract particles interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/particles/attract/package.json b/interactions/particles/attract/package.json index 1b7e166a161..f03de4c1b90 100644 --- a/interactions/particles/attract/package.json +++ b/interactions/particles/attract/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-particles-attract", - "version": "3.9.1", - "description": "tsParticles attract particles interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-particles-attract", + "version": "4.0.0-alpha.0", + "description": "tsParticles attract particles interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/particles/attract" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/particles/attract" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/particles/attract/src/Attractor.ts b/interactions/particles/attract/src/Attractor.ts index 43f57bc3931..3aa9e9aca5b 100644 --- a/interactions/particles/attract/src/Attractor.ts +++ b/interactions/particles/attract/src/Attractor.ts @@ -29,9 +29,7 @@ export class Attractor extends ParticlesInteractorBase { +export function loadParticlesAttractInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "particlesAttract", - container => { - return Promise.resolve(new Attractor(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("particlesAttract", async container => { + const { Attractor } = await import("./Attractor.js"); + + return new Attractor(container); + }); + }); } diff --git a/interactions/particles/attract/webpack.config.js b/interactions/particles/attract/webpack.config.js index 067f7ec0ff2..7e88cf46200 100644 --- a/interactions/particles/attract/webpack.config.js +++ b/interactions/particles/attract/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionParticles } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionParticles } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionParticles({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionParticles({ moduleName: "attract", pluginName: "Attract", version, diff --git a/interactions/particles/collisions/.eslintignore b/interactions/particles/collisions/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/particles/collisions/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/particles/collisions/.eslintrc.js b/interactions/particles/collisions/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/particles/collisions/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/particles/collisions/CHANGELOG.md b/interactions/particles/collisions/CHANGELOG.md index 58b9686cb21..195e669ba99 100644 --- a/interactions/particles/collisions/CHANGELOG.md +++ b/interactions/particles/collisions/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-particles-collisions + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-particles-collisions diff --git a/interactions/particles/collisions/eslint.config.js b/interactions/particles/collisions/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/particles/collisions/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/particles/collisions/package.dist.json b/interactions/particles/collisions/package.dist.json index 118f6fc75c7..60fe7b56ed6 100644 --- a/interactions/particles/collisions/package.dist.json +++ b/interactions/particles/collisions/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-particles-collisions", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles collisions particles interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/particles/collisions/package.json b/interactions/particles/collisions/package.json index 853e64aba1d..09677e6c9cf 100644 --- a/interactions/particles/collisions/package.json +++ b/interactions/particles/collisions/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-particles-collisions", - "version": "3.9.1", - "description": "tsParticles collisions particles interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-particles-collisions", + "version": "4.0.0-alpha.0", + "description": "tsParticles collisions particles interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/particles/collisions" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/particles/collisions" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/particles/collisions/src/Absorb.ts b/interactions/particles/collisions/src/Absorb.ts index c03c85dfc62..9f236a35715 100644 --- a/interactions/particles/collisions/src/Absorb.ts +++ b/interactions/particles/collisions/src/Absorb.ts @@ -1,4 +1,5 @@ import { type IDelta, type Particle, clamp } from "@tsparticles/engine"; +import type { CollisionParticle } from "./Types.js"; const half = 0.5, absorbFactor = 10, @@ -6,13 +7,24 @@ const half = 0.5, /** * @param p1 - - * @param r1 - + * @param _r1 - * @param p2 - * @param r2 - * @param delta - * @param pixelRatio - */ -function updateAbsorb(p1: Particle, r1: number, p2: Particle, r2: number, delta: IDelta, pixelRatio: number): void { +function updateAbsorb( + p1: CollisionParticle, + _r1: number, + p2: CollisionParticle, + r2: number, + delta: IDelta, + pixelRatio: number, +): void { + if (!p1.options.collisions || !p2.options.collisions) { + return; + } + const factor = clamp((p1.options.collisions.absorb.speed * delta.factor) / absorbFactor, minAbsorbFactor, r2); p1.size.value += factor * half; @@ -34,11 +46,11 @@ export function absorb(p1: Particle, p2: Particle, delta: IDelta, pixelRatio: nu const r1 = p1.getRadius(), r2 = p2.getRadius(); - if (r1 === undefined && r2 !== undefined) { + if (!r1 && r2) { p1.destroy(); - } else if (r1 !== undefined && r2 === undefined) { + } else if (r1 && !r2) { p2.destroy(); - } else if (r1 !== undefined && r2 !== undefined) { + } else if (r1 && r2) { if (r1 >= r2) { updateAbsorb(p1, r1, p2, r2, delta, pixelRatio); } else { diff --git a/interactions/particles/collisions/src/Bounce.ts b/interactions/particles/collisions/src/Bounce.ts index 880ce63b64e..537649fca1b 100644 --- a/interactions/particles/collisions/src/Bounce.ts +++ b/interactions/particles/collisions/src/Bounce.ts @@ -1,14 +1,17 @@ -import { type Particle, circleBounce, circleBounceDataFromParticle, getRangeValue } from "@tsparticles/engine"; +import { circleBounce, circleBounceDataFromParticle, getRangeValue } from "@tsparticles/engine"; +import { type CollisionParticle } from "./Types.js"; -type BounceParticle = Particle & { +type BounceParticle = CollisionParticle & { collisionMaxSpeed?: number; }; const fixBounceSpeed = (p: BounceParticle): void => { - if (p.collisionMaxSpeed === undefined) { - p.collisionMaxSpeed = getRangeValue(p.options.collisions.maxSpeed); + if (!p.options.collisions) { + return; } + p.collisionMaxSpeed ??= getRangeValue(p.options.collisions.maxSpeed); + if (p.velocity.length > p.collisionMaxSpeed) { p.velocity.length = p.collisionMaxSpeed; } diff --git a/interactions/particles/collisions/src/Collider.ts b/interactions/particles/collisions/src/Collider.ts index d791af8c905..8ef6dff6bde 100644 --- a/interactions/particles/collisions/src/Collider.ts +++ b/interactions/particles/collisions/src/Collider.ts @@ -1,11 +1,19 @@ -import { type Container, type IDelta, type Particle, ParticlesInteractorBase, getDistance } from "@tsparticles/engine"; +import { type CollisionParticle, type IParticlesCollisionOptions, type ParticlesCollisionOptions } from "./Types.js"; +import { + type Container, + type IDelta, + ParticlesInteractorBase, + type RecursivePartial, + getDistance, +} from "@tsparticles/engine"; +import { Collisions } from "./Options/Classes/Collisions.js"; import { resolveCollision } from "./ResolveCollision.js"; const double = 2; /** */ -export class Collider extends ParticlesInteractorBase { +export class Collider extends ParticlesInteractorBase { // eslint-disable-next-line @typescript-eslint/no-useless-constructor constructor(container: Container) { super(container); @@ -19,7 +27,7 @@ export class Collider extends ParticlesInteractorBase { // do nothing } - interact(p1: Particle, delta: IDelta): void { + interact(p1: CollisionParticle, delta: IDelta): void { if (p1.destroyed || p1.spawning) { return; } @@ -27,11 +35,13 @@ export class Collider extends ParticlesInteractorBase { const container = this.container, pos1 = p1.getPosition(), radius1 = p1.getRadius(), - query = container.particles.quadTree.queryCircle(pos1, radius1 * double); + query = container.particles.quadTree.queryCircle(pos1, radius1 * double) as CollisionParticle[]; for (const p2 of query) { if ( p1 === p2 || + !p1.options.collisions || + !p2.options.collisions || !p2.options.collisions.enable || p1.options.collisions.mode !== p2.options.collisions.mode || p2.destroyed || @@ -58,8 +68,19 @@ export class Collider extends ParticlesInteractorBase { } } - isEnabled(particle: Particle): boolean { - return particle.options.collisions.enable; + isEnabled(particle: CollisionParticle): boolean { + return !!particle.options.collisions?.enable; + } + + loadParticlesOptions( + options: ParticlesCollisionOptions, + ...sources: (RecursivePartial | undefined)[] + ): void { + options.collisions ??= new Collisions(); + + for (const source of sources) { + options.collisions.load(source?.collisions); + } } reset(): void { diff --git a/engine/src/Enums/Modes/CollisionMode.ts b/interactions/particles/collisions/src/CollisionMode.ts similarity index 100% rename from engine/src/Enums/Modes/CollisionMode.ts rename to interactions/particles/collisions/src/CollisionMode.ts diff --git a/interactions/particles/collisions/src/Destroy.ts b/interactions/particles/collisions/src/Destroy.ts index 7756215bd86..ec727e1c00f 100644 --- a/interactions/particles/collisions/src/Destroy.ts +++ b/interactions/particles/collisions/src/Destroy.ts @@ -10,11 +10,14 @@ export function destroy(p1: Particle, p2: Particle): void { bounce(p1, p2); } - if (p1.getRadius() === undefined && p2.getRadius() !== undefined) { + const p1Radius = p1.getRadius(), + p2Radius = p2.getRadius(); + + if (!p1Radius && p2Radius) { p1.destroy(); - } else if (p1.getRadius() !== undefined && p2.getRadius() === undefined) { + } else if (p1Radius && !p2Radius) { p2.destroy(); - } else if (p1.getRadius() !== undefined && p2.getRadius() !== undefined) { + } else if (p1Radius && p2Radius) { const deleteP = p1.getRadius() >= p2.getRadius() ? p2 : p1; deleteP.destroy(); diff --git a/engine/src/Options/Classes/Particles/Collisions/Collisions.ts b/interactions/particles/collisions/src/Options/Classes/Collisions.ts similarity index 67% rename from engine/src/Options/Classes/Particles/Collisions/Collisions.ts rename to interactions/particles/collisions/src/Options/Classes/Collisions.ts index c58e703be5b..fadc1d3c861 100644 --- a/engine/src/Options/Classes/Particles/Collisions/Collisions.ts +++ b/interactions/particles/collisions/src/Options/Classes/Collisions.ts @@ -1,13 +1,15 @@ -import { CollisionMode } from "../../../../Enums/Modes/CollisionMode.js"; +import { + type IOptionLoader, + ParticlesBounce, + type RangeValue, + type RecursivePartial, + isNull, + setRangeValue, +} from "@tsparticles/engine"; +import { CollisionMode } from "../../CollisionMode.js"; import { CollisionsAbsorb } from "./CollisionsAbsorb.js"; import { CollisionsOverlap } from "./CollisionsOverlap.js"; -import type { ICollisions } from "../../../Interfaces/Particles/Collisions/ICollisions.js"; -import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; -import { ParticlesBounce } from "../Bounce/ParticlesBounce.js"; -import type { RangeValue } from "../../../../Types/RangeValue.js"; -import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; -import { isNull } from "../../../../Utils/TypeUtils.js"; -import { setRangeValue } from "../../../../Utils/NumberUtils.js"; +import type { ICollisions } from "../Interfaces/ICollisions.js"; /** * [[include:Collisions.md]] diff --git a/engine/src/Options/Classes/Particles/Collisions/CollisionsAbsorb.ts b/interactions/particles/collisions/src/Options/Classes/CollisionsAbsorb.ts similarity index 54% rename from engine/src/Options/Classes/Particles/Collisions/CollisionsAbsorb.ts rename to interactions/particles/collisions/src/Options/Classes/CollisionsAbsorb.ts index 1818ab50c9c..3099cb52157 100644 --- a/engine/src/Options/Classes/Particles/Collisions/CollisionsAbsorb.ts +++ b/interactions/particles/collisions/src/Options/Classes/CollisionsAbsorb.ts @@ -1,7 +1,5 @@ -import type { ICollisionsAbsorb } from "../../../Interfaces/Particles/Collisions/ICollisionsAbsorb.js"; -import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; -import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; -import { isNull } from "../../../../Utils/TypeUtils.js"; +import { type IOptionLoader, type RecursivePartial, isNull } from "@tsparticles/engine"; +import type { ICollisionsAbsorb } from "../Interfaces/ICollisionsAbsorb.js"; export class CollisionsAbsorb implements ICollisionsAbsorb, IOptionLoader { speed; diff --git a/engine/src/Options/Classes/Particles/Collisions/CollisionsOverlap.ts b/interactions/particles/collisions/src/Options/Classes/CollisionsOverlap.ts similarity index 62% rename from engine/src/Options/Classes/Particles/Collisions/CollisionsOverlap.ts rename to interactions/particles/collisions/src/Options/Classes/CollisionsOverlap.ts index 8c398ef9809..9c6a7588774 100644 --- a/engine/src/Options/Classes/Particles/Collisions/CollisionsOverlap.ts +++ b/interactions/particles/collisions/src/Options/Classes/CollisionsOverlap.ts @@ -1,7 +1,5 @@ -import type { ICollisionsOverlap } from "../../../Interfaces/Particles/Collisions/ICollisionsOverlap.js"; -import type { IOptionLoader } from "../../../Interfaces/IOptionLoader.js"; -import type { RecursivePartial } from "../../../../Types/RecursivePartial.js"; -import { isNull } from "../../../../Utils/TypeUtils.js"; +import { type IOptionLoader, type RecursivePartial, isNull } from "@tsparticles/engine"; +import type { ICollisionsOverlap } from "../Interfaces/ICollisionsOverlap.js"; export class CollisionsOverlap implements ICollisionsOverlap, IOptionLoader { enable: boolean; diff --git a/engine/src/Options/Interfaces/Particles/Collisions/ICollisions.ts b/interactions/particles/collisions/src/Options/Interfaces/ICollisions.ts similarity index 64% rename from engine/src/Options/Interfaces/Particles/Collisions/ICollisions.ts rename to interactions/particles/collisions/src/Options/Interfaces/ICollisions.ts index b9ee4a6bc74..3173b332664 100644 --- a/engine/src/Options/Interfaces/Particles/Collisions/ICollisions.ts +++ b/interactions/particles/collisions/src/Options/Interfaces/ICollisions.ts @@ -1,8 +1,7 @@ -import type { CollisionMode } from "../../../../Enums/Modes/CollisionMode.js"; +import type { IParticlesBounce, RangeValue } from "@tsparticles/engine"; +import type { CollisionMode } from "../../CollisionMode.js"; import type { ICollisionsAbsorb } from "./ICollisionsAbsorb.js"; import type { ICollisionsOverlap } from "./ICollisionsOverlap.js"; -import type { IParticlesBounce } from "../Bounce/IParticlesBounce.js"; -import type { RangeValue } from "../../../../Types/RangeValue.js"; /** diff --git a/engine/src/Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.ts b/interactions/particles/collisions/src/Options/Interfaces/ICollisionsAbsorb.ts similarity index 100% rename from engine/src/Options/Interfaces/Particles/Collisions/ICollisionsAbsorb.ts rename to interactions/particles/collisions/src/Options/Interfaces/ICollisionsAbsorb.ts diff --git a/engine/src/Options/Interfaces/Particles/Collisions/ICollisionsOverlap.ts b/interactions/particles/collisions/src/Options/Interfaces/ICollisionsOverlap.ts similarity index 100% rename from engine/src/Options/Interfaces/Particles/Collisions/ICollisionsOverlap.ts rename to interactions/particles/collisions/src/Options/Interfaces/ICollisionsOverlap.ts diff --git a/interactions/particles/collisions/src/OverlapPlugin.ts b/interactions/particles/collisions/src/OverlapPlugin.ts new file mode 100644 index 00000000000..5c6feac9eff --- /dev/null +++ b/interactions/particles/collisions/src/OverlapPlugin.ts @@ -0,0 +1,18 @@ +import { type Container, type IContainerPlugin, type IPlugin } from "@tsparticles/engine"; +import { OverlapPluginInstance } from "./OverlapPluginInstance.js"; + +export class OverlapPlugin implements IPlugin { + id = "overlap"; + + getPlugin(container: Container): Promise { + return Promise.resolve(new OverlapPluginInstance(container)); + } + + loadOptions(): void { + // no-op + } + + needsPlugin(): boolean { + return true; + } +} diff --git a/interactions/particles/collisions/src/OverlapPluginInstance.ts b/interactions/particles/collisions/src/OverlapPluginInstance.ts new file mode 100644 index 00000000000..a8d0a572855 --- /dev/null +++ b/interactions/particles/collisions/src/OverlapPluginInstance.ts @@ -0,0 +1,40 @@ +import { type Container, type IContainerPlugin, type ICoordinates, getDistance } from "@tsparticles/engine"; +import type { CollisionParticle } from "./Types.js"; + +const minRetries = 0; + +export class OverlapPluginInstance implements IContainerPlugin { + private readonly _container: Container; + + constructor(container: Container) { + this._container = container; + } + + checkParticlePosition(particle: CollisionParticle, position: ICoordinates, tryCount: number): boolean { + return this._checkOverlap(particle, position, tryCount); + } + + private readonly _checkOverlap: (particle: CollisionParticle, position: ICoordinates, tryCount: number) => boolean = + (particle, pos, tryCount) => { + const collisionsOptions = particle.options.collisions, + radius = particle.getRadius(); + + if (!collisionsOptions?.enable) { + return false; + } + + const overlapOptions = collisionsOptions.overlap; + + if (overlapOptions.enable) { + return false; + } + + const retries = overlapOptions.retries; + + if (retries >= minRetries && tryCount > retries) { + throw new Error(`Particle is overlapping and can't be placed`); + } + + return !!this._container.particles.find(p => getDistance(pos, p.position) < radius + p.getRadius()); + }; +} diff --git a/interactions/particles/collisions/src/ResolveCollision.ts b/interactions/particles/collisions/src/ResolveCollision.ts index 9399a37300f..4049596d27e 100644 --- a/interactions/particles/collisions/src/ResolveCollision.ts +++ b/interactions/particles/collisions/src/ResolveCollision.ts @@ -1,4 +1,6 @@ -import { CollisionMode, type IDelta, type Particle } from "@tsparticles/engine"; +import { CollisionMode } from "./CollisionMode.js"; +import { type CollisionParticle } from "./Types.js"; +import { type IDelta } from "@tsparticles/engine"; import { absorb } from "./Absorb.js"; import { bounce } from "./Bounce.js"; import { destroy } from "./Destroy.js"; @@ -9,7 +11,16 @@ import { destroy } from "./Destroy.js"; * @param delta - * @param pixelRatio - */ -export function resolveCollision(p1: Particle, p2: Particle, delta: IDelta, pixelRatio: number): void { +export function resolveCollision( + p1: CollisionParticle, + p2: CollisionParticle, + delta: IDelta, + pixelRatio: number, +): void { + if (!p1.options.collisions || !p2.options.collisions) { + return; + } + switch (p1.options.collisions.mode) { case CollisionMode.absorb: { absorb(p1, p2, delta, pixelRatio); diff --git a/interactions/particles/collisions/src/Types.ts b/interactions/particles/collisions/src/Types.ts new file mode 100644 index 00000000000..14318163bd0 --- /dev/null +++ b/interactions/particles/collisions/src/Types.ts @@ -0,0 +1,15 @@ +import type { IParticlesOptions, Particle, ParticlesOptions } from "@tsparticles/engine"; +import type { Collisions } from "./Options/Classes/Collisions.js"; +import type { ICollisions } from "./Options/Interfaces/ICollisions.js"; + +export type CollisionParticle = Particle & { + options: ParticlesCollisionOptions; +}; + +export type IParticlesCollisionOptions = IParticlesOptions & { + collisions?: ICollisions; +}; + +export type ParticlesCollisionOptions = ParticlesOptions & { + collisions?: Collisions; +}; diff --git a/interactions/particles/collisions/src/index.ts b/interactions/particles/collisions/src/index.ts index 28d6577ee9d..84c8d381eff 100644 --- a/interactions/particles/collisions/src/index.ts +++ b/interactions/particles/collisions/src/index.ts @@ -1,20 +1,21 @@ -import { Collider } from "./Collider.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - The engine to use for the interaction - * @param refresh - */ -export async function loadParticlesCollisionsInteraction(engine: Engine, refresh = true): Promise { +export function loadParticlesCollisionsInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "particlesCollisions", - container => { - return Promise.resolve(new Collider(container)); - }, - refresh, - ); + engine.register(async e => { + const { OverlapPlugin } = await import("./OverlapPlugin.js"); + + e.addPlugin(new OverlapPlugin()); + e.addInteractor("particlesCollisions", async container => { + const { Collider } = await import("./Collider.js"); + + return new Collider(container); + }); + }); } diff --git a/interactions/particles/collisions/webpack.config.js b/interactions/particles/collisions/webpack.config.js index 0826d9dc2c4..e3a6ff43d73 100644 --- a/interactions/particles/collisions/webpack.config.js +++ b/interactions/particles/collisions/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionParticles } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionParticles } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionParticles({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionParticles({ moduleName: "collisions", pluginName: "Collisions", version, diff --git a/interactions/particles/links/.eslintignore b/interactions/particles/links/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/particles/links/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/particles/links/.eslintrc.js b/interactions/particles/links/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/particles/links/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/particles/links/CHANGELOG.md b/interactions/particles/links/CHANGELOG.md index 2e45b136876..8cf96a9a60d 100644 --- a/interactions/particles/links/CHANGELOG.md +++ b/interactions/particles/links/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-particles-links diff --git a/interactions/particles/links/eslint.config.js b/interactions/particles/links/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/particles/links/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/particles/links/package.dist.json b/interactions/particles/links/package.dist.json index 21d3be24661..dd4f2b52ac6 100644 --- a/interactions/particles/links/package.dist.json +++ b/interactions/particles/links/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-particles-links", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles links particles interaction", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/particles/links/package.json b/interactions/particles/links/package.json index b6e159ee96d..c30133cdbf3 100644 --- a/interactions/particles/links/package.json +++ b/interactions/particles/links/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/interaction-particles-links", - "version": "3.9.1", - "description": "tsParticles links particles interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-particles-links", + "version": "4.0.0-alpha.0", + "description": "tsParticles links particles interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/particles/links" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/particles/links" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/particles/links/src/CircleWarp.ts b/interactions/particles/links/src/CircleWarp.ts index 71c3e66a347..7bdab59bec5 100644 --- a/interactions/particles/links/src/CircleWarp.ts +++ b/interactions/particles/links/src/CircleWarp.ts @@ -28,7 +28,7 @@ export class CircleWarp extends Circle { * @param point - the point to check * @returns true or false, checking if the given point is inside the circle */ - contains(point: ICoordinates): boolean { + override contains(point: ICoordinates): boolean { const { width, height } = this.canvasSize, { x, y } = point; @@ -45,7 +45,7 @@ export class CircleWarp extends Circle { * @param range - the range to check * @returns true or false, checking if the range is intersecting with the circle */ - intersects(range: BaseRange): boolean { + override intersects(range: BaseRange): boolean { if (super.intersects(range)) { return true; } @@ -57,11 +57,11 @@ export class CircleWarp extends Circle { y: range.position.y - this.canvasSize.height, }; - if (circle.radius !== undefined) { + if (Object.hasOwn(circle, "radius")) { const biggerCircle = new Circle(newPos.x, newPos.y, circle.radius * double); return super.intersects(biggerCircle); - } else if (rect.size !== undefined) { + } else if (Object.hasOwn(rect, "size")) { const rectSW = new Rectangle(newPos.x, newPos.y, rect.size.width * double, rect.size.height * double); return super.intersects(rectSW); diff --git a/interactions/particles/links/src/LinkInstance.ts b/interactions/particles/links/src/LinkInstance.ts index e4520261522..e90d3324740 100644 --- a/interactions/particles/links/src/LinkInstance.ts +++ b/interactions/particles/links/src/LinkInstance.ts @@ -32,7 +32,7 @@ export class LinkInstance implements IContainerPlugin { }; } - drawParticle(context: CanvasRenderingContext2D, particle: LinkParticle): void { + drawParticle(_context: CanvasRenderingContext2D, particle: LinkParticle): void { const { links, options } = particle; if (!links?.length) { @@ -89,7 +89,6 @@ export class LinkInstance implements IContainerPlugin { } const container = this._container, - options = container.actualOptions, p2 = link.destination, pos1 = p1.getPosition(), pos2 = p2.getPosition(); @@ -107,7 +106,7 @@ export class LinkInstance implements IContainerPlugin { * mid: in consent mode: sample particles color and get a mid level color * from those two for the connecting line color */ - const twinkle = (p1.options.twinkle as ITwinkle)?.lines; + const twinkle = (p1.options["twinkle"] as ITwinkle | undefined)?.lines; if (twinkle?.enable) { const twinkleFreq = twinkle.frequency, @@ -134,8 +133,7 @@ export class LinkInstance implements IContainerPlugin { } const width = p1.retina.linksWidth ?? minWidth, - maxDistance = p1.retina.linksDistance ?? minDistance, - { backgroundMask } = options; + maxDistance = p1.retina.linksDistance ?? minDistance; drawLinkLine({ context: ctx, @@ -146,9 +144,9 @@ export class LinkInstance implements IContainerPlugin { maxDistance, canvasSize: container.canvas.size, links: p1LinksOptions, - backgroundMask: backgroundMask, colorLine, opacity, + hdr: container.hdr, }); }); }; @@ -167,7 +165,6 @@ export class LinkInstance implements IContainerPlugin { } const container = this._container, - options = container.actualOptions, p2 = link1.destination, p3 = link2.destination, opacityTriangle = triangleOptions.opacity ?? (link1.opacity + link2.opacity) * half; @@ -210,9 +207,9 @@ export class LinkInstance implements IContainerPlugin { pos1, pos2, pos3, - backgroundMask: options.backgroundMask, colorTriangle, opacityTriangle, + hdr: container.hdr, }); }); }; diff --git a/interactions/particles/links/src/Linker.ts b/interactions/particles/links/src/Linker.ts index b5ee0714faf..e001dc834d3 100644 --- a/interactions/particles/links/src/Linker.ts +++ b/interactions/particles/links/src/Linker.ts @@ -54,14 +54,12 @@ function getLinkDistance( return Math.sqrt(warpDistances.x ** squarePower + warpDistances.y ** squarePower); } -export class Linker extends ParticlesInteractorBase { +export class Linker extends ParticlesInteractorBase { private readonly _engine; - private readonly _linkContainer: LinkContainer; constructor(container: LinkContainer, engine: Engine) { super(container); - this._linkContainer = container; this._engine = engine; } @@ -70,8 +68,8 @@ export class Linker extends ParticlesInteractorBase { } init(): void { - this._linkContainer.particles.linksColor = undefined; - this._linkContainer.particles.linksColors = new Map(); + this.container.particles.linksColor = undefined; + this.container.particles.linksColors = new Map(); } interact(p1: LinkParticle): void { @@ -152,9 +150,7 @@ export class Linker extends ParticlesInteractorBase { options: ParticlesLinkOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.links) { - options.links = new Links(); - } + options.links ??= new Links(); for (const source of sources) { options.links.load(source?.links); @@ -170,7 +166,7 @@ export class Linker extends ParticlesInteractorBase { return; } - const container = this._linkContainer, + const container = this.container, linksOptions = p1.options.links; let linkColor = diff --git a/interactions/particles/links/src/Types.ts b/interactions/particles/links/src/Types.ts index 58f118bddf2..5c84e08ce25 100644 --- a/interactions/particles/links/src/Types.ts +++ b/interactions/particles/links/src/Types.ts @@ -1,5 +1,4 @@ import type { - BackgroundMask, Container, Engine, ICoordinates, @@ -30,13 +29,13 @@ export type LinkParticle = Particle & { }; export interface LinkLineDrawParams { - backgroundMask: BackgroundMask; begin: ICoordinates; canvasSize: IDimension; colorLine: IRgb; context: CanvasRenderingContext2D; end: ICoordinates; engine: Engine; + hdr: boolean; links: Links; maxDistance: number; opacity: number; @@ -44,9 +43,9 @@ export interface LinkLineDrawParams { } export interface LinkTriangleDrawParams { - backgroundMask: BackgroundMask; colorTriangle: IRgb; context: CanvasRenderingContext2D; + hdr: boolean; opacityTriangle: number; pos1: ICoordinates; pos2: ICoordinates; diff --git a/interactions/particles/links/src/Utils.ts b/interactions/particles/links/src/Utils.ts index 44a244a7c90..0427d975985 100644 --- a/interactions/particles/links/src/Utils.ts +++ b/interactions/particles/links/src/Utils.ts @@ -38,8 +38,7 @@ export function drawLinkLine(params: LinkLineDrawParams): void { let drawn = false; - const { begin, end, engine, maxDistance, context, canvasSize, width, backgroundMask, colorLine, opacity, links } = - params; + const { begin, end, engine, maxDistance, context, canvasSize, width, colorLine, opacity, links, hdr } = params; if (getDistance(begin, end) <= maxDistance) { drawLine(context, begin, end); @@ -106,12 +105,7 @@ export function drawLinkLine(params: LinkLineDrawParams): void { } context.lineWidth = width; - - if (backgroundMask.enable) { - context.globalCompositeOperation = backgroundMask.composite; - } - - context.strokeStyle = getStyleFromRgb(colorLine, opacity); + context.strokeStyle = getStyleFromRgb(colorLine, hdr, opacity); const { shadow } = links; @@ -120,7 +114,7 @@ export function drawLinkLine(params: LinkLineDrawParams): void { if (shadowColor) { context.shadowBlur = shadow.blur; - context.shadowColor = getStyleFromRgb(shadowColor); + context.shadowColor = getStyleFromRgb(shadowColor, hdr); } } @@ -131,18 +125,14 @@ export function drawLinkLine(params: LinkLineDrawParams): void { * @param params - */ export function drawLinkTriangle(params: LinkTriangleDrawParams): void { - const { context, pos1, pos2, pos3, backgroundMask, colorTriangle, opacityTriangle } = params; + const { context, hdr, pos1, pos2, pos3, colorTriangle, opacityTriangle } = params; // this.ctx.lineCap = "round"; /* performance issue */ /* path */ drawTriangle(context, pos1, pos2, pos3); - if (backgroundMask.enable) { - context.globalCompositeOperation = backgroundMask.composite; - } - - context.fillStyle = getStyleFromRgb(colorTriangle, opacityTriangle); + context.fillStyle = getStyleFromRgb(colorTriangle, hdr, opacityTriangle); context.fill(); } diff --git a/interactions/particles/links/src/index.ts b/interactions/particles/links/src/index.ts index 3d3d70de27e..26d386313aa 100644 --- a/interactions/particles/links/src/index.ts +++ b/interactions/particles/links/src/index.ts @@ -1,23 +1,25 @@ import { type Engine } from "@tsparticles/engine"; -import { loadLinksInteraction } from "./interaction.js"; -import { loadLinksPlugin } from "./plugin.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadParticlesLinksInteraction(engine: Engine, refresh = true): Promise { +export function loadParticlesLinksInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await loadLinksInteraction(engine, refresh); - await loadLinksPlugin(engine, refresh); + engine.register(async e => { + const { loadLinksInteraction } = await import("./interaction.js"), + { loadLinksPlugin } = await import("./plugin.js"); + + loadLinksInteraction(e); + loadLinksPlugin(e); + }); } export * from "./Options/Classes/Links.js"; export * from "./Options/Classes/LinksShadow.js"; export * from "./Options/Classes/LinksTriangle.js"; -export * from "./Options/Interfaces/ILinks.js"; -export * from "./Options/Interfaces/ILinksShadow.js"; -export * from "./Options/Interfaces/ILinksTriangle.js"; +export type * from "./Options/Interfaces/ILinks.js"; +export type * from "./Options/Interfaces/ILinksShadow.js"; +export type * from "./Options/Interfaces/ILinksTriangle.js"; diff --git a/interactions/particles/links/src/interaction.ts b/interactions/particles/links/src/interaction.ts index f3623c82bf4..a398783b607 100644 --- a/interactions/particles/links/src/interaction.ts +++ b/interactions/particles/links/src/interaction.ts @@ -1,17 +1,15 @@ import type { Engine } from "@tsparticles/engine"; import type { LinkContainer } from "./Types.js"; -import { Linker } from "./Linker.js"; /** * @param engine - - * @param refresh - */ -export async function loadLinksInteraction(engine: Engine, refresh = true): Promise { - await engine.addInteractor( - "particlesLinks", - async container => { - return Promise.resolve(new Linker(container as LinkContainer, engine)); - }, - refresh, - ); +export function loadLinksInteraction(engine: Engine): void { + engine.register(e => { + e.addInteractor("particlesLinks", async container => { + const { Linker } = await import("./Linker.js"); + + return new Linker(container as LinkContainer, engine); + }); + }); } diff --git a/interactions/particles/links/src/plugin.ts b/interactions/particles/links/src/plugin.ts index d63723110b3..6c35c53e3c3 100644 --- a/interactions/particles/links/src/plugin.ts +++ b/interactions/particles/links/src/plugin.ts @@ -1,12 +1,12 @@ import type { Engine } from "@tsparticles/engine"; -import { LinksPlugin } from "./LinksPlugin.js"; /** * @param engine - - * @param refresh - */ -export async function loadLinksPlugin(engine: Engine, refresh = true): Promise { - const plugin = new LinksPlugin(engine); +export function loadLinksPlugin(engine: Engine): void { + engine.register(async e => { + const { LinksPlugin } = await import("./LinksPlugin.js"); - await engine.addPlugin(plugin, refresh); + e.addPlugin(new LinksPlugin(e)); + }); } diff --git a/interactions/particles/links/webpack.config.js b/interactions/particles/links/webpack.config.js index 1432ff6a044..00f9d19fe56 100644 --- a/interactions/particles/links/webpack.config.js +++ b/interactions/particles/links/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionParticles } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionParticles } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionParticles({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionParticles({ moduleName: "links", pluginName: "Links", version, diff --git a/interactions/particles/repulse/.eslintignore b/interactions/particles/repulse/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/interactions/particles/repulse/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/interactions/particles/repulse/.eslintrc.js b/interactions/particles/repulse/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/interactions/particles/repulse/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/interactions/particles/repulse/CHANGELOG.md b/interactions/particles/repulse/CHANGELOG.md index 3b67a52878f..b9960b88263 100644 --- a/interactions/particles/repulse/CHANGELOG.md +++ b/interactions/particles/repulse/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/interaction-particles-repulse + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/interaction-particles-repulse diff --git a/interactions/particles/repulse/eslint.config.js b/interactions/particles/repulse/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/interactions/particles/repulse/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/interactions/particles/repulse/package.dist.json b/interactions/particles/repulse/package.dist.json index 231ed8569b0..d90053b190b 100644 --- a/interactions/particles/repulse/package.dist.json +++ b/interactions/particles/repulse/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/interaction-particles-repulse", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles repulse particles interaction", "homepage": "https://particles.js.org", "repository": { @@ -101,9 +101,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/interactions/particles/repulse/package.json b/interactions/particles/repulse/package.json index 639a2ed0710..0273b6ee23a 100644 --- a/interactions/particles/repulse/package.json +++ b/interactions/particles/repulse/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/interaction-particles-repulse", - "version": "3.9.1", - "description": "tsParticles repulse particles interaction", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/interaction-particles-repulse", + "version": "4.0.0-alpha.0", + "description": "tsParticles repulse particles interaction", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "interactions/particles/repulse" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/interaction" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "interactions/particles/repulse" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/interaction" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/interactions/particles/repulse/src/Options/Classes/ParticlesRepulse.ts b/interactions/particles/repulse/src/Options/Classes/ParticlesRepulse.ts index 2184a3a3738..c10b1792245 100644 --- a/interactions/particles/repulse/src/Options/Classes/ParticlesRepulse.ts +++ b/interactions/particles/repulse/src/Options/Classes/ParticlesRepulse.ts @@ -26,7 +26,7 @@ export class ParticlesRepulse extends ValueWithRandom implements IParticlesRepul this.speed = 1; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/interactions/particles/repulse/src/Repulser.ts b/interactions/particles/repulse/src/Repulser.ts index b62150822a5..7dbe8e7f30b 100644 --- a/interactions/particles/repulse/src/Repulser.ts +++ b/interactions/particles/repulse/src/Repulser.ts @@ -95,9 +95,7 @@ export class Repulser extends ParticlesInteractorBase { options: RepulseParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.repulse) { - options.repulse = new ParticlesRepulse(); - } + options.repulse ??= new ParticlesRepulse(); for (const source of sources) { options.repulse.load(source?.repulse); diff --git a/interactions/particles/repulse/src/index.ts b/interactions/particles/repulse/src/index.ts index f6f5b9ca3ed..64aa52a4138 100644 --- a/interactions/particles/repulse/src/index.ts +++ b/interactions/particles/repulse/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { Repulser } from "./Repulser.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadParticlesRepulseInteraction(engine: Engine, refresh = true): Promise { +export function loadParticlesRepulseInteraction(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addInteractor( - "particlesRepulse", - container => { - return Promise.resolve(new Repulser(container)); - }, - refresh, - ); + engine.register(e => { + e.addInteractor("particlesRepulse", async container => { + const { Repulser } = await import("./Repulser.js"); + + return new Repulser(container); + }); + }); } diff --git a/interactions/particles/repulse/webpack.config.js b/interactions/particles/repulse/webpack.config.js index d13f3fc6519..d1ae98219a8 100644 --- a/interactions/particles/repulse/webpack.config.js +++ b/interactions/particles/repulse/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesInteractionParticles } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesInteractionParticles } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesInteractionParticles({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesInteractionParticles({ moduleName: "repulse", pluginName: "Repulse", version, diff --git a/lerna.json b/lerna.json index e46ab4cd066..5997504b27f 100644 --- a/lerna.json +++ b/lerna.json @@ -1,5 +1,5 @@ { - "version": "3.9.1", + "version": "4.0.0-alpha.0", "npmClient": "pnpm", "conventionalCommits": true, "command": { diff --git a/move/base/.eslintignore b/move/base/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/move/base/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/move/base/.eslintrc.js b/move/base/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/move/base/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/move/base/CHANGELOG.md b/move/base/CHANGELOG.md index b8bfe2be725..043045146ab 100644 --- a/move/base/CHANGELOG.md +++ b/move/base/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/move-base + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/move-base diff --git a/move/base/eslint.config.js b/move/base/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/move/base/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/move/base/package.dist.json b/move/base/package.dist.json index 55d3f1fad9d..fb558f9b4de 100644 --- a/move/base/package.dist.json +++ b/move/base/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/move-base", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles Base movement", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/move/base/package.json b/move/base/package.json index 3b26db75603..9576c0b2d7a 100644 --- a/move/base/package.json +++ b/move/base/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/move-base", - "version": "3.9.1", - "description": "tsParticles Base movement", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/move-base", + "version": "4.0.0-alpha.0", + "description": "tsParticles Base movement", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "move/base" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/move" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "move/base" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/move" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/move/base/src/index.ts b/move/base/src/index.ts index 17c4da9a78f..740745148df 100644 --- a/move/base/src/index.ts +++ b/move/base/src/index.ts @@ -1,20 +1,18 @@ -import { BaseMover } from "./BaseMover.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadBaseMover(engine: Engine, refresh = true): Promise { +export function loadBaseMover(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addMover( - "base", - () => { - return Promise.resolve(new BaseMover()); - }, - refresh, - ); + engine.register(e => { + e.addMover("base", async () => { + const { BaseMover } = await import("./BaseMover.js"); + + return new BaseMover(); + }); + }); } diff --git a/move/base/webpack.config.js b/move/base/webpack.config.js index 649f0f482bd..5d4a1e38908 100644 --- a/move/base/webpack.config.js +++ b/move/base/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesMove } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesMove } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesMove({ moduleName: "base", pluginName: "Base", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesMove({ moduleName: "base", pluginName: "Base", version, dir: __dirname }); diff --git a/move/parallax/.eslintignore b/move/parallax/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/move/parallax/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/move/parallax/.eslintrc.js b/move/parallax/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/move/parallax/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/move/parallax/CHANGELOG.md b/move/parallax/CHANGELOG.md index 1c24a8d5684..ff0129d9402 100644 --- a/move/parallax/CHANGELOG.md +++ b/move/parallax/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/move-parallax + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/move-parallax diff --git a/move/parallax/eslint.config.js b/move/parallax/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/move/parallax/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/move/parallax/package.dist.json b/move/parallax/package.dist.json index 16a3eba0b27..330087476c5 100644 --- a/move/parallax/package.dist.json +++ b/move/parallax/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/move-parallax", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles Parallax movement", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/move/parallax/package.json b/move/parallax/package.json index 570d90782c8..b5a7dd21acf 100644 --- a/move/parallax/package.json +++ b/move/parallax/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/move-parallax", - "version": "3.9.1", - "description": "tsParticles Parallax movement", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/move-parallax", + "version": "4.0.0-alpha.0", + "description": "tsParticles Parallax movement", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "move/parallax" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "move/parallax" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/move/parallax/src/ParallaxMover.ts b/move/parallax/src/ParallaxMover.ts index 13acbb009b9..74c073cbfa8 100644 --- a/move/parallax/src/ParallaxMover.ts +++ b/move/parallax/src/ParallaxMover.ts @@ -1,4 +1,4 @@ -import { type IParticleMover, type Particle, isSsr } from "@tsparticles/engine"; +import { type IParticleMover, type Particle } from "@tsparticles/engine"; const half = 0.5; @@ -16,11 +16,7 @@ export class ParallaxMover implements IParticleMover { * @returns check if mover is enabled */ isEnabled(particle: Particle): boolean { - return ( - !isSsr() && - !particle.destroyed && - particle.container.actualOptions.interactivity.events.onHover.parallax.enable - ); + return !particle.destroyed && particle.container.actualOptions.interactivity.events.onHover.parallax.enable; } /** @@ -31,7 +27,7 @@ export class ParallaxMover implements IParticleMover { options = container.actualOptions, parallaxOptions = options.interactivity.events.onHover.parallax; - if (isSsr() || !parallaxOptions.enable) { + if (!parallaxOptions.enable) { return; } diff --git a/move/parallax/src/index.ts b/move/parallax/src/index.ts index 0e30825f4fe..3f79388d91f 100644 --- a/move/parallax/src/index.ts +++ b/move/parallax/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { ParallaxMover } from "./ParallaxMover.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadParallaxMover(engine: Engine, refresh = true): Promise { +export function loadParallaxMover(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addMover( - "parallax", - () => { - return Promise.resolve(new ParallaxMover()); - }, - refresh, - ); + engine.register(e => { + e.addMover("parallax", async () => { + const { ParallaxMover } = await import("./ParallaxMover.js"); + + return new ParallaxMover(); + }); + }); } diff --git a/move/parallax/webpack.config.js b/move/parallax/webpack.config.js index b5a03e92da2..4958afb53e7 100644 --- a/move/parallax/webpack.config.js +++ b/move/parallax/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesMove } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesMove } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesMove({ moduleName: "parallax", pluginName: "Parallax", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesMove({ moduleName: "parallax", pluginName: "Parallax", version, dir: __dirname }); diff --git a/package.json b/package.json index a5c1f306467..d9e187e2af8 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "build:docs:json": "rimraf docs.json && typedoc --json docs.json", "prettify:ci:readme": "prettier --check ./README.md && prettier --check ./markdown/*", "prettify:readme": "prettier --write ./README.md && prettier --write ./markdown/*", - "version:alpha": "lerna version prerelease --preid alpha --conventional-commits", + "version:alpha": "lerna version premajor --preid alpha --conventional-commits", "version:beta": "lerna version prerelease --preid beta --conventional-commits", "publish:alpha": "lerna publish from-package --pre-dist-tag alpha --preid alpha", "publish:beta": "lerna publish from-package --pre-dist-tag beta --preid beta", @@ -25,61 +25,61 @@ }, "prettier": "@tsparticles/prettier-config", "devDependencies": { - "@babel/core": "^7.28.0", - "@commitlint/cli": "^19.8.1", - "@commitlint/config-conventional": "^19.8.1", - "@nx/workspace": "^19.8.4", - "@tsparticles/cli": "^2.3.3", - "@tsparticles/eslint-config": "^2.3.0", - "@tsparticles/prettier-config": "^2.1.6", - "@tsparticles/tsconfig": "^2.3.0", - "@tsparticles/webpack-plugin": "^2.3.0", - "@types/jsdom": "^21.1.7", - "@types/node": "^24.1.0", + "@babel/core": "^7.28.5", + "@commitlint/cli": "^20.2.0", + "@commitlint/config-conventional": "^20.2.0", + "@nx/workspace": "^22.3.3", + "@tsparticles/cli": "^3.0.14", + "@tsparticles/eslint-config": "^3.0.9", + "@tsparticles/prettier-config": "^3.0.7", + "@tsparticles/tsconfig": "^3.0.9", + "@tsparticles/webpack-plugin": "^3.0.9", + "@types/jsdom": "^27.0.0", + "@types/node": "^25.0.3", "@types/webpack-env": "^1.18.8", - "@typescript-eslint/eslint-plugin": "^7.18.0", - "@typescript-eslint/parser": "^7.18.0", - "@vitest/ui": "^3.2.4", - "@vitest/coverage-v8": "^3.2.4", + "@vitest/coverage-v8": "^4.0.16", + "@vitest/ui": "^4.0.16", "babel-loader": "^10.0.0", - "browserslist": "^4.25.1", - "canvas": "^3.1.2", + "browserslist": "^4.28.1", + "canvas": "^3.2.0", "copyfiles": "^2.4.1", - "cross-env": "^10.0.0", - "eslint": "^8.57.1", - "eslint-config-prettier": "^10.1.2", - "eslint-plugin-jsdoc": "^50.6.11", - "eslint-plugin-prettier": "^5.4.0", - "eslint-plugin-tsdoc": "^0.4.0", + "cross-env": "^10.1.0", + "eslint": "^9.39.2", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-jsdoc": "^61.5.0", + "eslint-plugin-prettier": "^5.5.4", + "eslint-plugin-tsdoc": "^0.5.0", + "fs-extra": "^11.3.3", "gh-pages": "^6.3.0", "husky": "^9.1.7", - "jsdom": "^26.1.0", + "jsdom": "^27.4.0", "jsdom-global": "^3.0.2", - "lerna": "^8.2.3", + "lerna": "^9.0.3", "madge": "^8.0.0", - "nx": "19.8.14", + "nx": "^22.3.3", "nx-cloud": "^19.1.0", - "prettier": "^3.6.2", - "prettier-plugin-multiline-arrays": "^4.0.3", - "rimraf": "^6.0.1", + "prettier": "^3.7.4", + "prettier-plugin-multiline-arrays": "4.1.3", + "rimraf": "^6.1.2", "source-map-support": "^0.5.21", - "terser-webpack-plugin": "^5.3.14", + "terser-webpack-plugin": "^5.3.16", "ts-json-schema-generator": "^2.4.0", "ts-node": "^10.9.2", - "typedoc": "^0.28.9", - "typedoc-plugin-clarity": "^1.6.0", + "typedoc": "^0.28.15", "typedoc-plugin-carbon-ads": "^1.6.0", - "typedoc-plugin-coverage": "^4.0.1", + "typedoc-plugin-clarity": "^1.6.0", + "typedoc-plugin-coverage": "^4.0.2", "typedoc-plugin-keywords": "^1.6.0", - "typedoc-plugin-mdn-links": "^5.0.7", - "typedoc-plugin-missing-exports": "^4.0.0", - "typescript": "^5.9.2", - "typescript-json-schema": "^0.65.1", - "vitest": "^3.2.4", - "webpack": "^5.101.0", - "webpack-bundle-analyzer": "^4.10.2", + "typedoc-plugin-mdn-links": "^5.0.10", + "typedoc-plugin-missing-exports": "^4.1.2", + "typescript": "^5.9.3", + "typescript-eslint": "^8.51.0", + "typescript-json-schema": "^0.67.1", + "vitest": "^4.0.16", + "webpack": "^5.104.1", + "webpack-bundle-analyzer": "^5.1.0", "webpack-cli": "^6.0.1", "yargs": "^18.0.0" }, - "packageManager": "pnpm@10.14.0+sha512.ad27a79641b49c3e481a16a805baa71817a04bbe06a38d17e60e2eaee83f6a146c6a688125f5792e48dd5ba30e7da52a5cda4c3992b9ccf333f9ce223af84748" + "packageManager": "pnpm@10.27.0" } diff --git a/paths/curlNoise/.eslintignore b/paths/curlNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/curlNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/curlNoise/.eslintrc.js b/paths/curlNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/curlNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/curlNoise/CHANGELOG.md b/paths/curlNoise/CHANGELOG.md index f37543180d8..c8b68c89541 100644 --- a/paths/curlNoise/CHANGELOG.md +++ b/paths/curlNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-curl-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-curl-noise diff --git a/paths/curlNoise/eslint.config.js b/paths/curlNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/curlNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/curlNoise/package.dist.json b/paths/curlNoise/package.dist.json index e55ef66be9c..3d6f94482fb 100644 --- a/paths/curlNoise/package.dist.json +++ b/paths/curlNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-curl-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles curl noise path", "homepage": "https://particles.js.org", "repository": { @@ -104,7 +104,8 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/simplex-noise": "3.9.1" - } + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/simplex-noise": "4.0.0-alpha.0" + }, + "type": "module" } diff --git a/paths/curlNoise/package.json b/paths/curlNoise/package.json index 2c17e0b4f09..07f24a065dc 100644 --- a/paths/curlNoise/package.json +++ b/paths/curlNoise/package.json @@ -1,106 +1,107 @@ { - "name": "@tsparticles/path-curl-noise", - "version": "3.9.1", - "description": "tsParticles curl noise path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-curl-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles curl noise path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/curlNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/curlNoise" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/simplex-noise": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/simplex-noise": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/curlNoise/src/CurlNoiseGenerator.ts b/paths/curlNoise/src/CurlNoiseGenerator.ts index f3da51fa154..55879946475 100644 --- a/paths/curlNoise/src/CurlNoiseGenerator.ts +++ b/paths/curlNoise/src/CurlNoiseGenerator.ts @@ -49,10 +49,10 @@ export class CurlNoiseGenerator implements IMovePathGenerator { init(container: Container): void { const sourceOptions = container.actualOptions.particles.move.path.options; - this.options.seed = sourceOptions?.seed as number | undefined; + this.options.seed = sourceOptions["seed"] as number | undefined; this.options.speed = - ((sourceOptions?.speed as number | undefined) ?? defaultOptions.speed) * container.retina.pixelRatio; - this.options.step = (sourceOptions?.step as number | undefined) ?? defaultOptions.step; + ((sourceOptions["speed"] as number | undefined) ?? defaultOptions.speed) * container.retina.pixelRatio; + this.options.step = (sourceOptions["step"] as number | undefined) ?? defaultOptions.step; this._simplex.seed(this.options.seed ?? getRandom()); } diff --git a/paths/curlNoise/src/index.ts b/paths/curlNoise/src/index.ts index 8706086fe72..41da5d232fc 100644 --- a/paths/curlNoise/src/index.ts +++ b/paths/curlNoise/src/index.ts @@ -1,4 +1,3 @@ -import { CurlNoiseGenerator } from "./CurlNoiseGenerator.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const curlNoisePathName = "curlNoise"; /** * @param engine - - * @param refresh - */ -export async function loadCurlNoisePath(engine: Engine, refresh = true): Promise { +export function loadCurlNoisePath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(curlNoisePathName, new CurlNoiseGenerator(), refresh); + engine.register(async e => { + const { CurlNoiseGenerator } = await import("./CurlNoiseGenerator.js"); + + e.addPathGenerator(curlNoisePathName, new CurlNoiseGenerator()); + }); } diff --git a/paths/curlNoise/webpack.config.js b/paths/curlNoise/webpack.config.js index bf51266f330..4ab2a876149 100644 --- a/paths/curlNoise/webpack.config.js +++ b/paths/curlNoise/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "curl.noise", pluginName: "Curl Noise", version, diff --git a/paths/curves/.eslintignore b/paths/curves/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/curves/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/curves/.eslintrc.js b/paths/curves/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/curves/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/curves/CHANGELOG.md b/paths/curves/CHANGELOG.md index 10cce7fdbb3..cda792987d5 100644 --- a/paths/curves/CHANGELOG.md +++ b/paths/curves/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-curves + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-curves diff --git a/paths/curves/eslint.config.js b/paths/curves/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/curves/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/curves/package.dist.json b/paths/curves/package.dist.json index e8cdf82d77e..6ea8e5c1d40 100644 --- a/paths/curves/package.dist.json +++ b/paths/curves/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-curves", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles curves path", "homepage": "https://particles.js.org", "repository": { @@ -104,6 +104,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" - } + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "type": "module" } diff --git a/paths/curves/package.json b/paths/curves/package.json index 8a9ffee1dfa..69513da3b43 100644 --- a/paths/curves/package.json +++ b/paths/curves/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/path-curves", - "version": "3.9.1", - "description": "tsParticles curves path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-curves", + "version": "4.0.0-alpha.0", + "description": "tsParticles curves path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/curves" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/curves" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/curves/src/Curves.ts b/paths/curves/src/Curves.ts index 97abd20659f..9db26d0b40b 100644 --- a/paths/curves/src/Curves.ts +++ b/paths/curves/src/Curves.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { getRandom } from "@tsparticles/engine"; @@ -33,8 +34,8 @@ export function CurvesPathGen( for (let kh = 1; kh <= nbHarmonics; ++kh) { arP0[kh] = randomFunc(); arP1[kh] = randomFunc(); - amplitudes[kh] = kh === 1 ? 1 : amplitudes[kh - 1] * attenHarmonics; - globAmplitude += amplitudes[kh]; + amplitudes[kh] = kh === 1 ? 1 : amplitudes[kh - 1]! * attenHarmonics; + globAmplitude += amplitudes[kh]!; increments[kh] = kh / period; phases[kh] = randomFunc(); } // for kh @@ -49,16 +50,16 @@ export function CurvesPathGen( signal = 0; for (let kh = nbHarmonics; kh >= 1; --kh) { - pf = phases[kh] += increments[kh]; + pf = phases[kh]! += increments[kh]!; - if (phases[kh] >= 1) { - pf = phases[kh] -= 1; - arP0[kh] = arP1[kh]; + if (phases[kh]! >= 1) { + pf = phases[kh]! -= 1; + arP0[kh] = arP1[kh]!; arP1[kh] = randomFunc(); } // if full period reached pfl = pf ** 2 * (3 - 2 * pf); // always 0..1, but smoother - signal += (arP0[kh] * (1 - pfl) + arP1[kh] * pfl) * amplitudes[kh]; + signal += (arP0[kh]! * (1 - pfl) + arP1[kh]! * pfl) * amplitudes[kh]!; } // for kh return signal + lowValue; diff --git a/paths/curves/src/CurvesPathGenerator.ts b/paths/curves/src/CurvesPathGenerator.ts index 50dd85368ac..a60941e8879 100644 --- a/paths/curves/src/CurvesPathGenerator.ts +++ b/paths/curves/src/CurvesPathGenerator.ts @@ -1,11 +1,16 @@ -import { type Container, type IMovePathGenerator, Vector, getRandom, isFunction, isString } from "@tsparticles/engine"; +import { + type Container, + type IMovePathGenerator, + Vector, + doublePI, + getRandom, + isFunction, + isString, +} from "@tsparticles/engine"; import { CurvesPathGen } from "./Curves.js"; import type { CurvesPathParticle } from "./CurvesPathParticle.js"; import type { ICurvesOptions } from "./ICurvesOptions.js"; -const double = 2, - doublePI = Math.PI * double; - /** * @returns a random velocity */ @@ -64,21 +69,21 @@ export class CurvesPathGenerator implements IMovePathGenerator { const sourceOptions = container.actualOptions.particles.move.path.options, { options } = this; - if (isFunction(sourceOptions.rndFunc)) { - options.rndFunc = sourceOptions.rndFunc as () => number; - } else if (isString(sourceOptions.rndFunc)) { + if (isFunction(sourceOptions["rndFunc"])) { + options.rndFunc = sourceOptions["rndFunc"] as () => number; + } else if (isString(sourceOptions["rndFunc"])) { options.rndFunc = - ((window as unknown as Record)[sourceOptions.rndFunc] as + ((globalThis as Record)[sourceOptions["rndFunc"]] as | (() => number) | null | undefined) ?? this.options.rndFunc; } - options.period = (sourceOptions.period as number) ?? options.period; - options.nbHarmonics = (sourceOptions.nbHarmonics as number) ?? options.nbHarmonics; - options.attenHarmonics = (sourceOptions.attenHarmonics as number) ?? options.attenHarmonics; - options.lowValue = (sourceOptions.lowValue as number) ?? options.lowValue; - options.highValue = (sourceOptions.highValue as number) ?? options.highValue; + options.period = (sourceOptions["period"] as number | undefined) ?? options.period; + options.nbHarmonics = (sourceOptions["nbHarmonics"] as number | undefined) ?? options.nbHarmonics; + options.attenHarmonics = (sourceOptions["attenHarmonics"] as number | undefined) ?? options.attenHarmonics; + options.lowValue = (sourceOptions["lowValue"] as number | undefined) ?? options.lowValue; + options.highValue = (sourceOptions["highValue"] as number | undefined) ?? options.highValue; } reset(particle: CurvesPathParticle): void { diff --git a/paths/curves/src/index.ts b/paths/curves/src/index.ts index 4f2006dec17..43d4804f570 100644 --- a/paths/curves/src/index.ts +++ b/paths/curves/src/index.ts @@ -1,4 +1,3 @@ -import { CurvesPathGenerator } from "./CurvesPathGenerator.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const curvesPathName = "curvesPathGenerator"; /** * @param engine - - * @param refresh - */ -export async function loadCurvesPath(engine: Engine, refresh = true): Promise { +export function loadCurvesPath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(curvesPathName, new CurvesPathGenerator(), refresh); + engine.register(async e => { + const { CurvesPathGenerator } = await import("./CurvesPathGenerator.js"); + + e.addPathGenerator(curvesPathName, new CurvesPathGenerator()); + }); } diff --git a/paths/curves/webpack.config.js b/paths/curves/webpack.config.js index a69ca4e31a4..9f5df528051 100644 --- a/paths/curves/webpack.config.js +++ b/paths/curves/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ moduleName: "curves", pluginName: "Curves", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "curves", pluginName: "Curves", version, dir: __dirname }); diff --git a/paths/fractalNoise/.eslintignore b/paths/fractalNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/fractalNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/fractalNoise/.eslintrc.js b/paths/fractalNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/fractalNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/fractalNoise/CHANGELOG.md b/paths/fractalNoise/CHANGELOG.md index d03fe908060..7936af20b1e 100644 --- a/paths/fractalNoise/CHANGELOG.md +++ b/paths/fractalNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-fractal-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-fractal-noise diff --git a/paths/fractalNoise/eslint.config.js b/paths/fractalNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/fractalNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/fractalNoise/package.dist.json b/paths/fractalNoise/package.dist.json index 5f023192bd9..2dceed9b190 100644 --- a/paths/fractalNoise/package.dist.json +++ b/paths/fractalNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-fractal-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles fractal noise path", "homepage": "https://particles.js.org", "repository": { @@ -104,7 +104,9 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/fractal-noise": "3.9.1" - } + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/fractal-noise": "4.0.0-alpha.0", + "@tsparticles/noise-field": "4.0.0-alpha.0" + }, + "type": "module" } diff --git a/paths/fractalNoise/package.json b/paths/fractalNoise/package.json index ce7c0d66043..2647430f6ef 100644 --- a/paths/fractalNoise/package.json +++ b/paths/fractalNoise/package.json @@ -1,120 +1,122 @@ { - "name": "@tsparticles/path-fractal-noise", - "version": "3.9.1", - "description": "tsParticles fractal noise path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-fractal-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles fractal noise path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/fractalNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/fractalNoise" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/fractal-noise": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/fractal-noise": "workspace:4.0.0-alpha.0", + "@tsparticles/noise-field": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/fractalNoise/src/FractalNoiseGenerator.ts b/paths/fractalNoise/src/FractalNoiseGenerator.ts index e75119ba147..f080226e13f 100644 --- a/paths/fractalNoise/src/FractalNoiseGenerator.ts +++ b/paths/fractalNoise/src/FractalNoiseGenerator.ts @@ -1,156 +1,15 @@ -/* eslint-disable @typescript-eslint/no-magic-numbers */ -import { - type Container, - type IMovePathGenerator, - type Particle, - Vector, - deepExtend, - getRandom, -} from "@tsparticles/engine"; import { FractalNoise } from "@tsparticles/fractal-noise"; -import type { IFractalOptions } from "./IFractalOptions.js"; -import type { IOffsetValues } from "./IOffsetValues.js"; - -const defaultOptions: IFractalOptions = { - size: 20, - increment: 0.004, - columns: 0, - rows: 0, - layers: 0, - width: 0, - height: 0, - offset: { - x: 40000, - y: 40000, - z: 40000, - }, -}; - -export class FractalNoiseGenerator implements IMovePathGenerator { - container?: Container; - field: Vector[][][]; - noiseW: number; - readonly options: IFractalOptions; - - private readonly _fractal; +import { NoiseFieldGenerator } from "@tsparticles/noise-field"; +export class FractalNoiseGenerator extends NoiseFieldGenerator { constructor() { - this._fractal = new FractalNoise(); - this.field = []; - this.noiseW = 0; - this.options = deepExtend({}, defaultOptions) as IFractalOptions; - } + const fractalNoise = new FractalNoise(); - generate(particle: Particle): Vector { - const pos = particle.getPosition(), - point = { - x: Math.max(Math.floor(pos.x / this.options.size), 0), - y: Math.max(Math.floor(pos.y / this.options.size), 0), - z: Math.max(Math.floor(pos.z / this.options.size), 0), + super({ + noise4d: (x, y, z, w) => fractalNoise.noise4d(x, y, z, w), + seed: seed => { + fractalNoise.seed(seed); }, - v = Vector.origin; - - if (!this.field?.[point.x]?.[point.y]?.[point.z]) { - return v; - } - - v.setTo(this.field[point.x][point.y][point.z]); - - return v; - } - - init(container: Container): void { - this.container = container; - - this._setup(); - } - - reset(): void { - // nothing to do - } - - update(): void { - if (!this.container) { - return; - } - - this._calculateField(); - - this.noiseW += this.options.increment; - } - - private _calculateField(): void { - const options = this.options; - - for (let x = 0; x < options.columns; x++) { - for (let y = 0; y < options.rows; y++) { - for (let z = 0; z < options.layers; z++) { - this.field[x][y][z].angle = - this._fractal.noise4d(x / 50, y / 50, z / 50, this.noiseW) * Math.PI * 2; - this.field[x][y][z].length = this._fractal.noise4d( - x / 100 + options.offset.x, - y / 100 + options.offset.y, - z / 100 + options.offset.z, - this.noiseW, - ); - } - } - } - } - - private _initField(): void { - this.field = new Array(this.options.columns); - - for (let x = 0; x < this.options.columns; x++) { - this.field[x] = new Array(this.options.rows); - - for (let y = 0; y < this.options.rows; y++) { - this.field[x][y] = new Array(this.options.layers); - - for (let z = 0; z < this.options.layers; z++) { - this.field[x][y][z] = Vector.origin; - } - } - } - } - - private _resetField(): void { - const container = this.container; - - if (!container) { - return; - } - - const sourceOptions = container.actualOptions.particles.move.path.options; - - this.options.size = (sourceOptions.size as number) > 0 ? (sourceOptions.size as number) : defaultOptions.size; - this.options.increment = - (sourceOptions.increment as number) > 0 ? (sourceOptions.increment as number) : defaultOptions.increment; - this.options.width = container.canvas.size.width; - this.options.height = container.canvas.size.height; - - const offset = sourceOptions.offset as IOffsetValues | undefined; - - this.options.offset.x = offset?.x ?? defaultOptions.offset.x; - this.options.offset.y = offset?.y ?? defaultOptions.offset.y; - this.options.offset.z = offset?.z ?? defaultOptions.offset.z; - - this.options.seed = sourceOptions.seed as number | undefined; - - this._fractal.seed(this.options.seed ?? getRandom()); - - this.options.columns = Math.floor(this.options.width / this.options.size) + 1; - this.options.rows = Math.floor(this.options.height / this.options.size) + 1; - this.options.layers = Math.floor(container.zLayers / this.options.size) + 1; - - this._initField(); - } - - private _setup(): void { - this.noiseW = 0; - - this._resetField(); - - addEventListener("resize", () => this._resetField()); + }); } } diff --git a/paths/fractalNoise/src/IFractalOptions.ts b/paths/fractalNoise/src/IFractalOptions.ts deleted file mode 100644 index 1bf0ab053fd..00000000000 --- a/paths/fractalNoise/src/IFractalOptions.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { IOffsetValues } from "./IOffsetValues.js"; - -export interface IFractalOptions { - columns: number; - height: number; - increment: number; - layers: number; - offset: IOffsetValues; - rows: number; - seed?: number; - size: number; - width: number; -} diff --git a/paths/fractalNoise/src/IOffsetValues.ts b/paths/fractalNoise/src/IOffsetValues.ts deleted file mode 100644 index 7303a9854ef..00000000000 --- a/paths/fractalNoise/src/IOffsetValues.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface IOffsetValues { - x: number; - y: number; - z: number; -} diff --git a/paths/fractalNoise/src/index.ts b/paths/fractalNoise/src/index.ts index d162eb75423..69a3bb9b2ca 100644 --- a/paths/fractalNoise/src/index.ts +++ b/paths/fractalNoise/src/index.ts @@ -1,5 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { FractalNoiseGenerator } from "./FractalNoiseGenerator.js"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const fractalNoisePathName = "fractalNoise"; /** * @param engine - - * @param refresh - */ -export async function loadFractalNoisePath(engine: Engine, refresh = true): Promise { +export function loadFractalNoisePath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(fractalNoisePathName, new FractalNoiseGenerator(), refresh); + engine.register(async e => { + const { FractalNoiseGenerator } = await import("./FractalNoiseGenerator.js"); + + e.addPathGenerator(fractalNoisePathName, new FractalNoiseGenerator()); + }); } diff --git a/paths/fractalNoise/webpack.config.js b/paths/fractalNoise/webpack.config.js index 3c2517a584d..f8b8acde5fa 100644 --- a/paths/fractalNoise/webpack.config.js +++ b/paths/fractalNoise/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ moduleName: "fractal.noise", pluginName: "Fractal Noise", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "fractal.noise", pluginName: "Fractal Noise", version, dir: __dirname }); diff --git a/paths/perlinNoise/.eslintignore b/paths/perlinNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/perlinNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/perlinNoise/.eslintrc.js b/paths/perlinNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/perlinNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/perlinNoise/CHANGELOG.md b/paths/perlinNoise/CHANGELOG.md index 6ad145cdec4..e761d834ada 100644 --- a/paths/perlinNoise/CHANGELOG.md +++ b/paths/perlinNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-perlin-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-perlin-noise diff --git a/paths/perlinNoise/eslint.config.js b/paths/perlinNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/perlinNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/perlinNoise/package.dist.json b/paths/perlinNoise/package.dist.json index f2bee066fff..302f2251e8f 100644 --- a/paths/perlinNoise/package.dist.json +++ b/paths/perlinNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-perlin-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles perlin noise path", "homepage": "https://particles.js.org", "repository": { @@ -104,7 +104,9 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/perlin-noise": "3.9.1" - } + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/noise-field": "4.0.0-alpha.0", + "@tsparticles/perlin-noise": "4.0.0-alpha.0" + }, + "type": "module" } diff --git a/paths/perlinNoise/package.json b/paths/perlinNoise/package.json index adb2417418e..73ad16ce482 100644 --- a/paths/perlinNoise/package.json +++ b/paths/perlinNoise/package.json @@ -1,120 +1,122 @@ { - "name": "@tsparticles/path-perlin-noise", - "version": "3.9.1", - "description": "tsParticles perlin noise path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-perlin-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles perlin noise path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/perlinNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/perlinNoise" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/perlin-noise": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/noise-field": "workspace:4.0.0-alpha.0", + "@tsparticles/perlin-noise": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/perlinNoise/src/PerlinNoiseGenerator.ts b/paths/perlinNoise/src/PerlinNoiseGenerator.ts index 81c3d56d642..2222a339fd3 100644 --- a/paths/perlinNoise/src/PerlinNoiseGenerator.ts +++ b/paths/perlinNoise/src/PerlinNoiseGenerator.ts @@ -1,199 +1,15 @@ -/* eslint-disable @typescript-eslint/no-magic-numbers */ - -import { - type Container, - type IMovePathGenerator, - type Particle, - Vector, - deepExtend, - getRandom, -} from "@tsparticles/engine"; -import type { IFactorValues, IOffsetValues } from "./IFactorOffsetValues.js"; -import type { IPerlinOptions } from "./IPerlinOptions.js"; +import { NoiseFieldGenerator } from "@tsparticles/noise-field"; import { PerlinNoise } from "@tsparticles/perlin-noise"; -const double = 2, - doublePI = Math.PI * double, - defaultOptions: IPerlinOptions = { - draw: false, - size: 20, - increment: 0.004, - columns: 0, - rows: 0, - layers: 0, - width: 0, - height: 0, - factor: { - angle: 0.02, - length: 0.01, - }, - offset: { - x: 40000, - y: 40000, - z: 40000, - }, - }; - -export class PerlinNoiseGenerator implements IMovePathGenerator { - container?: Container; - field: Vector[][][]; - readonly noiseGen: PerlinNoise; - noiseW: number; - readonly options: IPerlinOptions; - +export class PerlinNoiseGenerator extends NoiseFieldGenerator { constructor() { - this.noiseGen = new PerlinNoise(); - this.field = []; - this.noiseW = 0; - this.options = deepExtend({}, defaultOptions) as IPerlinOptions; - } + const perlinNoise = new PerlinNoise(); - generate(particle: Particle): Vector { - const pos = particle.getPosition(), - { size } = this.options, - point = { - x: Math.max(Math.floor(pos.x / size), 0), - y: Math.max(Math.floor(pos.y / size), 0), - z: Math.max(Math.floor(pos.z / size), 0), + super({ + noise4d: (x, y, z, w) => perlinNoise.noise4d(x, y, z, w), + seed: seed => { + perlinNoise.seed(seed); }, - v = Vector.origin, - { field } = this; - - return field?.[point.x]?.[point.y]?.[point.z] ? field[point.x][point.y][point.z].copy() : v; - } - - init(container: Container): void { - this.container = container; - - this._setup(); - } - - reset(): void { - // nothing to do - } - - update(): void { - if (!this.container) { - return; - } - - this._calculateField(); - - this.noiseW += this.options.increment; - - if (this.options.draw) { - this.container.canvas.draw(ctx => this._drawField(ctx)); - } - } - - private _calculateField(): void { - const { field, noiseGen, options, noiseW } = this, - lengthFactor = options.factor.length, - angleFactor = options.factor.angle; - - for (let x = 0; x < options.columns; x++) { - for (let y = 0; y < options.rows; y++) { - for (let z = 0; z < options.layers; z++) { - const cell = field[x][y][z]; - - cell.length = noiseGen.noise4d( - x * lengthFactor + options.offset.x, - y * lengthFactor + options.offset.y, - z * lengthFactor + options.offset.z, - noiseW, - ); - cell.angle = noiseGen.noise4d(x * angleFactor, y * angleFactor, z * angleFactor, noiseW) * doublePI; - } - } - } - } - - private _drawField(ctx: CanvasRenderingContext2D): void { - const { field, options } = this; - - for (let x = 0; x < options.columns; x++) { - const column = field[x]; - - for (let y = 0; y < options.rows; y++) { - const cell = column[y][0], // only 2D - { angle, length } = cell; - - // ctx.save(); - ctx.setTransform(1, 0, 0, 1, x * this.options.size, y * this.options.size); - ctx.rotate(angle); - ctx.strokeStyle = "white"; - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(0, this.options.size * length); - ctx.stroke(); - ctx.setTransform(1, 0, 0, 1, 0, 0); - // ctx.restore(); - } - } - } - - private _initField(): void { - const { columns, rows, layers } = this.options; - this.field = new Array(columns); - - for (let x = 0; x < columns; x++) { - this.field[x] = new Array(rows); - - for (let y = 0; y < rows; y++) { - this.field[x][y] = new Array(layers); - - for (let z = 0; z < layers; z++) { - this.field[x][y][z] = Vector.origin; - } - } - } - } - - private _resetField(): void { - const container = this.container; - - if (!container) { - return; - } - - const sourceOptions = container.actualOptions.particles.move.path.options, - { options } = this; - - options.width = container.canvas.size.width; - options.height = container.canvas.size.height; - - options.size = (sourceOptions.size as number) > 0 ? (sourceOptions.size as number) : defaultOptions.size; - options.increment = - (sourceOptions.increment as number) > 0 ? (sourceOptions.increment as number) : defaultOptions.increment; - options.draw = !!sourceOptions.draw; - - const offset = sourceOptions.offset as IOffsetValues | undefined; - - options.offset.x = offset?.x ?? defaultOptions.offset.x; - options.offset.y = offset?.y ?? defaultOptions.offset.y; - options.offset.z = offset?.z ?? defaultOptions.offset.z; - - const factor = sourceOptions.factor as IFactorValues | undefined; - - options.factor.angle = factor?.angle ?? defaultOptions.factor.angle; - options.factor.length = factor?.length ?? defaultOptions.factor.length; - - options.seed = sourceOptions.seed as number | undefined; - - this.noiseGen.seed(options.seed ?? getRandom()); - - options.columns = Math.floor(options.width / options.size) + 1; - options.rows = Math.floor(options.height / options.size) + 1; - options.layers = Math.floor(container.zLayers / options.size) + 1; - - this._initField(); - } - - private _setup(): void { - this.noiseW = 0; - - this._resetField(); - - addEventListener("resize", () => this._resetField()); + }); } } diff --git a/paths/perlinNoise/src/index.ts b/paths/perlinNoise/src/index.ts index d853ddb652c..df0311cf131 100644 --- a/paths/perlinNoise/src/index.ts +++ b/paths/perlinNoise/src/index.ts @@ -1,5 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { PerlinNoiseGenerator } from "./PerlinNoiseGenerator.js"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const perlinNoisePathName = "perlinNoise"; /** * @param engine - - * @param refresh - */ -export async function loadPerlinNoisePath(engine: Engine, refresh = true): Promise { +export function loadPerlinNoisePath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(perlinNoisePathName, new PerlinNoiseGenerator(), refresh); + engine.register(async e => { + const { PerlinNoiseGenerator } = await import("./PerlinNoiseGenerator.js"); + + e.addPathGenerator(perlinNoisePathName, new PerlinNoiseGenerator()); + }); } diff --git a/paths/perlinNoise/webpack.config.js b/paths/perlinNoise/webpack.config.js index e9f4a116bb5..5d997ce215e 100644 --- a/paths/perlinNoise/webpack.config.js +++ b/paths/perlinNoise/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ moduleName: "perlin.noise", pluginName: "Perlin Noise", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "perlin.noise", pluginName: "Perlin Noise", version, dir: __dirname }); diff --git a/paths/polygon/.eslintignore b/paths/polygon/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/polygon/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/polygon/.eslintrc.js b/paths/polygon/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/polygon/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/polygon/CHANGELOG.md b/paths/polygon/CHANGELOG.md index 288e248ab77..aeca4e48dca 100644 --- a/paths/polygon/CHANGELOG.md +++ b/paths/polygon/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-polygon + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-polygon diff --git a/paths/polygon/eslint.config.js b/paths/polygon/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/polygon/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/polygon/package.dist.json b/paths/polygon/package.dist.json index 9e92a7c520d..1b00e75db2a 100644 --- a/paths/polygon/package.dist.json +++ b/paths/polygon/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-polygon", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles polygon path", "homepage": "https://particles.js.org", "repository": { @@ -104,6 +104,7 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" - } + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "type": "module" } diff --git a/paths/polygon/package.json b/paths/polygon/package.json index 3d5d34977ce..ea29956231a 100644 --- a/paths/polygon/package.json +++ b/paths/polygon/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/path-polygon", - "version": "3.9.1", - "description": "tsParticles polygon path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-polygon", + "version": "4.0.0-alpha.0", + "description": "tsParticles polygon path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/polygon" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/polygon" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/polygon/src/PolygonPathGenerator.ts b/paths/polygon/src/PolygonPathGenerator.ts index 0ef0ebe9c57..8305c134778 100644 --- a/paths/polygon/src/PolygonPathGenerator.ts +++ b/paths/polygon/src/PolygonPathGenerator.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { type Container, type ICoordinates, type IMovePathGenerator, Vector, getRandom } from "@tsparticles/engine"; import type { IPolygonPathOptions } from "./IPolygonPathOptions.js"; @@ -20,17 +21,9 @@ export class PolygonPathGenerator implements IMovePathGenerator { generate(p: PolygonPathParticle): Vector { const { sides } = this.options; - if (p.hexStep === undefined) { - p.hexStep = 0; - } - - if (p.hexDirection === undefined) { - p.hexDirection = sides === 6 ? ((getRandom() * 3) | 0) * 2 : (getRandom() * sides) | 0; - } - - if (p.hexSpeed === undefined) { - p.hexSpeed = p.velocity.length; - } + p.hexStep ??= 0; + p.hexDirection ??= sides === 6 ? ((getRandom() * 3) | 0) * 2 : (getRandom() * sides) | 0; + p.hexSpeed ??= p.velocity.length; if (p.hexStep % this.options.turnSteps === 0) { p.hexDirection = getRandom() > 0.5 ? (p.hexDirection + 1) % sides : (p.hexDirection + sides - 1) % sides; @@ -41,7 +34,7 @@ export class PolygonPathGenerator implements IMovePathGenerator { p.hexStep++; - const direction = this.dirsList[p.hexDirection]; + const direction = this.dirsList[p.hexDirection]!; return Vector.create(direction.x * p.hexSpeed, direction.y * p.hexSpeed); } @@ -49,9 +42,9 @@ export class PolygonPathGenerator implements IMovePathGenerator { init(container: Container): void { const options = container.actualOptions.particles.move.path.options; - this.options.sides = (options.sides as number) > 0 ? (options.sides as number) : 6; - this.options.angle = (options.angle as number) ?? 30; - this.options.turnSteps = (options.turnSteps as number) >= 0 ? (options.turnSteps as number) : 20; + this.options.sides = (options["sides"] as number) > 0 ? (options["sides"] as number) : 6; + this.options.angle = (options["angle"] as number | undefined) ?? 30; + this.options.turnSteps = (options["turnSteps"] as number) >= 0 ? (options["turnSteps"] as number) : 20; this._createDirs(); } diff --git a/paths/polygon/src/index.ts b/paths/polygon/src/index.ts index 44dbaa88bf3..9750209b151 100644 --- a/paths/polygon/src/index.ts +++ b/paths/polygon/src/index.ts @@ -1,5 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { PolygonPathGenerator } from "./PolygonPathGenerator.js"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const polygonPathName = "polygonPathGenerator"; /** * @param engine - - * @param refresh - */ -export async function loadPolygonPath(engine: Engine, refresh = true): Promise { +export function loadPolygonPath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(polygonPathName, new PolygonPathGenerator(), refresh); + engine.register(async e => { + const { PolygonPathGenerator } = await import("./PolygonPathGenerator.js"); + + e.addPathGenerator(polygonPathName, new PolygonPathGenerator()); + }); } diff --git a/paths/polygon/webpack.config.js b/paths/polygon/webpack.config.js index 5c6c5131233..21d61864193 100644 --- a/paths/polygon/webpack.config.js +++ b/paths/polygon/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ moduleName: "polygon", pluginName: "Polygon", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "polygon", pluginName: "Polygon", version, dir: __dirname }); diff --git a/paths/simplexNoise/.eslintignore b/paths/simplexNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/simplexNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/simplexNoise/.eslintrc.js b/paths/simplexNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/simplexNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/simplexNoise/CHANGELOG.md b/paths/simplexNoise/CHANGELOG.md index 93b21f25d42..981a6437293 100644 --- a/paths/simplexNoise/CHANGELOG.md +++ b/paths/simplexNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-simplex-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-simplex-noise diff --git a/paths/simplexNoise/eslint.config.js b/paths/simplexNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/simplexNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/simplexNoise/package.dist.json b/paths/simplexNoise/package.dist.json index 419f956b33e..7426773ca8b 100644 --- a/paths/simplexNoise/package.dist.json +++ b/paths/simplexNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-simplex-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles simplex noise path", "homepage": "https://particles.js.org", "repository": { @@ -104,7 +104,9 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/simplex-noise": "3.9.1" - } + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/noise-field": "4.0.0-alpha.0", + "@tsparticles/simplex-noise": "4.0.0-alpha.0" + }, + "type": "module" } diff --git a/paths/simplexNoise/package.json b/paths/simplexNoise/package.json index e579039f1c3..6f1ca537a55 100644 --- a/paths/simplexNoise/package.json +++ b/paths/simplexNoise/package.json @@ -1,106 +1,108 @@ { - "name": "@tsparticles/path-simplex-noise", - "version": "3.9.1", - "description": "tsParticles simplex noise path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-simplex-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles simplex noise path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/simplexNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/simplexNoise" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/simplex-noise": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/noise-field": "workspace:4.0.0-alpha.0", + "@tsparticles/simplex-noise": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/simplexNoise/src/IFactorOffsetValues.ts b/paths/simplexNoise/src/IFactorOffsetValues.ts deleted file mode 100644 index 2fbc3d46a77..00000000000 --- a/paths/simplexNoise/src/IFactorOffsetValues.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface IFactorValues { - angle: number; - length: number; -} - -export interface IOffsetValues { - x: number; - y: number; - z: number; -} diff --git a/paths/simplexNoise/src/ISimplexOptions.ts b/paths/simplexNoise/src/ISimplexOptions.ts deleted file mode 100644 index 162030aa80c..00000000000 --- a/paths/simplexNoise/src/ISimplexOptions.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { IFactorValues, IOffsetValues } from "./IFactorOffsetValues.js"; - -export interface ISimplexOptions { - columns: number; - draw: boolean; - factor: IFactorValues; - height: number; - increment: number; - layers: number; - offset: IOffsetValues; - rows: number; - seed?: number; - size: number; - width: number; -} diff --git a/paths/simplexNoise/src/SimplexNoiseGenerator.ts b/paths/simplexNoise/src/SimplexNoiseGenerator.ts index 75b5b5fdcdd..2b4914752c4 100644 --- a/paths/simplexNoise/src/SimplexNoiseGenerator.ts +++ b/paths/simplexNoise/src/SimplexNoiseGenerator.ts @@ -1,202 +1,15 @@ -/* eslint-disable @typescript-eslint/no-magic-numbers */ - -import { - type Container, - type IMovePathGenerator, - type Particle, - Vector, - deepExtend, - getRandom, -} from "@tsparticles/engine"; -import type { IFactorValues, IOffsetValues } from "./IFactorOffsetValues.js"; -import type { ISimplexOptions } from "./ISimplexOptions.js"; +import { NoiseFieldGenerator } from "@tsparticles/noise-field"; import { SimplexNoise } from "@tsparticles/simplex-noise"; -const defaultOptions: ISimplexOptions = { - draw: false, - size: 20, - increment: 0.004, - columns: 0, - rows: 0, - layers: 0, - width: 0, - height: 0, - factor: { - angle: 0.02, - length: 0.01, - }, - offset: { - x: 40000, - y: 40000, - z: 40000, - }, -}; - -export class SimplexNoiseGenerator implements IMovePathGenerator { - container?: Container; - field: Vector[][][]; - noiseW: number; - readonly options: ISimplexOptions; - - private readonly _simplex; - +export class SimplexNoiseGenerator extends NoiseFieldGenerator { constructor() { const simplex = new SimplexNoise(); - this._simplex = simplex.noise4d; - this.field = []; - this.noiseW = 0; - this.options = deepExtend({}, defaultOptions) as ISimplexOptions; - } - - generate(particle: Particle): Vector { - const pos = particle.getPosition(), - { size } = this.options, - point = { - x: Math.max(Math.floor(pos.x / size), 0), - y: Math.max(Math.floor(pos.y / size), 0), - z: Math.max(Math.floor(pos.z / size), 0), + super({ + noise4d: (x, y, z, w) => simplex.noise4d.noise(x, y, z, w), + seed: seed => { + simplex.noise4d.seed(seed); }, - v = Vector.origin, - { field } = this; - - return field?.[point.x]?.[point.y]?.[point.z] ? field[point.x][point.y][point.z].copy() : v; - } - - init(container: Container): void { - this.container = container; - - this._setup(); - } - - reset(): void { - // nothing to do - } - - update(): void { - if (!this.container) { - return; - } - - this._calculateField(); - - this.noiseW += this.options.increment; - - if (this.options.draw) { - this.container.canvas.draw(ctx => this._drawField(ctx)); - } - } - - private _calculateField(): void { - const { options, field, _simplex: noiseGen, noiseW } = this, - lengthFactor = options.factor.length, - angleFactor = options.factor.angle; - - for (let x = 0; x < options.columns; x++) { - for (let y = 0; y < options.rows; y++) { - for (let z = 0; z < options.layers; z++) { - const cell = field[x][y][z]; - - cell.length = noiseGen.noise( - x * lengthFactor + options.offset.x, - y * lengthFactor + options.offset.y, - z * lengthFactor + options.offset.z, - noiseW, - ); - cell.angle = - noiseGen.noise(x * angleFactor, y * angleFactor, z * angleFactor, noiseW) * Math.PI * 2; - } - } - } - } - - private _drawField(ctx: CanvasRenderingContext2D): void { - const { field, options } = this; - - for (let x = 0; x < options.columns; x++) { - const column = field[x]; - - for (let y = 0; y < options.rows; y++) { - const cell = column[y][0], // draw only the first layer - { angle, length } = cell; - - // ctx.save(); - ctx.setTransform(1, 0, 0, 1, x * this.options.size, y * this.options.size); - ctx.rotate(angle); - ctx.strokeStyle = "white"; - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(0, this.options.size * length); - ctx.stroke(); - ctx.setTransform(1, 0, 0, 1, 0, 0); - // ctx.restore(); - } - } - } - - private _initField(): void { - const { columns, rows, layers } = this.options; - - this.field = new Array(columns); - - for (let x = 0; x < columns; x++) { - this.field[x] = new Array(rows); - - for (let y = 0; y < rows; y++) { - this.field[x][y] = new Array(layers); - - for (let z = 0; z < layers; z++) { - this.field[x][y][z] = Vector.origin; - } - } - } - } - - private _resetField(): void { - const container = this.container; - - if (!container) { - return; - } - - const sourceOptions = container.actualOptions.particles.move.path.options, - { options } = this; - - options.width = container.canvas.size.width; - options.height = container.canvas.size.height; - - options.size = (sourceOptions.size as number) > 0 ? (sourceOptions.size as number) : defaultOptions.size; - options.increment = - (sourceOptions.increment as number) > 0 ? (sourceOptions.increment as number) : defaultOptions.increment; - options.draw = !!sourceOptions.draw; - - const offset = sourceOptions.offset as IOffsetValues | undefined; - - options.offset.x = offset?.x ?? defaultOptions.offset.x; - options.offset.y = offset?.y ?? defaultOptions.offset.y; - options.offset.z = offset?.z ?? defaultOptions.offset.z; - - const factor = sourceOptions.factor as IFactorValues | undefined; - - options.factor.angle = factor?.angle ?? defaultOptions.factor.angle; - options.factor.length = factor?.length ?? defaultOptions.factor.length; - - options.seed = sourceOptions.seed as number | undefined; - - this._simplex.seed(options.seed ?? getRandom()); - - options.columns = Math.floor(options.width / options.size) + 1; - options.rows = Math.floor(options.height / options.size) + 1; - options.layers = Math.floor(container.zLayers / options.size) + 1; - - this._initField(); - } - - private _setup(): void { - this.noiseW = 0; - - this._resetField(); - - addEventListener("resize", () => this._resetField()); + }); } } diff --git a/paths/simplexNoise/src/index.ts b/paths/simplexNoise/src/index.ts index f1290647c1d..c250685cda8 100644 --- a/paths/simplexNoise/src/index.ts +++ b/paths/simplexNoise/src/index.ts @@ -1,5 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { SimplexNoiseGenerator } from "./SimplexNoiseGenerator.js"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const simplexNoisePathName = "simplexNoise"; /** * @param engine - - * @param refresh - */ -export async function loadSimplexNoisePath(engine: Engine, refresh = true): Promise { +export function loadSimplexNoisePath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(simplexNoisePathName, new SimplexNoiseGenerator(), refresh); + engine.register(async e => { + const { SimplexNoiseGenerator } = await import("./SimplexNoiseGenerator.js"); + + e.addPathGenerator(simplexNoisePathName, new SimplexNoiseGenerator()); + }); } diff --git a/paths/simplexNoise/webpack.config.js b/paths/simplexNoise/webpack.config.js index d0a7d716db5..b72a2c09dc0 100644 --- a/paths/simplexNoise/webpack.config.js +++ b/paths/simplexNoise/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "simplex.noise", pluginName: "Simplex Noise", version, diff --git a/paths/svg/.eslintignore b/paths/svg/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/svg/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/svg/.eslintrc.js b/paths/svg/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/svg/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/svg/CHANGELOG.md b/paths/svg/CHANGELOG.md index 3e73f7918d3..521e78bb2db 100644 --- a/paths/svg/CHANGELOG.md +++ b/paths/svg/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-svg + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-svg diff --git a/paths/svg/eslint.config.js b/paths/svg/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/svg/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/svg/package.dist.json b/paths/svg/package.dist.json index 5609586f0fe..6f408739296 100644 --- a/paths/svg/package.dist.json +++ b/paths/svg/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-svg", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles svg path", "homepage": "https://particles.js.org", "repository": { @@ -101,9 +101,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/paths/svg/package.json b/paths/svg/package.json index 3685c567347..8501b57d301 100644 --- a/paths/svg/package.json +++ b/paths/svg/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/path-svg", - "version": "3.9.1", - "description": "tsParticles svg path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-svg", + "version": "4.0.0-alpha.0", + "description": "tsParticles svg path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/svg" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/svg" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/svg/src/SVGPathGenerator.ts b/paths/svg/src/SVGPathGenerator.ts index 9f34c1a7eb4..26a1c8147fd 100644 --- a/paths/svg/src/SVGPathGenerator.ts +++ b/paths/svg/src/SVGPathGenerator.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { type Container, type ICoordinates, @@ -11,7 +12,8 @@ import { getPosition, getRandom, half, - randomInRange, + randomInRangeValue, + safeDocument, } from "@tsparticles/engine"; enum SVGPathDirection { @@ -72,32 +74,15 @@ export class SVGPathGenerator implements IMovePathGenerator { const container = particle.container, pxRatio = container.retina.pixelRatio; - if (particle.svgDirection === undefined) { - particle.svgDirection = getRandom() > half ? SVGPathDirection.normal : SVGPathDirection.reverse; - } - - if (particle.svgPathIndex === undefined) { - particle.svgPathIndex = Math.floor(getRandom() * this._paths.length); - } - - if (particle.svgSpeed === undefined) { - particle.svgSpeed = particle.velocity.mult((particle.retina.moveSpeed ?? defaultSpeed) * half).length; - } - - if (particle.svgStep === undefined) { - particle.svgStep = randomInRange({ min: 0, max: this._paths[particle.svgPathIndex].length }) * pxRatio; - } - - if (particle.svgOffset === undefined) { - particle.svgOffset = { - width: randomInRange({ min: -this._width * half, max: this._width * half }) * pxRatio, - height: randomInRange({ min: -this._width * half, max: this._width * half }) * pxRatio, - }; - } - - if (particle.svgInitialPosition === undefined) { - particle.svgInitialPosition = { ...particle.position }; - } + particle.svgDirection ??= getRandom() > half ? SVGPathDirection.normal : SVGPathDirection.reverse; + particle.svgPathIndex ??= Math.floor(getRandom() * this._paths.length); + particle.svgSpeed ??= particle.velocity.mult((particle.retina.moveSpeed ?? defaultSpeed) * half).length; + particle.svgStep ??= randomInRangeValue({ min: 0, max: this._paths[particle.svgPathIndex]!.length }) * pxRatio; + particle.svgOffset ??= { + width: randomInRangeValue({ min: -this._width * half, max: this._width * half }) * pxRatio, + height: randomInRangeValue({ min: -this._width * half, max: this._width * half }) * pxRatio, + }; + particle.svgInitialPosition ??= particle.position.copy(); particle.velocity.x = 0; particle.velocity.y = 0; @@ -108,65 +93,61 @@ export class SVGPathGenerator implements IMovePathGenerator { particle.svgStep -= particle.svgSpeed * delta.factor; } - let path = this._paths[particle.svgPathIndex]; + let path = this._paths[particle.svgPathIndex]!; - if (path) { - const pathLength = path.length, - indexOffset = 1; + const pathLength = path.length, + indexOffset = 1; - if (particle.svgStep >= pathLength) { - particle.svgPathIndex = particle.svgPathIndex + indexOffset; + if (particle.svgStep >= pathLength) { + particle.svgPathIndex = particle.svgPathIndex + indexOffset; - if (particle.svgPathIndex >= this._paths.length) { - if (this._reverse) { - particle.svgPathIndex = this._paths.length - indexOffset; + if (particle.svgPathIndex >= this._paths.length) { + if (this._reverse) { + particle.svgPathIndex = this._paths.length - indexOffset; - particle.svgDirection = SVGPathDirection.reverse; - } else { - particle.svgPathIndex = 0; + particle.svgDirection = SVGPathDirection.reverse; + } else { + particle.svgPathIndex = 0; - particle.svgStep = 0; - } + particle.svgStep = 0; } - } else if (particle.svgStep <= minStep) { - particle.svgPathIndex = particle.svgPathIndex - indexOffset; + } + } else if (particle.svgStep <= minStep) { + particle.svgPathIndex = particle.svgPathIndex - indexOffset; - if (particle.svgPathIndex < minIndex) { - if (this._reverse) { - particle.svgPathIndex = 0; + if (particle.svgPathIndex < minIndex) { + if (this._reverse) { + particle.svgPathIndex = 0; - particle.svgDirection = SVGPathDirection.normal; - } else { - particle.svgPathIndex = this._paths.length - indexOffset; + particle.svgDirection = SVGPathDirection.normal; + } else { + particle.svgPathIndex = this._paths.length - indexOffset; - path = this._paths[particle.svgPathIndex]; + path = this._paths[particle.svgPathIndex]!; - particle.svgStep = path.length; - } + particle.svgStep = path.length; } } - - path = this._paths[particle.svgPathIndex]; } - if (path) { - const pathElement = path.element, - pos = pathElement.getPointAtLength(particle.svgStep), - canvasSize = particle.container.canvas.size, - offset = getPosition(this._offset, canvasSize), - scale = this._scale * pxRatio; - - particle.position.x = - (pos.x - this._size.width * half) * scale + - particle.svgInitialPosition.x + - offset.x + - particle.svgOffset.width; - particle.position.y = - (pos.y - this._size.height * half) * scale + - particle.svgInitialPosition.y + - offset.y + - particle.svgOffset.height; - } + path = this._paths[particle.svgPathIndex]!; + + const pathElement = path.element, + pos = pathElement.getPointAtLength(particle.svgStep), + canvasSize = particle.container.canvas.size, + offset = getPosition(this._offset, canvasSize), + scale = this._scale * pxRatio; + + particle.position.x = + (pos.x - this._size.width * half) * scale + + particle.svgInitialPosition.x + + offset.x + + particle.svgOffset.width; + particle.position.y = + (pos.y - this._size.height * half) * scale + + particle.svgInitialPosition.y + + offset.y + + particle.svgOffset.height; return Vector.origin; } @@ -193,7 +174,7 @@ export class SVGPathGenerator implements IMovePathGenerator { const parser = new DOMParser(), doc = parser.parseFromString(data, "image/svg+xml"), firstIndex = 0, - svg = doc.getElementsByTagName("svg")[firstIndex]; + svg = doc.getElementsByTagName("svg")[firstIndex]!; let svgPaths = svg.getElementsByTagName("path"); @@ -214,8 +195,8 @@ export class SVGPathGenerator implements IMovePathGenerator { } } - this._size.height = parseFloat(svg.getAttribute("height") ?? "0"); - this._size.width = parseFloat(svg.getAttribute("width") ?? "0"); + this._size.height = Number.parseFloat(svg.getAttribute("height") ?? "0"); + this._size.width = Number.parseFloat(svg.getAttribute("width") ?? "0"); })(); } else if (options.path) { const path = options.path; @@ -223,7 +204,7 @@ export class SVGPathGenerator implements IMovePathGenerator { this._paths = []; for (const item of path.data) { - const element = document.createElementNS("http://www.w3.org/2000/svg", "path"); + const element = safeDocument().createElementNS("http://www.w3.org/2000/svg", "path"); element.setAttribute("d", item); diff --git a/paths/svg/src/index.ts b/paths/svg/src/index.ts index dda9e237d4d..81c8b62c8ad 100644 --- a/paths/svg/src/index.ts +++ b/paths/svg/src/index.ts @@ -1,5 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { SVGPathGenerator } from "./SVGPathGenerator.js"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const svgPathName = "svgPathGenerator"; /** * @param engine - - * @param refresh - */ -export async function loadSVGPath(engine: Engine, refresh = true): Promise { +export function loadSVGPath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(svgPathName, new SVGPathGenerator(), refresh); + engine.register(async e => { + const { SVGPathGenerator } = await import("./SVGPathGenerator.js"); + + e.addPathGenerator(svgPathName, new SVGPathGenerator()); + }); } diff --git a/paths/svg/webpack.config.js b/paths/svg/webpack.config.js index 32d5a2a0e2c..2876f8876b5 100644 --- a/paths/svg/webpack.config.js +++ b/paths/svg/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ moduleName: "svg", pluginName: "SVG", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "svg", pluginName: "SVG", version, dir: __dirname }); diff --git a/paths/zigzag/.eslintignore b/paths/zigzag/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/paths/zigzag/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/paths/zigzag/.eslintrc.js b/paths/zigzag/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/paths/zigzag/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/paths/zigzag/CHANGELOG.md b/paths/zigzag/CHANGELOG.md index dd9340dbb27..0f1ccf68320 100644 --- a/paths/zigzag/CHANGELOG.md +++ b/paths/zigzag/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/path-zig-zag + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/path-zig-zag diff --git a/paths/zigzag/eslint.config.js b/paths/zigzag/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/paths/zigzag/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/paths/zigzag/package.dist.json b/paths/zigzag/package.dist.json index 69084907d44..704d306e950 100644 --- a/paths/zigzag/package.dist.json +++ b/paths/zigzag/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/path-zig-zag", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles zig zag path", "homepage": "https://particles.js.org", "repository": { @@ -101,9 +101,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/paths/zigzag/package.json b/paths/zigzag/package.json index bc72ee6de61..bf994765371 100644 --- a/paths/zigzag/package.json +++ b/paths/zigzag/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/path-zig-zag", - "version": "3.9.1", - "description": "tsParticles zig zag path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/path-zig-zag", + "version": "4.0.0-alpha.0", + "description": "tsParticles zig zag path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/zigzag" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "tsparticles-path" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/zigzag" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "tsparticles-path" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/paths/zigzag/src/ZigZagPathGenerator.ts b/paths/zigzag/src/ZigZagPathGenerator.ts index 507b6428726..a38fdb7e734 100644 --- a/paths/zigzag/src/ZigZagPathGenerator.ts +++ b/paths/zigzag/src/ZigZagPathGenerator.ts @@ -39,13 +39,11 @@ export class ZigZagPathGenerator implements IMovePathGenerator { } generate(particle: ZigZagParticle, delta: IDelta): Vector { - if (particle.zigzag === undefined) { - particle.zigzag = { - counter: getRandom(), - waveHeight: getRangeValue(this.options.waveHeight), - waveLength: getRangeValue(this.options.waveLength), - }; - } + particle.zigzag ??= { + counter: getRandom(), + waveHeight: getRangeValue(this.options.waveHeight), + waveLength: getRangeValue(this.options.waveLength), + }; const angularFrequency = (angularFrequencyFactor / particle.zigzag.waveLength) * delta.factor; @@ -62,8 +60,8 @@ export class ZigZagPathGenerator implements IMovePathGenerator { init(container: Container): void { const options = container.actualOptions.particles.move.path.options; - this.options.waveLength = (options.waveLength as RangeValue) ?? this.options.waveLength; - this.options.waveHeight = (options.waveHeight as RangeValue) ?? this.options.waveHeight; + this.options.waveLength = (options["waveLength"] as RangeValue | undefined) ?? this.options.waveLength; + this.options.waveHeight = (options["waveHeight"] as RangeValue | undefined) ?? this.options.waveHeight; } reset(): void { diff --git a/paths/zigzag/src/index.ts b/paths/zigzag/src/index.ts index 9e692715a92..ab60fe9c457 100644 --- a/paths/zigzag/src/index.ts +++ b/paths/zigzag/src/index.ts @@ -1,5 +1,4 @@ import { type Engine } from "@tsparticles/engine"; -import { ZigZagPathGenerator } from "./ZigZagPathGenerator.js"; declare const __VERSION__: string; @@ -7,10 +6,13 @@ export const zigZagPathName = "zigZagPathGenerator"; /** * @param engine - - * @param refresh - */ -export async function loadZigZagPath(engine: Engine, refresh = true): Promise { +export function loadZigZagPath(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPathGenerator(zigZagPathName, new ZigZagPathGenerator(), refresh); + engine.register(async e => { + const { ZigZagPathGenerator } = await import("./ZigZagPathGenerator.js"); + + e.addPathGenerator(zigZagPathName, new ZigZagPathGenerator()); + }); } diff --git a/paths/zigzag/webpack.config.js b/paths/zigzag/webpack.config.js index ba2435baa9a..f19610ebb52 100644 --- a/paths/zigzag/webpack.config.js +++ b/paths/zigzag/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPath } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPath } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPath({ moduleName: "zigzag", pluginName: "Zig Zag", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPath({ moduleName: "zigzag", pluginName: "Zig Zag", version, dir: __dirname }); diff --git a/plugins/absorbers/.eslintignore b/plugins/absorbers/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/absorbers/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/absorbers/.eslintrc.js b/plugins/absorbers/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/absorbers/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/absorbers/CHANGELOG.md b/plugins/absorbers/CHANGELOG.md index 7a7d1e152ac..8e70565f872 100644 --- a/plugins/absorbers/CHANGELOG.md +++ b/plugins/absorbers/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-absorbers diff --git a/plugins/absorbers/eslint.config.js b/plugins/absorbers/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/absorbers/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/absorbers/package.dist.json b/plugins/absorbers/package.dist.json index 406b6ae60e6..c8ca582356d 100644 --- a/plugins/absorbers/package.dist.json +++ b/plugins/absorbers/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-absorbers", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles absorbers plugin", "homepage": "https://particles.js.org", "repository": { @@ -86,9 +86,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/absorbers/package.json b/plugins/absorbers/package.json index 7cb7a787833..01718e3eb8e 100644 --- a/plugins/absorbers/package.json +++ b/plugins/absorbers/package.json @@ -1,104 +1,105 @@ { - "name": "@tsparticles/plugin-absorbers", - "version": "3.9.1", - "description": "tsParticles absorbers plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-absorbers", + "version": "4.0.0-alpha.0", + "description": "tsParticles absorbers plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/absorbers" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/absorbers" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/absorbers/src/AbsorberInstance.ts b/plugins/absorbers/src/AbsorberInstance.ts index c12f4267ea8..4c6e651c0e3 100644 --- a/plugins/absorbers/src/AbsorberInstance.ts +++ b/plugins/absorbers/src/AbsorberInstance.ts @@ -20,7 +20,6 @@ import { rangeColorToRgb, } from "@tsparticles/engine"; import { Absorber } from "./Options/Classes/Absorber.js"; -import type { Absorbers } from "./Absorbers.js"; import type { IAbsorber } from "./Options/Interfaces/IAbsorber.js"; import type { IAbsorberSizeLimit } from "./Options/Interfaces/IAbsorberSizeLimit.js"; @@ -92,7 +91,6 @@ export class AbsorberInstance { */ size; - private readonly _absorbers; private readonly _container; private readonly _engine; @@ -116,20 +114,12 @@ export class AbsorberInstance { /** * The absorber constructor, initializes the absorber based on the given options and position - * @param absorbers - the Absorbers collection manager that will contain this absorber * @param container - the Container engine using the absorber plugin, containing the particles that will interact with this Absorber * @param engine - the Engine instance that will be used for calculating the Absorber interactions * @param options - the Absorber source options * @param position - the Absorber optional position, if not given, it will be searched in options, and if not available also there, a random one will be used */ - constructor( - absorbers: Absorbers, - container: Container, - engine: Engine, - options: RecursivePartial, - position?: ICoordinates, - ) { - this._absorbers = absorbers; + constructor(container: Container, engine: Engine, options: RecursivePartial, position?: ICoordinates) { this._container = container; this._engine = engine; @@ -240,7 +230,7 @@ export class AbsorberInstance { context.beginPath(); context.arc(originPoint.x, originPoint.y, this.size, minAngle, maxAngle, false); context.closePath(); - context.fillStyle = getStyleFromRgb(this.color, this.opacity); + context.fillStyle = getStyleFromRgb(this.color, this._container.hdr, this.opacity); context.fill(); } @@ -309,10 +299,8 @@ export class AbsorberInstance { particle.absorberOrbit.length = minSize * (offset + (getRandom() * randomFactor - randomOffset)); } - if (particle.absorberOrbitDirection === undefined) { - particle.absorberOrbitDirection = - particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise; - } + particle.absorberOrbitDirection ??= + particle.velocity.x >= minVelocity ? RotateDirection.clockwise : RotateDirection.counterClockwise; const orbitRadius = particle.absorberOrbit.length, orbitAngle = particle.absorberOrbit.angle, diff --git a/plugins/absorbers/src/Absorbers.ts b/plugins/absorbers/src/Absorbers.ts index ae369561000..e2c54a8ebf1 100644 --- a/plugins/absorbers/src/Absorbers.ts +++ b/plugins/absorbers/src/Absorbers.ts @@ -9,7 +9,7 @@ import { isNumber, itemFromSingleOrMultiple, } from "@tsparticles/engine"; -import type { Absorber } from "./Options/Classes/Absorber.js"; +import { Absorber } from "./Options/Classes/Absorber.js"; import { AbsorberClickMode } from "./Enums/AbsorberClickMode.js"; import type { AbsorberContainer } from "./AbsorberContainer.js"; import { AbsorberInstance } from "./AbsorberInstance.js"; @@ -46,7 +46,7 @@ export class Absorbers implements IContainerPlugin { } async addAbsorber(options: RecursivePartial, position?: ICoordinates): Promise { - const absorber = new AbsorberInstance(this, this._container, this._engine, options, position); + const absorber = new AbsorberInstance(this._container, this._engine, options, position); this.array.push(absorber); @@ -60,15 +60,13 @@ export class Absorbers implements IContainerPlugin { } handleClickMode(mode: string): void { - const absorberOptions = this.absorbers, - modeAbsorbers = this.interactivityAbsorbers; + const modeAbsorbers = this.interactivityAbsorbers; if (mode === (AbsorberClickMode.absorber as string)) { - const absorbersModeOptions = itemFromSingleOrMultiple(modeAbsorbers), - absorbersOptions = absorbersModeOptions ?? itemFromSingleOrMultiple(absorberOptions), + const absorbersModeOptions = itemFromSingleOrMultiple(modeAbsorbers) ?? new Absorber(), aPosition = this._container.interactivity.mouse.clickPosition; - void this.addAbsorber(absorbersOptions, aPosition); + void this.addAbsorber(absorbersModeOptions, aPosition); } } diff --git a/plugins/absorbers/src/Options/Classes/AbsorberSize.ts b/plugins/absorbers/src/Options/Classes/AbsorberSize.ts index fe12d6d0ffb..c1a397d41c4 100644 --- a/plugins/absorbers/src/Options/Classes/AbsorberSize.ts +++ b/plugins/absorbers/src/Options/Classes/AbsorberSize.ts @@ -13,7 +13,7 @@ export class AbsorberSize extends ValueWithRandom implements IAbsorberSize, IOpt this.limit = new AbsorberSizeLimit(); } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/absorbers/src/index.ts b/plugins/absorbers/src/index.ts index a5464196687..1f9683c62d9 100644 --- a/plugins/absorbers/src/index.ts +++ b/plugins/absorbers/src/index.ts @@ -1,17 +1,19 @@ -import { AbsorbersPlugin } from "./AbsorbersPlugin.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadAbsorbersPlugin(engine: Engine, refresh = true): Promise { +export function loadAbsorbersPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new AbsorbersPlugin(engine), refresh); + engine.register(async e => { + const { AbsorbersPlugin } = await import("./AbsorbersPlugin.js"); + + e.addPlugin(new AbsorbersPlugin(e)); + }); } -export * from "./AbsorberContainer.js"; +export type * from "./AbsorberContainer.js"; export * from "./Enums/AbsorberClickMode.js"; diff --git a/plugins/absorbers/webpack.config.js b/plugins/absorbers/webpack.config.js index 756fa2ee7c2..24f3c36bd0a 100644 --- a/plugins/absorbers/webpack.config.js +++ b/plugins/absorbers/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ moduleName: "absorbers", pluginName: "Absorbers", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "absorbers", pluginName: "Absorbers", version, dir: __dirname }); diff --git a/plugins/colors/hslColor/.browserslistrc b/plugins/backgroundMask/.browserslistrc similarity index 100% rename from plugins/colors/hslColor/.browserslistrc rename to plugins/backgroundMask/.browserslistrc diff --git a/plugins/colors/hexColor/.npmignore b/plugins/backgroundMask/.npmignore similarity index 100% rename from plugins/colors/hexColor/.npmignore rename to plugins/backgroundMask/.npmignore diff --git a/plugins/backgroundMask/CHANGELOG.md b/plugins/backgroundMask/CHANGELOG.md new file mode 100644 index 00000000000..d4fac19f759 --- /dev/null +++ b/plugins/backgroundMask/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) diff --git a/plugins/colors/hslColor/LICENSE b/plugins/backgroundMask/LICENSE similarity index 100% rename from plugins/colors/hslColor/LICENSE rename to plugins/backgroundMask/LICENSE diff --git a/plugins/backgroundMask/README.md b/plugins/backgroundMask/README.md new file mode 100644 index 00000000000..02f87ca8a76 --- /dev/null +++ b/plugins/backgroundMask/README.md @@ -0,0 +1,74 @@ +[![banner](https://particles.js.org/images/banner2.png)](https://particles.js.org) + +# tsParticles Background Mask Plugin + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/plugin-background-mask/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/plugin-background-mask) +[![npmjs](https://badge.fury.io/js/@tsparticles/plugin-background-mask.svg)](https://www.npmjs.com/package/@tsparticles/plugin-background-mask) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/plugin-background-mask)](https://www.npmjs.com/package/@tsparticles/plugin-background-mask) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) plugin for handling background mask feature. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.plugin.backgroundMask.min.js` file will export the function to load the plugin: + +```javascript +loadBackgroundMaskPlugin; +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the plugin like this: + +```javascript +(async () => { + await loadBackgroundMaskPlugin(tsParticles); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/plugin-background-mask +``` + +or + +```shell +$ yarn add @tsparticles/plugin-background-mask +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadBackgroundMaskPlugin } = require("@tsparticles/plugin-background-mask"); + +(async () => { + await loadBackgroundMaskPlugin(tsParticles); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadBackgroundMaskPlugin } from "@tsparticles/plugin-background-mask"; + +(async () => { + await loadBackgroundMaskPlugin(tsParticles); +})(); +``` diff --git a/plugins/backgroundMask/eslint.config.js b/plugins/backgroundMask/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/backgroundMask/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/backgroundMask/package.dist.json b/plugins/backgroundMask/package.dist.json new file mode 100644 index 00000000000..dec11784bc3 --- /dev/null +++ b/plugins/backgroundMask/package.dist.json @@ -0,0 +1,95 @@ +{ + "name": "@tsparticles/plugin-background-mask", + "version": "4.0.0-alpha.0", + "description": "tsParticles background mask plugin", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/backgroundMask" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "sideEffects": false, + "jsdelivr": "tsparticles.plugin.background-mask.min.js", + "unpkg": "tsparticles.plugin.background-mask.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module" +} diff --git a/plugins/backgroundMask/package.json b/plugins/backgroundMask/package.json new file mode 100644 index 00000000000..de5f6b400ad --- /dev/null +++ b/plugins/backgroundMask/package.json @@ -0,0 +1,105 @@ +{ + "name": "@tsparticles/plugin-background-mask", + "version": "4.0.0-alpha.0", + "description": "tsParticles background mask plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/backgroundMask" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/backgroundMask/src/BackgroundMaskInstance.ts b/plugins/backgroundMask/src/BackgroundMaskInstance.ts new file mode 100644 index 00000000000..b8d3ddf4073 --- /dev/null +++ b/plugins/backgroundMask/src/BackgroundMaskInstance.ts @@ -0,0 +1,115 @@ +import { + type Engine, + type IContainerPlugin, + getLogger, + getStyleFromRgb, + rangeColorToRgb, + safeDocument, +} from "@tsparticles/engine"; +import type { BackgroundMaskContainer } from "./types.js"; + +export class BackgroundMaskInstance implements IContainerPlugin { + private readonly _container; + private _coverColorStyle?: string; + private _coverImage?: { image: HTMLImageElement; opacity: number }; + private _defaultCompositeValue?: GlobalCompositeOperation; + private readonly _engine; + + constructor(container: BackgroundMaskContainer, engine: Engine) { + this._container = container; + this._engine = engine; + } + + canvasClear(): boolean { + const backgroundMask = this._container.actualOptions.backgroundMask; + + if (!backgroundMask?.enable) { + return false; + } + + return this.canvasPaint(); + } + + canvasPaint(): boolean { + if (!this._container.actualOptions.backgroundMask?.enable) { + return false; + } + + const canvas = this._container.canvas; + + canvas.canvasClear(); + + if (this._coverImage) { + canvas.paintImage(this._coverImage.image, this._coverImage.opacity); + } else { + canvas.paintBase(this._coverColorStyle); + } + + return true; + } + + clearDraw(context: CanvasRenderingContext2D): void { + if (!this._defaultCompositeValue) { + return; + } + + context.globalCompositeOperation = this._defaultCompositeValue; + } + + draw(context: CanvasRenderingContext2D): void { + const previousComposite = context.globalCompositeOperation, + backgroundMask = this._container.actualOptions.backgroundMask; + + this._defaultCompositeValue = previousComposite; + + context.globalCompositeOperation = backgroundMask?.enable ? backgroundMask.composite : previousComposite; + } + + async init(): Promise { + await this._initCover(); + } + + private readonly _initCover = async (): Promise => { + const options = this._container.actualOptions, + cover = options.backgroundMask?.cover, + color = cover?.color; + + if (color) { + const coverRgb = rangeColorToRgb(this._engine, color); + + if (coverRgb) { + const coverColor = { + ...coverRgb, + a: cover.opacity, + }; + + this._coverColorStyle = getStyleFromRgb(coverColor, this._container.hdr, coverColor.a); + } + } else { + await new Promise((resolve, reject) => { + if (!cover?.image) { + return; + } + + const img = safeDocument().createElement("img"); + + img.addEventListener("load", () => { + this._coverImage = { + image: img, + opacity: cover.opacity, + }; + + resolve(); + }); + + img.addEventListener("error", evt => { + getLogger().error(evt); + + reject(new Error("Error loading image")); + }); + + img.src = cover.image; + }); + } + }; +} diff --git a/plugins/backgroundMask/src/BackgroundMaskPlugin.ts b/plugins/backgroundMask/src/BackgroundMaskPlugin.ts new file mode 100644 index 00000000000..93dd4225e76 --- /dev/null +++ b/plugins/backgroundMask/src/BackgroundMaskPlugin.ts @@ -0,0 +1,40 @@ +import type { BackgroundMaskOptions, IBackgroundMaskOptions } from "./types.js"; +import type { Container, Engine, IPlugin, RecursivePartial } from "@tsparticles/engine"; +import { BackgroundMask } from "./Options/Classes/BackgroundMask.js"; +import { BackgroundMaskInstance } from "./BackgroundMaskInstance.js"; + +/** + */ +export class BackgroundMaskPlugin implements IPlugin { + readonly id; + + private readonly _engine; + + constructor(engine: Engine) { + this.id = "background-mask"; + + this._engine = engine; + } + + getPlugin(container: Container): Promise { + return Promise.resolve(new BackgroundMaskInstance(container, this._engine)); + } + + loadOptions(options: BackgroundMaskOptions, source?: RecursivePartial): void { + if (!this.needsPlugin()) { + return; + } + + let backgroundMaskOptions = options.backgroundMask; + + if (!backgroundMaskOptions?.load) { + options.backgroundMask = backgroundMaskOptions = new BackgroundMask(); + } + + backgroundMaskOptions.load(source?.backgroundMask); + } + + needsPlugin(): boolean { + return true; + } +} diff --git a/engine/src/Options/Classes/BackgroundMask/BackgroundMask.ts b/plugins/backgroundMask/src/Options/Classes/BackgroundMask.ts similarity index 74% rename from engine/src/Options/Classes/BackgroundMask/BackgroundMask.ts rename to plugins/backgroundMask/src/Options/Classes/BackgroundMask.ts index 7bdbd01cd97..37fbea72d78 100644 --- a/engine/src/Options/Classes/BackgroundMask/BackgroundMask.ts +++ b/plugins/backgroundMask/src/Options/Classes/BackgroundMask.ts @@ -1,10 +1,7 @@ -import { isNull, isString } from "../../../Utils/TypeUtils.js"; +import { type IColor, type IOptionLoader, type RecursivePartial, isNull, isString } from "@tsparticles/engine"; import { BackgroundMaskCover } from "./BackgroundMaskCover.js"; -import type { IBackgroundMask } from "../../Interfaces/BackgroundMask/IBackgroundMask.js"; -import type { IBackgroundMaskCover } from "../../Interfaces/BackgroundMask/IBackgroundMaskCover.js"; -import type { IColor } from "../../../Core/Interfaces/Colors.js"; -import type { IOptionLoader } from "../../Interfaces/IOptionLoader.js"; -import type { RecursivePartial } from "../../../Types/RecursivePartial.js"; +import type { IBackgroundMask } from "../Interfaces/IBackgroundMask.js"; +import type { IBackgroundMaskCover } from "../Interfaces/IBackgroundMaskCover.js"; /** * [[include:Options/BackgroundMask.md]] diff --git a/engine/src/Options/Classes/BackgroundMask/BackgroundMaskCover.ts b/plugins/backgroundMask/src/Options/Classes/BackgroundMaskCover.ts similarity index 58% rename from engine/src/Options/Classes/BackgroundMask/BackgroundMaskCover.ts rename to plugins/backgroundMask/src/Options/Classes/BackgroundMaskCover.ts index d7104fa8768..9ec795adaa8 100644 --- a/engine/src/Options/Classes/BackgroundMask/BackgroundMaskCover.ts +++ b/plugins/backgroundMask/src/Options/Classes/BackgroundMaskCover.ts @@ -1,8 +1,5 @@ -import type { IBackgroundMaskCover } from "../../Interfaces/BackgroundMask/IBackgroundMaskCover.js"; -import type { IOptionLoader } from "../../Interfaces/IOptionLoader.js"; -import { OptionsColor } from "../OptionsColor.js"; -import type { RecursivePartial } from "../../../Types/RecursivePartial.js"; -import { isNull } from "../../../Utils/TypeUtils.js"; +import { type IOptionLoader, OptionsColor, type RecursivePartial, isNull } from "@tsparticles/engine"; +import type { IBackgroundMaskCover } from "../Interfaces/IBackgroundMaskCover.js"; /** */ @@ -15,7 +12,7 @@ export class BackgroundMaskCover implements IBackgroundMaskCover, IOptionLoader< this.opacity = 1; } - load(data?: RecursivePartial | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/engine/src/Options/Interfaces/BackgroundMask/IBackgroundMask.ts b/plugins/backgroundMask/src/Options/Interfaces/IBackgroundMask.ts similarity index 89% rename from engine/src/Options/Interfaces/BackgroundMask/IBackgroundMask.ts rename to plugins/backgroundMask/src/Options/Interfaces/IBackgroundMask.ts index 404298a0cb9..a62ea40dcb9 100644 --- a/engine/src/Options/Interfaces/BackgroundMask/IBackgroundMask.ts +++ b/plugins/backgroundMask/src/Options/Interfaces/IBackgroundMask.ts @@ -1,6 +1,5 @@ +import type { IColor, RecursivePartial } from "@tsparticles/engine"; import type { IBackgroundMaskCover } from "./IBackgroundMaskCover.js"; -import type { IColor } from "../../../Core/Interfaces/Colors.js"; -import type { RecursivePartial } from "../../../Types/RecursivePartial.js"; /** * The options to apply a base color to canvas to cover what's behind diff --git a/engine/src/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.ts b/plugins/backgroundMask/src/Options/Interfaces/IBackgroundMaskCover.ts similarity index 87% rename from engine/src/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.ts rename to plugins/backgroundMask/src/Options/Interfaces/IBackgroundMaskCover.ts index 89715901ba6..44ce1a00400 100644 --- a/engine/src/Options/Interfaces/BackgroundMask/IBackgroundMaskCover.ts +++ b/plugins/backgroundMask/src/Options/Interfaces/IBackgroundMaskCover.ts @@ -1,4 +1,4 @@ -import type { IOptionsColor } from "../IOptionsColor.js"; +import type { IOptionsColor } from "@tsparticles/engine"; /** * The background cover customization diff --git a/plugins/backgroundMask/src/index.ts b/plugins/backgroundMask/src/index.ts new file mode 100644 index 00000000000..13c89d62d9b --- /dev/null +++ b/plugins/backgroundMask/src/index.ts @@ -0,0 +1,16 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * @param engine - The engine instance + */ +export function loadBackgroundMaskPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { BackgroundMaskPlugin } = await import("./BackgroundMaskPlugin.js"); + + e.addPlugin(new BackgroundMaskPlugin(e)); + }); +} diff --git a/plugins/backgroundMask/src/types.ts b/plugins/backgroundMask/src/types.ts new file mode 100644 index 00000000000..d8bc7801e3c --- /dev/null +++ b/plugins/backgroundMask/src/types.ts @@ -0,0 +1,15 @@ +import type { Container, IOptions, Options } from "@tsparticles/engine"; +import type { BackgroundMask } from "./Options/Classes/BackgroundMask.js"; +import type { IBackgroundMask } from "./Options/Interfaces/IBackgroundMask.js"; + +export type IBackgroundMaskOptions = IOptions & { + backgroundMask?: IBackgroundMask; +}; + +export type BackgroundMaskOptions = Options & { + backgroundMask?: BackgroundMask; +}; + +export type BackgroundMaskContainer = Container & { + actualOptions: BackgroundMaskOptions; +}; diff --git a/plugins/colors/hslColor/tsconfig.base.json b/plugins/backgroundMask/tsconfig.base.json similarity index 100% rename from plugins/colors/hslColor/tsconfig.base.json rename to plugins/backgroundMask/tsconfig.base.json diff --git a/plugins/colors/hslColor/tsconfig.browser.json b/plugins/backgroundMask/tsconfig.browser.json similarity index 100% rename from plugins/colors/hslColor/tsconfig.browser.json rename to plugins/backgroundMask/tsconfig.browser.json diff --git a/plugins/colors/hslColor/tsconfig.json b/plugins/backgroundMask/tsconfig.json similarity index 100% rename from plugins/colors/hslColor/tsconfig.json rename to plugins/backgroundMask/tsconfig.json diff --git a/plugins/colors/hslColor/tsconfig.module.json b/plugins/backgroundMask/tsconfig.module.json similarity index 100% rename from plugins/colors/hslColor/tsconfig.module.json rename to plugins/backgroundMask/tsconfig.module.json diff --git a/plugins/colors/hslColor/tsconfig.types.json b/plugins/backgroundMask/tsconfig.types.json similarity index 100% rename from plugins/colors/hslColor/tsconfig.types.json rename to plugins/backgroundMask/tsconfig.types.json diff --git a/plugins/colors/hslColor/tsconfig.umd.json b/plugins/backgroundMask/tsconfig.umd.json similarity index 100% rename from plugins/colors/hslColor/tsconfig.umd.json rename to plugins/backgroundMask/tsconfig.umd.json diff --git a/plugins/backgroundMask/typedoc.json b/plugins/backgroundMask/typedoc.json new file mode 100644 index 00000000000..bf605918669 --- /dev/null +++ b/plugins/backgroundMask/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles Background Mask Plugin", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/plugins/backgroundMask/webpack.config.js b/plugins/backgroundMask/webpack.config.js new file mode 100644 index 00000000000..9e0c7274ad3 --- /dev/null +++ b/plugins/backgroundMask/webpack.config.js @@ -0,0 +1,12 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "background-mask", pluginName: "Background Mask", version, dir: __dirname }); diff --git a/plugins/canvasMask/.eslintignore b/plugins/canvasMask/.eslintignore deleted file mode 100644 index 43b53119167..00000000000 --- a/plugins/canvasMask/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -src/pathseg.* diff --git a/plugins/canvasMask/.eslintrc.js b/plugins/canvasMask/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/canvasMask/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/canvasMask/CHANGELOG.md b/plugins/canvasMask/CHANGELOG.md index b88b388e5bc..376138d66ed 100644 --- a/plugins/canvasMask/CHANGELOG.md +++ b/plugins/canvasMask/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-canvas-mask + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-canvas-mask diff --git a/plugins/canvasMask/eslint.config.js b/plugins/canvasMask/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/canvasMask/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/canvasMask/package.dist.json b/plugins/canvasMask/package.dist.json index 6a8001e2d5f..89c7b307425 100644 --- a/plugins/canvasMask/package.dist.json +++ b/plugins/canvasMask/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-canvas-mask", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles canvas mask plugin", "homepage": "https://particles.js.org", "repository": { @@ -86,9 +86,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/canvasMask/package.json b/plugins/canvasMask/package.json index c56f91f195e..e6a9dcece60 100644 --- a/plugins/canvasMask/package.json +++ b/plugins/canvasMask/package.json @@ -1,104 +1,105 @@ { - "name": "@tsparticles/plugin-canvas-mask", - "version": "3.9.1", - "description": "tsParticles canvas mask plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-canvas-mask", + "version": "4.0.0-alpha.0", + "description": "tsParticles canvas mask plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/canvasMask" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/canvasMask" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/canvasMask/src/CanvasMaskInstance.ts b/plugins/canvasMask/src/CanvasMaskInstance.ts index 1814565a058..d12f30ebbc3 100644 --- a/plugins/canvasMask/src/CanvasMaskInstance.ts +++ b/plugins/canvasMask/src/CanvasMaskInstance.ts @@ -5,7 +5,7 @@ import { getImageData, getTextData, } from "./utils.js"; -import { type IContainerPlugin, isNull } from "@tsparticles/engine"; +import { type IContainerPlugin, isNull, safeDocument } from "@tsparticles/engine"; import type { CanvasMaskContainer } from "./types.js"; export class CanvasMaskInstance implements IContainerPlugin { @@ -51,7 +51,8 @@ export class CanvasMaskInstance implements IContainerPlugin { pixelData = data; } else if (options.element ?? options.selector) { const canvas = - options.element ?? (options.selector && document.querySelector(options.selector)); + options.element ?? + (options.selector && safeDocument().querySelector(options.selector)); if (!canvas) { return; diff --git a/plugins/canvasMask/src/Options/Classes/CanvasMask.ts b/plugins/canvasMask/src/Options/Classes/CanvasMask.ts index 409bc2360db..b72bf542912 100644 --- a/plugins/canvasMask/src/Options/Classes/CanvasMask.ts +++ b/plugins/canvasMask/src/Options/Classes/CanvasMask.ts @@ -44,9 +44,7 @@ export class CanvasMask implements ICanvasMask, IOptionLoader { } if (data.image) { - if (!this.image) { - this.image = new ImageMask(); - } + this.image ??= new ImageMask(); this.image.load(data.image); } @@ -71,9 +69,7 @@ export class CanvasMask implements ICanvasMask, IOptionLoader { } if (data.text) { - if (!this.text) { - this.text = new TextMask(); - } + this.text ??= new TextMask(); this.text.load(data.text); } diff --git a/plugins/canvasMask/src/Options/Classes/CanvasMaskPixels.ts b/plugins/canvasMask/src/Options/Classes/CanvasMaskPixels.ts index 72909a85dc2..c625dc9c20b 100644 --- a/plugins/canvasMask/src/Options/Classes/CanvasMaskPixels.ts +++ b/plugins/canvasMask/src/Options/Classes/CanvasMaskPixels.ts @@ -19,15 +19,15 @@ export class CanvasMaskPixels implements ICanvasMaskPixels, IOptionLoader | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } if (data.filter !== undefined) { if (isString(data.filter)) { - if (Object.hasOwn(window, data.filter)) { - const filter = (window as unknown as Record boolean>)[data.filter]; + if (Object.hasOwn(globalThis, data.filter)) { + const filter = (globalThis as unknown as Record boolean>)[data.filter]; if (isFunction(filter)) { this.filter = filter; diff --git a/plugins/canvasMask/src/Options/Classes/FontTextMask.ts b/plugins/canvasMask/src/Options/Classes/FontTextMask.ts index 13a51d365a7..45de999fd75 100644 --- a/plugins/canvasMask/src/Options/Classes/FontTextMask.ts +++ b/plugins/canvasMask/src/Options/Classes/FontTextMask.ts @@ -13,7 +13,7 @@ export class FontTextMask implements IFontTextMask, IOptionLoader this.size = 100; } - load(data?: RecursivePartial | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/canvasMask/src/Options/Classes/TextMaskLine.ts b/plugins/canvasMask/src/Options/Classes/TextMaskLine.ts index 471422d1718..95f265a8527 100644 --- a/plugins/canvasMask/src/Options/Classes/TextMaskLine.ts +++ b/plugins/canvasMask/src/Options/Classes/TextMaskLine.ts @@ -10,7 +10,7 @@ export class TextMaskLine implements ITextMaskLine, IOptionLoader this.spacing = 10; } - load(data?: RecursivePartial | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/canvasMask/src/index.ts b/plugins/canvasMask/src/index.ts index 8974e9644df..e5e1abf799d 100644 --- a/plugins/canvasMask/src/index.ts +++ b/plugins/canvasMask/src/index.ts @@ -1,14 +1,16 @@ -import { CanvasMaskPlugin } from "./CanvasMaskPlugin.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadCanvasMaskPlugin(engine: Engine, refresh = true): Promise { +export function loadCanvasMaskPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new CanvasMaskPlugin(), refresh); + engine.register(async e => { + const { CanvasMaskPlugin } = await import("./CanvasMaskPlugin.js"); + + e.addPlugin(new CanvasMaskPlugin()); + }); } diff --git a/plugins/canvasMask/src/utils.ts b/plugins/canvasMask/src/utils.ts index 671be4fcbfb..6a97c99b76e 100644 --- a/plugins/canvasMask/src/utils.ts +++ b/plugins/canvasMask/src/utils.ts @@ -5,10 +5,10 @@ import { type IParticlesOptions, type IRgba, type RecursivePartial, - errorPrefix, getRandom, isNumber, percentDenominator, + safeDocument, } from "@tsparticles/engine"; import type { ICanvasMaskOverride } from "./Options/Interfaces/ICanvasMaskOverride.js"; import type { TextMask } from "./Options/Classes/TextMask.js"; @@ -18,7 +18,9 @@ const half = 0.5, x: 0, y: 0, }, - defaultWidth = 0; + defaultWidth = 0, + defaultRgb = 0, + defaultAlpha = 1; export interface CanvasPixelData { height: number; @@ -69,8 +71,19 @@ export function addParticlesFromCanvasPixels( x: nextIndex % width, y: Math.floor(nextIndex / width), }, - pixel = data.pixels[pixelPos.y][pixelPos.x], - shouldCreateParticle = filter(pixel); + row = data.pixels[pixelPos.y]; + + if (!row) { + continue; + } + + const pixel = row[pixelPos.x]; + + if (!pixel) { + continue; + } + + const shouldCreateParticle = filter(pixel); if (!shouldCreateParticle) { continue; @@ -128,9 +141,7 @@ export function getCanvasImageData( y: Math.floor(idx / size.width), }; - if (!pixels[pos.y]) { - pixels[pos.y] = []; - } + pixels[pos.y] ??= []; const indexesOffset = { r: 0, @@ -138,13 +149,18 @@ export function getCanvasImageData( b: 2, a: 3, }, - alphaFactor = 255; + alphaFactor = 255, + row = pixels[pos.y]; - pixels[pos.y][pos.x] = { - r: imageData[i + indexesOffset.r], - g: imageData[i + indexesOffset.g], - b: imageData[i + indexesOffset.b], - a: imageData[i + indexesOffset.a] / alphaFactor, + if (!row) { + continue; + } + + row[pos.x] = { + r: imageData[i + indexesOffset.r] ?? defaultRgb, + g: imageData[i + indexesOffset.g] ?? defaultRgb, + b: imageData[i + indexesOffset.b] ?? defaultRgb, + a: (imageData[i + indexesOffset.a] ?? defaultAlpha) / alphaFactor, }; } @@ -168,7 +184,7 @@ export function getImageData(src: string, offset: number): Promise((resolve, reject) => { image.onerror = reject; image.onload = (): void => { - const canvas = document.createElement("canvas"); + const canvas = safeDocument().createElement("canvas"); canvas.width = image.width; canvas.height = image.height; @@ -176,7 +192,8 @@ export function getImageData(src: string, offset: number): Promise(array: T[]): T[] { minIndex = 0; for (let currentIndex = array.length - lengthOffset; currentIndex >= minIndex; currentIndex--) { - const randomIndex = Math.floor(getRandom() * currentIndex); + const randomIndex = Math.floor(getRandom() * currentIndex), + currentItem = array[currentIndex], + randomItem = array[randomIndex]; + + if (randomItem === currentItem) { + continue; + } + + if (randomItem === undefined || currentItem === undefined) { + continue; + } - [array[currentIndex], array[randomIndex]] = [array[randomIndex], array[currentIndex]]; + array[currentIndex] = randomItem; + array[randomIndex] = currentItem; } return array; diff --git a/plugins/canvasMask/webpack.config.js b/plugins/canvasMask/webpack.config.js index c10a3700c12..dd3bad58086 100644 --- a/plugins/canvasMask/webpack.config.js +++ b/plugins/canvasMask/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ moduleName: "canvas-mask", pluginName: "Canvas Mask", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "canvas-mask", pluginName: "Canvas Mask", version, dir: __dirname }); diff --git a/plugins/colors/hsvColor/.browserslistrc b/plugins/colors/hex/.browserslistrc similarity index 100% rename from plugins/colors/hsvColor/.browserslistrc rename to plugins/colors/hex/.browserslistrc diff --git a/plugins/colors/hslColor/.npmignore b/plugins/colors/hex/.npmignore similarity index 100% rename from plugins/colors/hslColor/.npmignore rename to plugins/colors/hex/.npmignore diff --git a/plugins/colors/hexColor/CHANGELOG.md b/plugins/colors/hex/CHANGELOG.md similarity index 88% rename from plugins/colors/hexColor/CHANGELOG.md rename to plugins/colors/hex/CHANGELOG.md index fba42360a04..a019a44ef70 100644 --- a/plugins/colors/hexColor/CHANGELOG.md +++ b/plugins/colors/hex/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-hex-color + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-hex-color diff --git a/plugins/colors/hsvColor/LICENSE b/plugins/colors/hex/LICENSE similarity index 100% rename from plugins/colors/hsvColor/LICENSE rename to plugins/colors/hex/LICENSE diff --git a/plugins/colors/hexColor/README.md b/plugins/colors/hex/README.md similarity index 100% rename from plugins/colors/hexColor/README.md rename to plugins/colors/hex/README.md diff --git a/plugins/colors/hex/eslint.config.js b/plugins/colors/hex/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/hex/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/hexColor/package.dist.json b/plugins/colors/hex/package.dist.json similarity index 95% rename from plugins/colors/hexColor/package.dist.json rename to plugins/colors/hex/package.dist.json index 62ccd384171..eeaa2bc34c5 100644 --- a/plugins/colors/hexColor/package.dist.json +++ b/plugins/colors/hex/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-hex-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles hex color plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/colors/hex/package.json b/plugins/colors/hex/package.json new file mode 100644 index 00000000000..8f52fd235db --- /dev/null +++ b/plugins/colors/hex/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-hex-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles hex color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/hex" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/hexColor/src/HexColorManager.ts b/plugins/colors/hex/src/HexColorManager.ts similarity index 70% rename from plugins/colors/hexColor/src/HexColorManager.ts rename to plugins/colors/hex/src/HexColorManager.ts index 63f706ca4e4..455f25f405b 100644 --- a/plugins/colors/hexColor/src/HexColorManager.ts +++ b/plugins/colors/hex/src/HexColorManager.ts @@ -23,11 +23,13 @@ const shorthandHexRegex = /^#?([a-f\d])([a-f\d])([a-f\d])([a-f\d])?$/i, */ export class HexColorManager implements IColorManager { readonly key; - readonly stringPrefix; constructor() { this.key = "hex"; - this.stringPrefix = "#"; + } + + accepts(input: string): boolean { + return input.startsWith("#"); } handleColor(color: IColor): IRgb | undefined { @@ -43,28 +45,21 @@ export class HexColorManager implements IColorManager { } private _parseString(hexColor: unknown): IRgba | undefined { - if (typeof hexColor !== "string") { - return; - } - - if (!hexColor?.startsWith(this.stringPrefix)) { + if (typeof hexColor !== "string" || !this.accepts(hexColor)) { return; } - const hexFixed = hexColor.replace(shorthandHexRegex, (_, r: string, g: string, b: string, a: string) => { + const hexFixed = hexColor.replace(shorthandHexRegex, (_, r: string, g: string, b: string, a?: string) => { return r + r + g + g + b + b + (a !== undefined ? a + a : ""); }), result = hexRegex.exec(hexFixed); return result ? { - a: - result[RgbIndexes.a] !== undefined - ? parseInt(result[RgbIndexes.a], hexRadix) / alphaFactor - : defaultAlpha, - b: parseInt(result[RgbIndexes.b], hexRadix), - g: parseInt(result[RgbIndexes.g], hexRadix), - r: parseInt(result[RgbIndexes.r], hexRadix), + a: result[RgbIndexes.a] ? parseInt(result[RgbIndexes.a], hexRadix) / alphaFactor : defaultAlpha, + b: parseInt(result[RgbIndexes.b] ?? "0", hexRadix), + g: parseInt(result[RgbIndexes.g] ?? "0", hexRadix), + r: parseInt(result[RgbIndexes.r] ?? "0", hexRadix), } : undefined; } diff --git a/plugins/colors/hex/src/index.ts b/plugins/colors/hex/src/index.ts new file mode 100644 index 00000000000..a13a94c739a --- /dev/null +++ b/plugins/colors/hex/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the hex color plugin + * @param engine - The engine that will use the plugin + */ +export function loadHexColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { HexColorManager } = await import("./HexColorManager.js"); + + e.addColorManager(new HexColorManager()); + }); +} diff --git a/plugins/colors/hsvColor/tsconfig.base.json b/plugins/colors/hex/tsconfig.base.json similarity index 100% rename from plugins/colors/hsvColor/tsconfig.base.json rename to plugins/colors/hex/tsconfig.base.json diff --git a/plugins/colors/hsvColor/tsconfig.browser.json b/plugins/colors/hex/tsconfig.browser.json similarity index 100% rename from plugins/colors/hsvColor/tsconfig.browser.json rename to plugins/colors/hex/tsconfig.browser.json diff --git a/plugins/colors/hsvColor/tsconfig.json b/plugins/colors/hex/tsconfig.json similarity index 100% rename from plugins/colors/hsvColor/tsconfig.json rename to plugins/colors/hex/tsconfig.json diff --git a/plugins/colors/hsvColor/tsconfig.module.json b/plugins/colors/hex/tsconfig.module.json similarity index 100% rename from plugins/colors/hsvColor/tsconfig.module.json rename to plugins/colors/hex/tsconfig.module.json diff --git a/plugins/colors/hsvColor/tsconfig.types.json b/plugins/colors/hex/tsconfig.types.json similarity index 100% rename from plugins/colors/hsvColor/tsconfig.types.json rename to plugins/colors/hex/tsconfig.types.json diff --git a/plugins/colors/hsvColor/tsconfig.umd.json b/plugins/colors/hex/tsconfig.umd.json similarity index 100% rename from plugins/colors/hsvColor/tsconfig.umd.json rename to plugins/colors/hex/tsconfig.umd.json diff --git a/plugins/colors/hexColor/typedoc.json b/plugins/colors/hex/typedoc.json similarity index 100% rename from plugins/colors/hexColor/typedoc.json rename to plugins/colors/hex/typedoc.json diff --git a/plugins/colors/hex/webpack.config.js b/plugins/colors/hex/webpack.config.js new file mode 100644 index 00000000000..4c4462df0ff --- /dev/null +++ b/plugins/colors/hex/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "hexColor", + pluginName: "Hex Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/hexColor/.eslintignore b/plugins/colors/hexColor/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/colors/hexColor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/colors/hexColor/.eslintrc.js b/plugins/colors/hexColor/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/colors/hexColor/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/colors/hexColor/package.json b/plugins/colors/hexColor/package.json deleted file mode 100644 index b9ad8314c7c..00000000000 --- a/plugins/colors/hexColor/package.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "name": "@tsparticles/plugin-hex-color", - "version": "3.9.1", - "description": "tsParticles hex color plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/colors/hexColor" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } -} diff --git a/plugins/colors/hexColor/src/index.ts b/plugins/colors/hexColor/src/index.ts deleted file mode 100644 index eca8ae3441c..00000000000 --- a/plugins/colors/hexColor/src/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { type Engine } from "@tsparticles/engine"; -import { HexColorManager } from "./HexColorManager.js"; - -declare const __VERSION__: string; - -/** - * This function is used to load the hex color plugin - * @param engine - The engine that will use the plugin - * @param refresh - If the engine should be refreshed after the plugin is loaded - * @returns A promise that resolves when the plugin is loaded - */ -export async function loadHexColorPlugin(engine: Engine, refresh = true): Promise { - engine.checkVersion(__VERSION__); - - await engine.addColorManager(new HexColorManager(), refresh); -} diff --git a/plugins/colors/hexColor/webpack.config.js b/plugins/colors/hexColor/webpack.config.js deleted file mode 100644 index 6204209515f..00000000000 --- a/plugins/colors/hexColor/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; - -module.exports = loadParticlesPlugin({ - moduleName: "hexColor", - pluginName: "Hex Color", - version, - dir: __dirname, -}); diff --git a/plugins/colors/namedColor/.browserslistrc b/plugins/colors/hsl/.browserslistrc similarity index 100% rename from plugins/colors/namedColor/.browserslistrc rename to plugins/colors/hsl/.browserslistrc diff --git a/plugins/colors/hsvColor/.npmignore b/plugins/colors/hsl/.npmignore similarity index 100% rename from plugins/colors/hsvColor/.npmignore rename to plugins/colors/hsl/.npmignore diff --git a/plugins/colors/hslColor/CHANGELOG.md b/plugins/colors/hsl/CHANGELOG.md similarity index 88% rename from plugins/colors/hslColor/CHANGELOG.md rename to plugins/colors/hsl/CHANGELOG.md index 7228aa8b120..8b3867ee280 100644 --- a/plugins/colors/hslColor/CHANGELOG.md +++ b/plugins/colors/hsl/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-hsl-color + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-hsl-color diff --git a/plugins/colors/namedColor/LICENSE b/plugins/colors/hsl/LICENSE similarity index 100% rename from plugins/colors/namedColor/LICENSE rename to plugins/colors/hsl/LICENSE diff --git a/plugins/colors/hslColor/README.md b/plugins/colors/hsl/README.md similarity index 100% rename from plugins/colors/hslColor/README.md rename to plugins/colors/hsl/README.md diff --git a/plugins/colors/hsl/eslint.config.js b/plugins/colors/hsl/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/hsl/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/hslColor/package.dist.json b/plugins/colors/hsl/package.dist.json similarity index 95% rename from plugins/colors/hslColor/package.dist.json rename to plugins/colors/hsl/package.dist.json index 9ac5295b06e..aa88a077761 100644 --- a/plugins/colors/hslColor/package.dist.json +++ b/plugins/colors/hsl/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-hsl-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles HSL color plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/colors/hsl/package.json b/plugins/colors/hsl/package.json new file mode 100644 index 00000000000..ba220a5d598 --- /dev/null +++ b/plugins/colors/hsl/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-hsl-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles HSL color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/hsl" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/hslColor/src/HslColorManager.ts b/plugins/colors/hsl/src/HslColorManager.ts similarity index 56% rename from plugins/colors/hslColor/src/HslColorManager.ts rename to plugins/colors/hsl/src/HslColorManager.ts index 277ed306121..3d2197c1f2f 100644 --- a/plugins/colors/hslColor/src/HslColorManager.ts +++ b/plugins/colors/hsl/src/HslColorManager.ts @@ -21,46 +21,53 @@ enum HslIndexes { a = 5, } +const hslRegex = /hsla?\(\s*(\d+)\s*[\s,]\s*(\d+)%\s*[\s,]\s*(\d+)%\s*([\s,]\s*(0|1|0?\.\d+|(\d{1,3})%)\s*)?\)/i; + /** */ export class HslColorManager implements IColorManager { readonly key; - readonly stringPrefix; constructor() { this.key = "hsl"; - this.stringPrefix = "hsl"; + } + + accepts(input: string): boolean { + return input.startsWith("hsl"); } handleColor(color: IColor): IRgb | undefined { const colorValue = color.value as IValueColor, hslColor = colorValue.hsl ?? (color.value as IHsl); - if (hslColor.h !== undefined && hslColor.s !== undefined && hslColor.l !== undefined) { - return hslToRgb(hslColor); + if (!Object.hasOwn(hslColor, "h") && !Object.hasOwn(hslColor, "s") && !Object.hasOwn(hslColor, "l")) { + return; } + + return hslToRgb(hslColor); } handleRangeColor(color: IRangeColor): IRgb | undefined { const colorValue = color.value as IRangeValueColor, hslColor = colorValue.hsl ?? (color.value as IRangeHsl); - if (hslColor.h !== undefined && hslColor.l !== undefined) { - return hslToRgb({ - h: getRangeValue(hslColor.h), - l: getRangeValue(hslColor.l), - s: getRangeValue(hslColor.s), - }); + if (!Object.hasOwn(hslColor, "h") && !Object.hasOwn(hslColor, "s") && !Object.hasOwn(hslColor, "l")) { + return; } + + return hslToRgb({ + h: getRangeValue(hslColor.h), + l: getRangeValue(hslColor.l), + s: getRangeValue(hslColor.s), + }); } parseString(input: string): IRgba | undefined { - if (!input.startsWith("hsl")) { + if (!this.accepts(input)) { return; } - const regex = /hsla?\(\s*(\d+)\s*[\s,]\s*(\d+)%\s*[\s,]\s*(\d+)%\s*([\s,]\s*(0|1|0?\.\d+|(\d{1,3})%)\s*)?\)/i, - result = regex.exec(input), + const result = hslRegex.exec(input), minLength = 4, defaultAlpha = 1, radix = 10; @@ -68,9 +75,9 @@ export class HslColorManager implements IColorManager { return result ? hslaToRgba({ a: result.length > minLength ? parseAlpha(result[HslIndexes.a]) : defaultAlpha, - h: parseInt(result[HslIndexes.h], radix), - l: parseInt(result[HslIndexes.l], radix), - s: parseInt(result[HslIndexes.s], radix), + h: parseInt(result[HslIndexes.h] ?? "0", radix), + l: parseInt(result[HslIndexes.l] ?? "0", radix), + s: parseInt(result[HslIndexes.s] ?? "0", radix), }) : undefined; } diff --git a/plugins/colors/hsl/src/index.ts b/plugins/colors/hsl/src/index.ts new file mode 100644 index 00000000000..359703a1b15 --- /dev/null +++ b/plugins/colors/hsl/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the HSL color plugin + * @param engine - The engine that will use the plugin + */ +export function loadHslColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { HslColorManager } = await import("./HslColorManager.js"); + + e.addColorManager(new HslColorManager()); + }); +} diff --git a/plugins/colors/namedColor/tsconfig.base.json b/plugins/colors/hsl/tsconfig.base.json similarity index 100% rename from plugins/colors/namedColor/tsconfig.base.json rename to plugins/colors/hsl/tsconfig.base.json diff --git a/plugins/colors/namedColor/tsconfig.browser.json b/plugins/colors/hsl/tsconfig.browser.json similarity index 100% rename from plugins/colors/namedColor/tsconfig.browser.json rename to plugins/colors/hsl/tsconfig.browser.json diff --git a/plugins/colors/namedColor/tsconfig.json b/plugins/colors/hsl/tsconfig.json similarity index 100% rename from plugins/colors/namedColor/tsconfig.json rename to plugins/colors/hsl/tsconfig.json diff --git a/plugins/colors/namedColor/tsconfig.module.json b/plugins/colors/hsl/tsconfig.module.json similarity index 100% rename from plugins/colors/namedColor/tsconfig.module.json rename to plugins/colors/hsl/tsconfig.module.json diff --git a/plugins/colors/namedColor/tsconfig.types.json b/plugins/colors/hsl/tsconfig.types.json similarity index 100% rename from plugins/colors/namedColor/tsconfig.types.json rename to plugins/colors/hsl/tsconfig.types.json diff --git a/plugins/colors/namedColor/tsconfig.umd.json b/plugins/colors/hsl/tsconfig.umd.json similarity index 100% rename from plugins/colors/namedColor/tsconfig.umd.json rename to plugins/colors/hsl/tsconfig.umd.json diff --git a/plugins/colors/hslColor/typedoc.json b/plugins/colors/hsl/typedoc.json similarity index 100% rename from plugins/colors/hslColor/typedoc.json rename to plugins/colors/hsl/typedoc.json diff --git a/plugins/colors/hsl/webpack.config.js b/plugins/colors/hsl/webpack.config.js new file mode 100644 index 00000000000..bb35b63b828 --- /dev/null +++ b/plugins/colors/hsl/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "hslColor", + pluginName: "HSL Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/hslColor/.eslintignore b/plugins/colors/hslColor/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/colors/hslColor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/colors/hslColor/.eslintrc.js b/plugins/colors/hslColor/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/colors/hslColor/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/colors/hslColor/package.json b/plugins/colors/hslColor/package.json deleted file mode 100644 index 3fae004582b..00000000000 --- a/plugins/colors/hslColor/package.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "name": "@tsparticles/plugin-hsl-color", - "version": "3.9.1", - "description": "tsParticles HSL color plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/colors/hslColor" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } -} diff --git a/plugins/colors/hslColor/src/index.ts b/plugins/colors/hslColor/src/index.ts deleted file mode 100644 index 0b9b7df72a4..00000000000 --- a/plugins/colors/hslColor/src/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { type Engine } from "@tsparticles/engine"; -import { HslColorManager } from "./HslColorManager.js"; - -declare const __VERSION__: string; - -/** - * This function is used to load the HSL color plugin - * @param engine - The engine that will use the plugin - * @param refresh - If the engine should be refreshed after the plugin is loaded - * @returns A promise that resolves when the plugin is loaded - */ -export async function loadHslColorPlugin(engine: Engine, refresh = true): Promise { - engine.checkVersion(__VERSION__); - - await engine.addColorManager(new HslColorManager(), refresh); -} diff --git a/plugins/colors/hslColor/webpack.config.js b/plugins/colors/hslColor/webpack.config.js deleted file mode 100644 index d3dcd52a184..00000000000 --- a/plugins/colors/hslColor/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; - -module.exports = loadParticlesPlugin({ - moduleName: "hslColor", - pluginName: "HSL Color", - version, - dir: __dirname, -}); diff --git a/plugins/colors/oklchColor/.browserslistrc b/plugins/colors/hsv/.browserslistrc similarity index 100% rename from plugins/colors/oklchColor/.browserslistrc rename to plugins/colors/hsv/.browserslistrc diff --git a/plugins/colors/namedColor/.npmignore b/plugins/colors/hsv/.npmignore similarity index 100% rename from plugins/colors/namedColor/.npmignore rename to plugins/colors/hsv/.npmignore diff --git a/plugins/colors/hsvColor/CHANGELOG.md b/plugins/colors/hsv/CHANGELOG.md similarity index 98% rename from plugins/colors/hsvColor/CHANGELOG.md rename to plugins/colors/hsv/CHANGELOG.md index 80731582374..431056a7594 100644 --- a/plugins/colors/hsvColor/CHANGELOG.md +++ b/plugins/colors/hsv/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-hsv-color diff --git a/plugins/colors/oklchColor/LICENSE b/plugins/colors/hsv/LICENSE similarity index 100% rename from plugins/colors/oklchColor/LICENSE rename to plugins/colors/hsv/LICENSE diff --git a/plugins/colors/hsvColor/README.md b/plugins/colors/hsv/README.md similarity index 100% rename from plugins/colors/hsvColor/README.md rename to plugins/colors/hsv/README.md diff --git a/plugins/colors/hsv/eslint.config.js b/plugins/colors/hsv/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/hsv/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/hsvColor/package.dist.json b/plugins/colors/hsv/package.dist.json similarity index 95% rename from plugins/colors/hsvColor/package.dist.json rename to plugins/colors/hsv/package.dist.json index a812c23aaa5..058357abc0c 100644 --- a/plugins/colors/hsvColor/package.dist.json +++ b/plugins/colors/hsv/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-hsv-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles HSV color plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/colors/hsv/package.json b/plugins/colors/hsv/package.json new file mode 100644 index 00000000000..eb33a7e356b --- /dev/null +++ b/plugins/colors/hsv/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-hsv-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles HSV color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/hsv" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/hsv/src/HsvColorManager.ts b/plugins/colors/hsv/src/HsvColorManager.ts new file mode 100644 index 00000000000..5f28b638ff3 --- /dev/null +++ b/plugins/colors/hsv/src/HsvColorManager.ts @@ -0,0 +1,80 @@ +import { + type IColor, + type IColorManager, + type IHsv, + type IRangeColor, + type IRangeHsv, + type IRangeValueColor, + type IRgb, + type IRgba, + type IValueColor, + getRangeValue, + parseAlpha, +} from "@tsparticles/engine"; +import { hsvToRgb, hsvaToRgba } from "./utils.js"; + +const hsvRegex = /hsva?\(\s*(\d+)°\s*[\s,]\s*(\d+)%\s*[\s,]\s*(\d+)%\s*([\s,]\s*(0|1|0?\.\d+|(\d{1,3})%)\s*)?\)/i; + +export class HsvColorManager implements IColorManager { + readonly key; + + constructor() { + this.key = "hsv"; + } + + accepts(input: string): boolean { + return input.startsWith("hsv"); + } + + handleColor(color: IColor): IRgb | undefined { + const colorValue = color.value as IValueColor, + hsvColor = colorValue.hsv ?? (color.value as IHsv); + + if (!Object.hasOwn(hsvColor, "h") && !Object.hasOwn(hsvColor, "v")) { + return; + } + + return hsvToRgb(hsvColor); + } + + handleRangeColor(color: IRangeColor): IRgb | undefined { + const colorValue = color.value as IRangeValueColor, + hsvColor = colorValue.hsv ?? (color.value as IRangeHsv); + + if (!Object.hasOwn(hsvColor, "h") && !Object.hasOwn(hsvColor, "v")) { + return; + } + + return hsvToRgb({ + h: getRangeValue(hsvColor.h), + s: getRangeValue(hsvColor.s), + v: getRangeValue(hsvColor.v), + }); + } + + parseString(input: string): IRgba | undefined { + if (!this.accepts(input)) { + return; + } + + const result = hsvRegex.exec(input), + fullLength = 4, + indexes = { + h: 1, + s: 2, + v: 3, + a: 5, + }, + defaultAlpha = 1, + radix = 10; + + return result + ? hsvaToRgba({ + a: result.length > fullLength ? parseAlpha(result[indexes.a]) : defaultAlpha, + h: parseInt(result[indexes.h] ?? "0", radix), + s: parseInt(result[indexes.s] ?? "0", radix), + v: parseInt(result[indexes.v] ?? "0", radix), + }) + : undefined; + } +} diff --git a/plugins/colors/hsv/src/index.ts b/plugins/colors/hsv/src/index.ts new file mode 100644 index 00000000000..3aa4036601f --- /dev/null +++ b/plugins/colors/hsv/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the HSV color plugin + * @param engine - The engine that will use the plugin + */ +export function loadHsvColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { HsvColorManager } = await import("./HsvColorManager.js"); + + e.addColorManager(new HsvColorManager()); + }); +} diff --git a/plugins/colors/hsvColor/src/HsvColorManager.ts b/plugins/colors/hsv/src/utils.ts similarity index 70% rename from plugins/colors/hsvColor/src/HsvColorManager.ts rename to plugins/colors/hsv/src/utils.ts index cda315afc52..525622f40ac 100644 --- a/plugins/colors/hsvColor/src/HsvColorManager.ts +++ b/plugins/colors/hsv/src/utils.ts @@ -1,26 +1,17 @@ import { - type IColor, - type IColorManager, type IHsl, type IHsla, type IHsv, type IHsva, - type IRangeColor, - type IRangeHsv, - type IRangeValueColor, type IRgb, type IRgba, - type IValueColor, - getRangeValue, + double, getStyleFromHsl, - parseAlpha, + half, percentDenominator, + rgbMax, } from "@tsparticles/engine"; -const rgbFactor = 255, - double = 2, - half = 0.5; - /** * Converts a RGB ({@link IRgb}) object in a {@link IHsv} object * @param rgb - the RGB ({@link IRgb}) object @@ -28,9 +19,9 @@ const rgbFactor = 255, */ export function rgbToHsv(rgb: IRgb): IHsv { const rgbPercent = { - r: rgb.r / rgbFactor, - g: rgb.g / rgbFactor, - b: rgb.b / rgbFactor, + r: rgb.r / rgbMax, + g: rgb.g / rgbMax, + b: rgb.b / rgbMax, }, xMax = Math.max(rgbPercent.r, rgbPercent.g, rgbPercent.b), xMin = Math.min(rgbPercent.r, rgbPercent.g, rgbPercent.b), @@ -79,11 +70,12 @@ export function rgbaToHsva(rgba: IRgba): IHsva { /** * Gets a CSS style string from a {@link IHsv} object and opacity value * @param color - the {@link IHsv} input color + * @param hdr - indicates if the color is in HDR space * @param opacity - the opacity value * @returns the CSS style string */ -export function getStyleFromHsv(color: IHsv, opacity?: number): string { - return getStyleFromHsl(hsvToHsl(color), opacity); +export function getStyleFromHsv(color: IHsv, hdr: boolean, opacity?: number): string { + return getStyleFromHsl(hsvToHsl(color), hdr, opacity); } /** @@ -218,9 +210,9 @@ export function hsvToRgb(hsv: IHsv): IRgb { if (tempRgb) { const m = hsvPercent.v - c; - result.r = Math.floor((tempRgb.r + m) * rgbFactor); - result.g = Math.floor((tempRgb.g + m) * rgbFactor); - result.b = Math.floor((tempRgb.b + m) * rgbFactor); + result.r = Math.floor((tempRgb.r + m) * rgbMax); + result.g = Math.floor((tempRgb.g + m) * rgbMax); + result.b = Math.floor((tempRgb.b + m) * rgbMax); } return result; @@ -237,62 +229,3 @@ export function hsvaToRgba(hsva: IHsva): IRgba { ...hsvToRgb(hsva), }; } - -export class HsvColorManager implements IColorManager { - readonly key; - readonly stringPrefix; - - constructor() { - this.key = "hsv"; - this.stringPrefix = "hsv"; - } - - handleColor(color: IColor): IRgb | undefined { - const colorValue = color.value as IValueColor, - hsvColor = colorValue.hsv ?? (color.value as IHsv); - - if (hsvColor.h !== undefined && hsvColor.v !== undefined) { - return hsvToRgb(hsvColor); - } - } - - handleRangeColor(color: IRangeColor): IRgb | undefined { - const colorValue = color.value as IRangeValueColor, - hsvColor = colorValue.hsv ?? (color.value as IRangeHsv); - - if (hsvColor.h !== undefined && hsvColor.v !== undefined) { - return hsvToRgb({ - h: getRangeValue(hsvColor.h), - s: getRangeValue(hsvColor.s), - v: getRangeValue(hsvColor.v), - }); - } - } - - parseString(input: string): IRgba | undefined { - if (!input.startsWith("hsv")) { - return; - } - - const regex = /hsva?\(\s*(\d+)°\s*[\s,]\s*(\d+)%\s*[\s,]\s*(\d+)%\s*([\s,]\s*(0|1|0?\.\d+|(\d{1,3})%)\s*)?\)/i, - result = regex.exec(input), - fullLength = 4, - indexes = { - h: 1, - s: 2, - v: 3, - a: 5, - }, - defaultAlpha = 1, - radix = 10; - - return result - ? hsvaToRgba({ - a: result.length > fullLength ? parseAlpha(result[indexes.a]) : defaultAlpha, - h: parseInt(result[indexes.h], radix), - s: parseInt(result[indexes.s], radix), - v: parseInt(result[indexes.v], radix), - }) - : undefined; - } -} diff --git a/plugins/colors/oklchColor/tsconfig.base.json b/plugins/colors/hsv/tsconfig.base.json similarity index 100% rename from plugins/colors/oklchColor/tsconfig.base.json rename to plugins/colors/hsv/tsconfig.base.json diff --git a/plugins/colors/oklchColor/tsconfig.browser.json b/plugins/colors/hsv/tsconfig.browser.json similarity index 100% rename from plugins/colors/oklchColor/tsconfig.browser.json rename to plugins/colors/hsv/tsconfig.browser.json diff --git a/plugins/colors/oklchColor/tsconfig.json b/plugins/colors/hsv/tsconfig.json similarity index 100% rename from plugins/colors/oklchColor/tsconfig.json rename to plugins/colors/hsv/tsconfig.json diff --git a/plugins/colors/oklchColor/tsconfig.module.json b/plugins/colors/hsv/tsconfig.module.json similarity index 100% rename from plugins/colors/oklchColor/tsconfig.module.json rename to plugins/colors/hsv/tsconfig.module.json diff --git a/plugins/colors/oklchColor/tsconfig.types.json b/plugins/colors/hsv/tsconfig.types.json similarity index 100% rename from plugins/colors/oklchColor/tsconfig.types.json rename to plugins/colors/hsv/tsconfig.types.json diff --git a/plugins/colors/oklchColor/tsconfig.umd.json b/plugins/colors/hsv/tsconfig.umd.json similarity index 100% rename from plugins/colors/oklchColor/tsconfig.umd.json rename to plugins/colors/hsv/tsconfig.umd.json diff --git a/plugins/colors/hsvColor/typedoc.json b/plugins/colors/hsv/typedoc.json similarity index 100% rename from plugins/colors/hsvColor/typedoc.json rename to plugins/colors/hsv/typedoc.json diff --git a/plugins/colors/hsv/webpack.config.js b/plugins/colors/hsv/webpack.config.js new file mode 100644 index 00000000000..f06b4e5f7a6 --- /dev/null +++ b/plugins/colors/hsv/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "hsvColor", + pluginName: "HSV Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/hsvColor/.eslintignore b/plugins/colors/hsvColor/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/colors/hsvColor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/colors/hsvColor/.eslintrc.js b/plugins/colors/hsvColor/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/colors/hsvColor/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/colors/hsvColor/package.json b/plugins/colors/hsvColor/package.json deleted file mode 100644 index 7ad2be7948e..00000000000 --- a/plugins/colors/hsvColor/package.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "name": "@tsparticles/plugin-hsv-color", - "version": "3.9.1", - "description": "tsParticles HSV color plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/colors/hsvColor" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } -} diff --git a/plugins/colors/hsvColor/src/index.ts b/plugins/colors/hsvColor/src/index.ts deleted file mode 100644 index e50a267fbda..00000000000 --- a/plugins/colors/hsvColor/src/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { type Engine } from "@tsparticles/engine"; -import { HsvColorManager } from "./HsvColorManager.js"; - -declare const __VERSION__: string; - -/** - * This function is used to load the HSV color plugin - * @param engine - The engine that will use the plugin - * @param refresh - If the plugin should refresh the current colors - * @returns A promise that resolves when the plugin is loaded - */ -export async function loadHsvColorPlugin(engine: Engine, refresh = true): Promise { - engine.checkVersion(__VERSION__); - - await engine.addColorManager(new HsvColorManager(), refresh); -} diff --git a/plugins/colors/hsvColor/webpack.config.js b/plugins/colors/hsvColor/webpack.config.js deleted file mode 100644 index da5e71f1e10..00000000000 --- a/plugins/colors/hsvColor/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; - -module.exports = loadParticlesPlugin({ - moduleName: "hsvColor", - pluginName: "HSV Color", - version, - dir: __dirname, -}); diff --git a/plugins/colors/rgbColor/.browserslistrc b/plugins/colors/hwb/.browserslistrc similarity index 100% rename from plugins/colors/rgbColor/.browserslistrc rename to plugins/colors/hwb/.browserslistrc diff --git a/plugins/colors/oklchColor/.npmignore b/plugins/colors/hwb/.npmignore similarity index 100% rename from plugins/colors/oklchColor/.npmignore rename to plugins/colors/hwb/.npmignore diff --git a/plugins/colors/hwb/CHANGELOG.md b/plugins/colors/hwb/CHANGELOG.md new file mode 100644 index 00000000000..1c11030a396 --- /dev/null +++ b/plugins/colors/hwb/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-hwb-color diff --git a/plugins/colors/rgbColor/LICENSE b/plugins/colors/hwb/LICENSE similarity index 100% rename from plugins/colors/rgbColor/LICENSE rename to plugins/colors/hwb/LICENSE diff --git a/plugins/colors/hwb/README.md b/plugins/colors/hwb/README.md new file mode 100644 index 00000000000..6838f0b6507 --- /dev/null +++ b/plugins/colors/hwb/README.md @@ -0,0 +1,74 @@ +[![banner](https://particles.js.org/images/banner3.png)](https://particles.js.org) + +# tsParticles HWB Color Plugin + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/plugin-hwb-color/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/plugin-hwb-color) +[![npmjs](https://badge.fury.io/js/@tsparticles/plugin-hwb-color.svg)](https://www.npmjs.com/package/@tsparticles/plugin-hwb-color) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/plugin-hwb-color)](https://www.npmjs.com/package/@tsparticles/plugin-hwb-color) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) plugin for adding the HWB color support. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.plugin.hwbColor.min.js` file will export the function to load the plugin: + +```text +loadHwbColorPlugin +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the plugin like this: + +```javascript +(async () => { + await loadHwbColorPlugin(); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/plugin-hwb-color +``` + +or + +```shell +$ yarn add @tsparticles/plugin-hwb-color +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadHwbColorPlugin } = require("@tsparticles/plugin-hwb-color"); + +(async () => { + await loadHwbColorPlugin(); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadHwbColorPlugin } from "@tsparticles/plugin-hwb-color"; + +(async () => { + await loadHwbColorPlugin(); +})(); +``` diff --git a/plugins/colors/hwb/eslint.config.js b/plugins/colors/hwb/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/hwb/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/hwb/package.dist.json b/plugins/colors/hwb/package.dist.json new file mode 100644 index 00000000000..ed0d00ec724 --- /dev/null +++ b/plugins/colors/hwb/package.dist.json @@ -0,0 +1,109 @@ +{ + "name": "@tsparticles/plugin-hwb-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles HWB color plugin", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/hwbColor" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "sideEffects": false, + "jsdelivr": "tsparticles.plugin.hwbColor.min.js", + "unpkg": "tsparticles.plugin.hwbColor.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module" +} diff --git a/plugins/colors/hwb/package.json b/plugins/colors/hwb/package.json new file mode 100644 index 00000000000..1d76194380d --- /dev/null +++ b/plugins/colors/hwb/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-hwb-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles HWB color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/hwb" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/hwb/src/HwbColorManager.ts b/plugins/colors/hwb/src/HwbColorManager.ts new file mode 100644 index 00000000000..b0943d614b0 --- /dev/null +++ b/plugins/colors/hwb/src/HwbColorManager.ts @@ -0,0 +1,152 @@ +import { + type IColor, + type IColorManager, + type IHwb, + type IHwba, + type IRangeColor, + type IRgb, + type IRgba, + type IValueColor, + getRangeValue, + parseAlpha, +} from "@tsparticles/engine"; + +enum HwbIndexes { + h = 1, + w = 2, + b = 3, + a = 5, +} + +const hwbRegex = + /hwba?\(\s*(\d{1,3}(?:\.\d+)?(?:deg|rad|grad|turn)?)\s*[\s,]\s*(\d{1,3}(?:\.\d+)?)%\s*[\s,]\s*(\d{1,3}(?:\.\d+)?)%\s*([\s,]\s*(0|1|0?\.\d+|(\d{1,3})%)\s*)?\)/i, + maxDegree = 360, + maxPercentage = 100, + maxHwbValue = 255, + hueSectors = 6, + redOffset = 5, + greenOffset = 3, + blueOffset = 1, + clampingMin = 0, + clampingMax = 1, + clampingReference = 4, + unitValue = 1, + defaultFallbackValue = 0; + +/** + * Converts an HWB color value to RGB. Conversion formula + * @param hwb - The HWB object + * @returns The RGB representation + */ +function hwbToRgb(hwb: IHwb): IRgb { + const normalizedHue = hwb.h / maxDegree, + whiteness = hwb.w / maxPercentage, + blackness = hwb.b / maxPercentage, + totalWhitenessBlackness = whiteness + blackness; + + let red: number, green: number, blue: number; + + if (totalWhitenessBlackness >= unitValue) { + const greyShade = whiteness / totalWhitenessBlackness; + + red = greyShade; + green = greyShade; + blue = greyShade; + } else { + const calculateChannel = (channelOffset: number): number => { + const sectorPosition = (channelOffset + normalizedHue * hueSectors) % hueSectors, + availableChroma = unitValue - whiteness - blackness, + intensityFactor = Math.max( + clampingMin, + Math.min(sectorPosition, clampingReference - sectorPosition, clampingMax), + ); + + return unitValue - blackness - availableChroma * intensityFactor; + }; + + red = calculateChannel(redOffset); + green = calculateChannel(greenOffset); + blue = calculateChannel(blueOffset); + } + + return { + r: Math.round(red * maxHwbValue), + g: Math.round(green * maxHwbValue), + b: Math.round(blue * maxHwbValue), + }; +} + +/** + * Converts an HWB color value and alpha transparency value to RGBA. Conversion formula + * @param hwba - + * @returns The RGBA representation + */ +function hwbaToRgba(hwba: IHwba): IRgba { + return { + a: hwba.a, + ...hwbToRgb(hwba), + }; +} + +export class HwbColorManager implements IColorManager { + readonly key; + + constructor() { + this.key = "hwb"; + } + + accepts(input: string): boolean { + return input.startsWith("hwb"); + } + + handleColor(color: IColor): IRgb | undefined { + const colorValue = color.value as IValueColor, + hwbColor = colorValue.hwb ?? (color.value as unknown as IHwb); + + if (!Object.hasOwn(hwbColor, "h")) { + return; + } + + return hwbToRgb(hwbColor); + } + + handleRangeColor(color: IRangeColor): IRgb | undefined { + const colorValue = color.value as IValueColor, + hwbColor = colorValue.hwb ?? (color.value as unknown as IHwb); + + if (!Object.hasOwn(hwbColor, "h")) { + return; + } + + return hwbToRgb({ + h: getRangeValue(hwbColor.h), + w: getRangeValue(hwbColor.w), + b: getRangeValue(hwbColor.b), + }); + } + + parseString(input: string): IRgba | undefined { + if (!this.accepts(input)) { + return; + } + + const result = hwbRegex.exec(input), + minLength = 4, + defaultAlpha = 1; + + if (!result) { + return; + } + + const h = result[HwbIndexes.h], + w = result[HwbIndexes.w], + b = result[HwbIndexes.b]; + + return hwbaToRgba({ + a: result.length > minLength ? parseAlpha(result[HwbIndexes.a]) : defaultAlpha, + h: h !== undefined ? parseFloat(h) : defaultFallbackValue, + w: w !== undefined ? parseFloat(w) : defaultFallbackValue, + b: b !== undefined ? parseFloat(b) : defaultFallbackValue, + }); + } +} diff --git a/plugins/colors/hwb/src/index.ts b/plugins/colors/hwb/src/index.ts new file mode 100644 index 00000000000..d8bdddff8be --- /dev/null +++ b/plugins/colors/hwb/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the HWB color plugin + * @param engine - The engine that will use the plugin + */ +export function loadHwbColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { HwbColorManager } = await import("./HwbColorManager.js"); + + e.addColorManager(new HwbColorManager()); + }); +} diff --git a/plugins/colors/rgbColor/tsconfig.base.json b/plugins/colors/hwb/tsconfig.base.json similarity index 100% rename from plugins/colors/rgbColor/tsconfig.base.json rename to plugins/colors/hwb/tsconfig.base.json diff --git a/plugins/colors/rgbColor/tsconfig.browser.json b/plugins/colors/hwb/tsconfig.browser.json similarity index 100% rename from plugins/colors/rgbColor/tsconfig.browser.json rename to plugins/colors/hwb/tsconfig.browser.json diff --git a/plugins/colors/rgbColor/tsconfig.json b/plugins/colors/hwb/tsconfig.json similarity index 100% rename from plugins/colors/rgbColor/tsconfig.json rename to plugins/colors/hwb/tsconfig.json diff --git a/plugins/colors/rgbColor/tsconfig.module.json b/plugins/colors/hwb/tsconfig.module.json similarity index 100% rename from plugins/colors/rgbColor/tsconfig.module.json rename to plugins/colors/hwb/tsconfig.module.json diff --git a/plugins/colors/rgbColor/tsconfig.types.json b/plugins/colors/hwb/tsconfig.types.json similarity index 100% rename from plugins/colors/rgbColor/tsconfig.types.json rename to plugins/colors/hwb/tsconfig.types.json diff --git a/plugins/colors/rgbColor/tsconfig.umd.json b/plugins/colors/hwb/tsconfig.umd.json similarity index 100% rename from plugins/colors/rgbColor/tsconfig.umd.json rename to plugins/colors/hwb/tsconfig.umd.json diff --git a/plugins/colors/hwb/typedoc.json b/plugins/colors/hwb/typedoc.json new file mode 100644 index 00000000000..2b8be2fa5a6 --- /dev/null +++ b/plugins/colors/hwb/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles HWB Color Plugin", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/plugins/colors/hwb/webpack.config.js b/plugins/colors/hwb/webpack.config.js new file mode 100644 index 00000000000..26f50436f76 --- /dev/null +++ b/plugins/colors/hwb/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "hwbColor", + pluginName: "HWB Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/lab/.browserslistrc b/plugins/colors/lab/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/plugins/colors/lab/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/plugins/colors/rgbColor/.npmignore b/plugins/colors/lab/.npmignore similarity index 100% rename from plugins/colors/rgbColor/.npmignore rename to plugins/colors/lab/.npmignore diff --git a/plugins/colors/lab/CHANGELOG.md b/plugins/colors/lab/CHANGELOG.md new file mode 100644 index 00000000000..f0cfbca86ba --- /dev/null +++ b/plugins/colors/lab/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-lab-color diff --git a/plugins/colors/lab/LICENSE b/plugins/colors/lab/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/plugins/colors/lab/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/colors/lab/README.md b/plugins/colors/lab/README.md new file mode 100644 index 00000000000..c2d7b434db6 --- /dev/null +++ b/plugins/colors/lab/README.md @@ -0,0 +1,74 @@ +[![banner](https://particles.js.org/images/banner3.png)](https://particles.js.org) + +# tsParticles LAB Color Plugin + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/plugin-lab-color/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/plugin-lab-color) +[![npmjs](https://badge.fury.io/js/@tsparticles/plugin-lab-color.svg)](https://www.npmjs.com/package/@tsparticles/plugin-lab-color) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/plugin-lab-color)](https://www.npmjs.com/package/@tsparticles/plugin-lab-color) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) plugin for adding the LAB color support. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.plugin.labColor.min.js` file will export the function to load the plugin: + +```text +loadLabColorPlugin +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the plugin like this: + +```javascript +(async () => { + await loadLabColorPlugin(); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/plugin-lab-color +``` + +or + +```shell +$ yarn add @tsparticles/plugin-lab-color +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadLabColorPlugin } = require("@tsparticles/plugin-lab-color"); + +(async () => { + await loadLabColorPlugin(); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadLabColorPlugin } from "@tsparticles/plugin-lab-color"; + +(async () => { + await loadLabColorPlugin(); +})(); +``` diff --git a/plugins/colors/lab/eslint.config.js b/plugins/colors/lab/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/lab/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/lab/package.dist.json b/plugins/colors/lab/package.dist.json new file mode 100644 index 00000000000..70415287ff4 --- /dev/null +++ b/plugins/colors/lab/package.dist.json @@ -0,0 +1,109 @@ +{ + "name": "@tsparticles/plugin-lab-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles LAB color plugin", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/labColor" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "sideEffects": false, + "jsdelivr": "tsparticles.plugin.labColor.min.js", + "unpkg": "tsparticles.plugin.labColor.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module" +} diff --git a/plugins/colors/lab/package.json b/plugins/colors/lab/package.json new file mode 100644 index 00000000000..b3d490b5c5f --- /dev/null +++ b/plugins/colors/lab/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-lab-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles LAB color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/lab" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/lab/src/LabColorManager.ts b/plugins/colors/lab/src/LabColorManager.ts new file mode 100644 index 00000000000..25c2c9dc1eb --- /dev/null +++ b/plugins/colors/lab/src/LabColorManager.ts @@ -0,0 +1,78 @@ +import { + type IColor, + type IColorManager, + type ILab, + type IRangeColor, + type IRangeLab, + type IRangeValueColor, + type IRgb, + type IRgba, + type IValueColor, + getRangeValue, + parseAlpha, +} from "@tsparticles/engine"; +import { labToRgb, labaToRgba } from "./utils.js"; + +const labRegex = /lab\(\s*(\d+(\.\d+)?)%\s+(\d+(\.\d+)?)\s+(\d+(\.\d+)?)(?:\s*\/\s*(0|1|0?\.\d+|\d{1,3}%))?\s*\)/i; + +export class LabColorManager implements IColorManager { + readonly key; + + constructor() { + this.key = "lab"; + } + + accepts(input: string): boolean { + return input.startsWith("lab"); + } + + handleColor(color: IColor): IRgb | undefined { + const colorValue = color.value as IValueColor, + labColor = colorValue.lab ?? (color.value as ILab); + + if (!Object.hasOwn(labColor, "l") && !Object.hasOwn(labColor, "aAxis") && !Object.hasOwn(labColor, "bAxis")) { + return; + } + + return labToRgb(labColor); // Handle LAB conversion + } + + handleRangeColor(color: IRangeColor): IRgb | undefined { + const colorValue = color.value as IRangeValueColor, + labColor = colorValue.lab ?? (color.value as IRangeLab); // Support for LAB + + if (!Object.hasOwn(labColor, "l") && !Object.hasOwn(labColor, "aAxis") && !Object.hasOwn(labColor, "bAxis")) { + return; + } + + return labToRgb({ + l: getRangeValue(labColor.l), + aAxis: getRangeValue(labColor.aAxis), + bAxis: getRangeValue(labColor.bAxis), + }); + } + + parseString(input: string): IRgba | undefined { + if (!this.accepts(input)) { + return; + } + + const result = labRegex.exec(input), + indexes = { + l: 1, // Lightness + aAxis: 3, // Chroma + bAxis: 5, // Hue + a: 7, // Optional alpha for LAB + }, + defaultAlpha = 1; + + return result + ? labaToRgba({ + a: result[indexes.a] ? parseAlpha(result[indexes.a]) : defaultAlpha, + aAxis: parseFloat(result[indexes.aAxis] ?? "0"), + bAxis: parseFloat(result[indexes.bAxis] ?? "0"), + l: parseFloat(result[indexes.l] ?? "0"), + }) + : undefined; // LAB parsing without alpha + } +} diff --git a/plugins/colors/lab/src/index.ts b/plugins/colors/lab/src/index.ts new file mode 100644 index 00000000000..f896a79aea8 --- /dev/null +++ b/plugins/colors/lab/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the Lab color plugin + * @param engine - The engine, used to add the color manager + */ +export function loadLabColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { LabColorManager } = await import("./LabColorManager.js"); + + e.addColorManager(new LabColorManager()); + }); +} diff --git a/plugins/colors/lab/src/utils.ts b/plugins/colors/lab/src/utils.ts new file mode 100644 index 00000000000..1a50525e83f --- /dev/null +++ b/plugins/colors/lab/src/utils.ts @@ -0,0 +1,114 @@ +import { type ILab, type ILaba, type IRgb, type IRgba, clamp, inverseFactorNumerator } from "@tsparticles/engine"; + +// RGB +const RGB = { + MAX: 255, + } as const, + // Reference white (D65, 2°) + WHITE_POINT_D65 = { + X: 0.95047, + Y: 1.0, + Z: 1.08883, + } as const, + // CIE LAB constants + CIE = { + LAB_EPSILON_NUMERATOR: 216, + LAB_EPSILON_DENOMINATOR: 24389, + LAB_KAPPA_NUMERATOR: 24389, + LAB_KAPPA_DENOMINATOR: 27, + LAB_L_OFFSET: 16, + LAB_L_SCALE: 116, + LAB_A_SCALE: 500, + LAB_B_SCALE: 200, + } as const, + LAB = { + EPSILON: CIE.LAB_EPSILON_NUMERATOR / CIE.LAB_EPSILON_DENOMINATOR, + KAPPA: CIE.LAB_KAPPA_NUMERATOR / CIE.LAB_KAPPA_DENOMINATOR, + L_OFFSET: CIE.LAB_L_OFFSET, + L_SCALE: CIE.LAB_L_SCALE, + A_SCALE: CIE.LAB_A_SCALE, + B_SCALE: CIE.LAB_B_SCALE, + } as const, + // XYZ → linear sRGB matrix + XYZ_TO_LINEAR_RGB = { + r: { x: 3.2404542, y: -1.5371385, z: -0.4985314 }, + g: { x: -0.969266, y: 1.8760108, z: 0.041556 }, + b: { x: 0.0556434, y: -0.2040259, z: 1.0572252 }, + } as const, + // sRGB transfer function + SRGB = { + GAMMA: 2.4, + LINEAR_THRESHOLD: 0.0031308, + LINEAR_SCALE: 12.92, + SCALE: 1.055, + OFFSET: 0.055, + } as const, + minSrgbValue = 0, + maxSrgbValue = 1; + +/** + * Converts an LAB ({@link ILab}) object into an RGB ({@link IRgb}) object + * @param lab - the LAB object + * @returns the {@link IRgb} object + */ +export function labToRgb(lab: ILab): IRgb { + // 1. LAB → LAB + const L = lab.l, // 0–100 + a = lab.aAxis, + b = lab.bAxis, + // 2. LAB → XYZ (relative) + fy = (L + LAB.L_OFFSET) / LAB.L_SCALE, + fx = fy + a / LAB.A_SCALE, + fz = fy - b / LAB.B_SCALE, + cubic = 3, + fx3 = fx ** cubic, + fz3 = fz ** cubic, + xr = fx3 > LAB.EPSILON ? fx3 : (LAB.L_SCALE * fx - LAB.L_OFFSET) / LAB.KAPPA, + yr = L > LAB.KAPPA * LAB.EPSILON ? fy ** cubic : L / LAB.KAPPA, + zr = fz3 > LAB.EPSILON ? fz3 : (LAB.L_SCALE * fz - LAB.L_OFFSET) / LAB.KAPPA, + X = xr * WHITE_POINT_D65.X, + Y = yr * WHITE_POINT_D65.Y, + Z = zr * WHITE_POINT_D65.Z, + // 3. XYZ → linear sRGB + rLinear = XYZ_TO_LINEAR_RGB.r.x * X + XYZ_TO_LINEAR_RGB.r.y * Y + XYZ_TO_LINEAR_RGB.r.z * Z, + gLinear = XYZ_TO_LINEAR_RGB.g.x * X + XYZ_TO_LINEAR_RGB.g.y * Y + XYZ_TO_LINEAR_RGB.g.z * Z, + bLinear = XYZ_TO_LINEAR_RGB.b.x * X + XYZ_TO_LINEAR_RGB.b.y * Y + XYZ_TO_LINEAR_RGB.b.z * Z, + // 4. Linear → gamma-corrected sRGB + toSrgb = (x: number): number => + x <= SRGB.LINEAR_THRESHOLD + ? SRGB.LINEAR_SCALE * x + : SRGB.SCALE * Math.pow(x, inverseFactorNumerator / SRGB.GAMMA) - SRGB.OFFSET, + toSrgbFixed: (num: number) => number = num => + Math.round(clamp(toSrgb(num), minSrgbValue, maxSrgbValue) * RGB.MAX); + + return { + r: toSrgbFixed(rLinear), + g: toSrgbFixed(gLinear), + b: toSrgbFixed(bLinear), + }; +} + +/** + * Converts an LABA ({@link ILaba}) object into an RGBA ({@link IRgba}) object + * @param laba - the LABA object + * @returns the {@link IRgba} object + */ +export function labaToRgba(laba: ILaba): IRgba { + return { + a: laba.a, + ...labToRgb(laba), + }; +} + +/** + * Gets a CSS style string from an LAB ({@link ILab}) object and an optional opacity value + * @param color - the LAB ({@link ILab}) object + * @param opacity - the opacity value + * @returns the CSS style string + */ +export function getStyleFromLab(color: ILab, opacity?: number): string { + const { l, aAxis, bAxis } = color, + alpha = opacity !== undefined ? `/ ${opacity.toString()}` : ""; + + return `lab(${l.toString()}%, ${aAxis.toString()}%, ${bAxis.toString()}°${alpha})`; +} diff --git a/plugins/colors/lab/tsconfig.base.json b/plugins/colors/lab/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/plugins/colors/lab/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/plugins/colors/lab/tsconfig.browser.json b/plugins/colors/lab/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/plugins/colors/lab/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/plugins/colors/lab/tsconfig.json b/plugins/colors/lab/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/plugins/colors/lab/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/plugins/colors/lab/tsconfig.module.json b/plugins/colors/lab/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/plugins/colors/lab/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/plugins/colors/lab/tsconfig.types.json b/plugins/colors/lab/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/plugins/colors/lab/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/plugins/colors/lab/tsconfig.umd.json b/plugins/colors/lab/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/plugins/colors/lab/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/plugins/colors/lab/typedoc.json b/plugins/colors/lab/typedoc.json new file mode 100644 index 00000000000..8d99210ad84 --- /dev/null +++ b/plugins/colors/lab/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles LAB Color Plugin", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/plugins/colors/lab/webpack.config.js b/plugins/colors/lab/webpack.config.js new file mode 100644 index 00000000000..58056f9bdab --- /dev/null +++ b/plugins/colors/lab/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "labColor", + pluginName: "LAB Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/lch/.browserslistrc b/plugins/colors/lch/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/plugins/colors/lch/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/plugins/colors/lch/.npmignore b/plugins/colors/lch/.npmignore new file mode 100644 index 00000000000..5c901533f98 --- /dev/null +++ b/plugins/colors/lch/.npmignore @@ -0,0 +1 @@ +report.html \ No newline at end of file diff --git a/plugins/colors/lch/CHANGELOG.md b/plugins/colors/lch/CHANGELOG.md new file mode 100644 index 00000000000..d3a8411de9f --- /dev/null +++ b/plugins/colors/lch/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-lch-color diff --git a/plugins/colors/lch/LICENSE b/plugins/colors/lch/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/plugins/colors/lch/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/colors/lch/README.md b/plugins/colors/lch/README.md new file mode 100644 index 00000000000..085cbb9e5f5 --- /dev/null +++ b/plugins/colors/lch/README.md @@ -0,0 +1,74 @@ +[![banner](https://particles.js.org/images/banner3.png)](https://particles.js.org) + +# tsParticles LCH Color Plugin + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/plugin-lch-color/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/plugin-lch-color) +[![npmjs](https://badge.fury.io/js/@tsparticles/plugin-lch-color.svg)](https://www.npmjs.com/package/@tsparticles/plugin-lch-color) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/plugin-lch-color)](https://www.npmjs.com/package/@tsparticles/plugin-lch-color) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) plugin for adding the LCH color support. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.plugin.lchColor.min.js` file will export the function to load the plugin: + +```text +loadLchColorPlugin +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the plugin like this: + +```javascript +(async () => { + await loadLchColorPlugin(); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/plugin-lch-color +``` + +or + +```shell +$ yarn add @tsparticles/plugin-lch-color +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadLchColorPlugin } = require("@tsparticles/plugin-lch-color"); + +(async () => { + await loadLchColorPlugin(); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadLchColorPlugin } from "@tsparticles/plugin-lch-color"; + +(async () => { + await loadLchColorPlugin(); +})(); +``` diff --git a/plugins/colors/lch/eslint.config.js b/plugins/colors/lch/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/lch/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/lch/package.dist.json b/plugins/colors/lch/package.dist.json new file mode 100644 index 00000000000..fe0e1ba6cf3 --- /dev/null +++ b/plugins/colors/lch/package.dist.json @@ -0,0 +1,109 @@ +{ + "name": "@tsparticles/plugin-lch-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles LCH color plugin", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/lchColor" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "sideEffects": false, + "jsdelivr": "tsparticles.plugin.lchColor.min.js", + "unpkg": "tsparticles.plugin.lchColor.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module" +} diff --git a/plugins/colors/lch/package.json b/plugins/colors/lch/package.json new file mode 100644 index 00000000000..414d713db18 --- /dev/null +++ b/plugins/colors/lch/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-lch-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles LCH color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/lch" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/oklchColor/src/LchColorManager.ts b/plugins/colors/lch/src/LchColorManager.ts similarity index 54% rename from plugins/colors/oklchColor/src/LchColorManager.ts rename to plugins/colors/lch/src/LchColorManager.ts index 90b3f5ca0fa..614dc58a3eb 100644 --- a/plugins/colors/oklchColor/src/LchColorManager.ts +++ b/plugins/colors/lch/src/LchColorManager.ts @@ -3,7 +3,7 @@ import { type IColorManager, type ILch, type IRangeColor, - type IRangeOklch, + type IRangeLch, type IRangeValueColor, type IRgb, type IRgba, @@ -13,47 +13,51 @@ import { } from "@tsparticles/engine"; import { lchToRgb, lchaToRgba } from "./utils.js"; +const lchRegex = /lch\(\s*(\d+(\.\d+)?)%\s+(\d+(\.\d+)?)\s+(\d+(\.\d+)?)(?:\s*\/\s*(0|1|0?\.\d+|\d{1,3}%))?\s*\)/i; + export class LchColorManager implements IColorManager { readonly key; - readonly stringPrefix; constructor() { this.key = "lch"; - this.stringPrefix = "lch"; + } + + accepts(input: string): boolean { + return input.startsWith("lch"); } handleColor(color: IColor): IRgb | undefined { const colorValue = color.value as IValueColor, lchColor = colorValue.lch ?? (color.value as ILch); - if (lchColor.l !== undefined && lchColor.c !== undefined && lchColor.h !== undefined) { - return lchToRgb(lchColor); // Handle LCH conversion + if (!Object.hasOwn(lchColor, "l") && !Object.hasOwn(lchColor, "c") && !Object.hasOwn(lchColor, "h")) { + return; } + + return lchToRgb(lchColor); // Handle LCH conversion } handleRangeColor(color: IRangeColor): IRgb | undefined { const colorValue = color.value as IRangeValueColor, - lchColor = colorValue.lch ?? (color.value as IRangeOklch); // Support for LCH + lchColor = colorValue.lch ?? (color.value as IRangeLch); // Support for LCH - if (lchColor.l !== undefined && lchColor.c !== undefined && lchColor.h !== undefined) { - return lchToRgb({ - l: getRangeValue(lchColor.l), - c: getRangeValue(lchColor.c), - h: getRangeValue(lchColor.h), - }); + if (!Object.hasOwn(lchColor, "l") && !Object.hasOwn(lchColor, "c") && !Object.hasOwn(lchColor, "h")) { + return; } + + return lchToRgb({ + l: getRangeValue(lchColor.l), + c: getRangeValue(lchColor.c), + h: getRangeValue(lchColor.h), + }); } parseString(input: string): IRgba | undefined { - const isLch = input.startsWith("lch"); - - if (!isLch) { + if (!this.accepts(input)) { return; } - // Adjust regex for both LCH and OKLCH - const regex = /lch\(\s*(\d+(\.\d+)?)%\s+(\d+(\.\d+)?)\s+(\d+(\.\d+)?)(?:\s*\/\s*(0|1|0?\.\d+|\d{1,3}%))?\s*\)/i, - result = regex.exec(input), + const result = lchRegex.exec(input), indexes = { l: 1, // Lightness c: 3, // Chroma @@ -65,9 +69,9 @@ export class LchColorManager implements IColorManager { return result ? lchaToRgba({ a: result[indexes.a] ? parseAlpha(result[indexes.a]) : defaultAlpha, - c: parseFloat(result[indexes.c]), - h: parseFloat(result[indexes.h]), - l: parseFloat(result[indexes.l]), + c: parseFloat(result[indexes.c] ?? "0"), + h: parseFloat(result[indexes.h] ?? "0"), + l: parseFloat(result[indexes.l] ?? "0"), }) : undefined; // LCH parsing without alpha } diff --git a/plugins/colors/lch/src/index.ts b/plugins/colors/lch/src/index.ts new file mode 100644 index 00000000000..2820eb132b0 --- /dev/null +++ b/plugins/colors/lch/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the Lch color plugin + * @param engine - The engine, used to add the color manager + */ +export function loadLchColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { LchColorManager } = await import("./LchColorManager.js"); + + e.addColorManager(new LchColorManager()); + }); +} diff --git a/plugins/colors/lch/src/utils.ts b/plugins/colors/lch/src/utils.ts new file mode 100644 index 00000000000..79d04db546d --- /dev/null +++ b/plugins/colors/lch/src/utils.ts @@ -0,0 +1,124 @@ +import { + type ILch, + type ILcha, + type IRgb, + type IRgba, + clamp, + degToRad, + inverseFactorNumerator, +} from "@tsparticles/engine"; + +// RGB +const RGB = { + MAX: 255, + } as const, + // Reference white (D65, 2°) + WHITE_POINT_D65 = { + X: 0.95047, + Y: 1.0, + Z: 1.08883, + } as const, + // CIE LAB constants + CIE = { + LAB_EPSILON_NUMERATOR: 216, + LAB_EPSILON_DENOMINATOR: 24389, + LAB_KAPPA_NUMERATOR: 24389, + LAB_KAPPA_DENOMINATOR: 27, + LAB_L_OFFSET: 16, + LAB_L_SCALE: 116, + LAB_A_SCALE: 500, + LAB_B_SCALE: 200, + } as const, + LAB = { + EPSILON: CIE.LAB_EPSILON_NUMERATOR / CIE.LAB_EPSILON_DENOMINATOR, + KAPPA: CIE.LAB_KAPPA_NUMERATOR / CIE.LAB_KAPPA_DENOMINATOR, + L_OFFSET: CIE.LAB_L_OFFSET, + L_SCALE: CIE.LAB_L_SCALE, + A_SCALE: CIE.LAB_A_SCALE, + B_SCALE: CIE.LAB_B_SCALE, + } as const, + // XYZ → linear sRGB matrix + XYZ_TO_LINEAR_RGB = { + r: { x: 3.2404542, y: -1.5371385, z: -0.4985314 }, + g: { x: -0.969266, y: 1.8760108, z: 0.041556 }, + b: { x: 0.0556434, y: -0.2040259, z: 1.0572252 }, + } as const, + // sRGB transfer function + SRGB = { + GAMMA: 2.4, + LINEAR_THRESHOLD: 0.0031308, + LINEAR_SCALE: 12.92, + SCALE: 1.055, + OFFSET: 0.055, + } as const, + minSrgbValue = 0, + maxSrgbValue = 1; + +/** + * Converts an LCH ({@link ILch}) object into an RGB ({@link IRgb}) object + * @param lch - the LCH object + * @returns the {@link IRgb} object + */ +export function lchToRgb(lch: ILch): IRgb { + // 1. LCH → LAB + const L = lch.l, // 0–100 + C = lch.c, + hRad = degToRad(lch.h), + a = C * Math.cos(hRad), + b = C * Math.sin(hRad), + // 2. LAB → XYZ (relative) + fy = (L + LAB.L_OFFSET) / LAB.L_SCALE, + fx = fy + a / LAB.A_SCALE, + fz = fy - b / LAB.B_SCALE, + cubic = 3, + fx3 = fx ** cubic, + fz3 = fz ** cubic, + xr = fx3 > LAB.EPSILON ? fx3 : (LAB.L_SCALE * fx - LAB.L_OFFSET) / LAB.KAPPA, + yr = L > LAB.KAPPA * LAB.EPSILON ? fy ** cubic : L / LAB.KAPPA, + zr = fz3 > LAB.EPSILON ? fz3 : (LAB.L_SCALE * fz - LAB.L_OFFSET) / LAB.KAPPA, + X = xr * WHITE_POINT_D65.X, + Y = yr * WHITE_POINT_D65.Y, + Z = zr * WHITE_POINT_D65.Z, + // 3. XYZ → linear sRGB + rLinear = XYZ_TO_LINEAR_RGB.r.x * X + XYZ_TO_LINEAR_RGB.r.y * Y + XYZ_TO_LINEAR_RGB.r.z * Z, + gLinear = XYZ_TO_LINEAR_RGB.g.x * X + XYZ_TO_LINEAR_RGB.g.y * Y + XYZ_TO_LINEAR_RGB.g.z * Z, + bLinear = XYZ_TO_LINEAR_RGB.b.x * X + XYZ_TO_LINEAR_RGB.b.y * Y + XYZ_TO_LINEAR_RGB.b.z * Z, + // 4. Linear → gamma-corrected sRGB + toSrgb = (x: number): number => + x <= SRGB.LINEAR_THRESHOLD + ? SRGB.LINEAR_SCALE * x + : SRGB.SCALE * Math.pow(x, inverseFactorNumerator / SRGB.GAMMA) - SRGB.OFFSET, + toSrgbFixed: (num: number) => number = num => + Math.round(clamp(toSrgb(num), minSrgbValue, maxSrgbValue) * RGB.MAX); + + return { + r: toSrgbFixed(rLinear), + g: toSrgbFixed(gLinear), + b: toSrgbFixed(bLinear), + }; +} + +/** + * Converts an LCHA ({@link ILcha}) object into an RGBA ({@link IRgba}) object + * @param lcha - the LCHA object + * @returns the {@link IRgba} object + */ +export function lchaToRgba(lcha: ILcha): IRgba { + return { + a: lcha.a, + ...lchToRgb(lcha), + }; +} + +/** + * Gets a CSS style string from an LCH ({@link ILch}) object and an optional opacity value + * @param color - the LCH ({@link ILch}) object + * @param opacity - the opacity value + * @returns the CSS style string + */ +export function getStyleFromLch(color: ILch, opacity?: number): string { + const { l, c, h } = color, + alpha = opacity !== undefined ? `/ ${opacity.toString()}` : ""; + + return `lch(${l.toString()}%, ${c.toString()}%, ${h.toString()}°${alpha})`; +} diff --git a/plugins/colors/lch/tsconfig.base.json b/plugins/colors/lch/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/plugins/colors/lch/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/plugins/colors/lch/tsconfig.browser.json b/plugins/colors/lch/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/plugins/colors/lch/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/plugins/colors/lch/tsconfig.json b/plugins/colors/lch/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/plugins/colors/lch/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/plugins/colors/lch/tsconfig.module.json b/plugins/colors/lch/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/plugins/colors/lch/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/plugins/colors/lch/tsconfig.types.json b/plugins/colors/lch/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/plugins/colors/lch/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/plugins/colors/lch/tsconfig.umd.json b/plugins/colors/lch/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/plugins/colors/lch/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/plugins/colors/lch/typedoc.json b/plugins/colors/lch/typedoc.json new file mode 100644 index 00000000000..e8df4d06f0d --- /dev/null +++ b/plugins/colors/lch/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles LCH Color Plugin", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/plugins/colors/lch/webpack.config.js b/plugins/colors/lch/webpack.config.js new file mode 100644 index 00000000000..10940c6dd99 --- /dev/null +++ b/plugins/colors/lch/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "lchColor", + pluginName: "LCH Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/named/.browserslistrc b/plugins/colors/named/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/plugins/colors/named/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/plugins/colors/named/.npmignore b/plugins/colors/named/.npmignore new file mode 100644 index 00000000000..5c901533f98 --- /dev/null +++ b/plugins/colors/named/.npmignore @@ -0,0 +1 @@ +report.html \ No newline at end of file diff --git a/plugins/colors/namedColor/CHANGELOG.md b/plugins/colors/named/CHANGELOG.md similarity index 89% rename from plugins/colors/namedColor/CHANGELOG.md rename to plugins/colors/named/CHANGELOG.md index cb6c382ba89..43f7bc95ba7 100644 --- a/plugins/colors/namedColor/CHANGELOG.md +++ b/plugins/colors/named/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-named-color + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-named-color diff --git a/plugins/colors/named/LICENSE b/plugins/colors/named/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/plugins/colors/named/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/colors/namedColor/README.md b/plugins/colors/named/README.md similarity index 100% rename from plugins/colors/namedColor/README.md rename to plugins/colors/named/README.md diff --git a/plugins/colors/named/eslint.config.js b/plugins/colors/named/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/named/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/namedColor/package.dist.json b/plugins/colors/named/package.dist.json similarity index 95% rename from plugins/colors/namedColor/package.dist.json rename to plugins/colors/named/package.dist.json index 7741c7f1812..aabac354d78 100644 --- a/plugins/colors/namedColor/package.dist.json +++ b/plugins/colors/named/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-named-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles named color plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/colors/named/package.json b/plugins/colors/named/package.json new file mode 100644 index 00000000000..ab8aca7e519 --- /dev/null +++ b/plugins/colors/named/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-named-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles named color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/named" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/namedColor/src/NamedColorManager.ts b/plugins/colors/named/src/NamedColorManager.ts similarity index 98% rename from plugins/colors/namedColor/src/NamedColorManager.ts rename to plugins/colors/named/src/NamedColorManager.ts index 3373fb26e89..c6f6009fced 100644 --- a/plugins/colors/namedColor/src/NamedColorManager.ts +++ b/plugins/colors/named/src/NamedColorManager.ts @@ -160,11 +160,13 @@ const namedColors = new Map([ export class NamedColorManager implements IColorManager { readonly key; - readonly stringPrefix; constructor() { this.key = "named"; - this.stringPrefix = ""; + } + + accepts(input: string): boolean { + return namedColors.has(input.toLowerCase()); } handleColor(color: IColor): IRgb | undefined { diff --git a/plugins/colors/named/src/index.ts b/plugins/colors/named/src/index.ts new file mode 100644 index 00000000000..9f76b09f555 --- /dev/null +++ b/plugins/colors/named/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the named color plugin + * @param engine - The engine, used to add the plugin + */ +export function loadNamedColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { NamedColorManager } = await import("./NamedColorManager.js"); + + e.addColorManager(new NamedColorManager()); + }); +} diff --git a/plugins/colors/named/tsconfig.base.json b/plugins/colors/named/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/plugins/colors/named/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/plugins/colors/named/tsconfig.browser.json b/plugins/colors/named/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/plugins/colors/named/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/plugins/colors/named/tsconfig.json b/plugins/colors/named/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/plugins/colors/named/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/plugins/colors/named/tsconfig.module.json b/plugins/colors/named/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/plugins/colors/named/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/plugins/colors/named/tsconfig.types.json b/plugins/colors/named/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/plugins/colors/named/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/plugins/colors/named/tsconfig.umd.json b/plugins/colors/named/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/plugins/colors/named/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/plugins/colors/namedColor/typedoc.json b/plugins/colors/named/typedoc.json similarity index 100% rename from plugins/colors/namedColor/typedoc.json rename to plugins/colors/named/typedoc.json diff --git a/plugins/colors/named/webpack.config.js b/plugins/colors/named/webpack.config.js new file mode 100644 index 00000000000..7b3f70c1853 --- /dev/null +++ b/plugins/colors/named/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "namedColor", + pluginName: "Named Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/namedColor/.eslintignore b/plugins/colors/namedColor/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/colors/namedColor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/colors/namedColor/.eslintrc.js b/plugins/colors/namedColor/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/colors/namedColor/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/colors/namedColor/package.json b/plugins/colors/namedColor/package.json deleted file mode 100644 index 22b966d0b2c..00000000000 --- a/plugins/colors/namedColor/package.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "name": "@tsparticles/plugin-named-color", - "version": "3.9.1", - "description": "tsParticles named color plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/colors/namedColor" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } -} diff --git a/plugins/colors/namedColor/src/index.ts b/plugins/colors/namedColor/src/index.ts deleted file mode 100644 index 789ba171489..00000000000 --- a/plugins/colors/namedColor/src/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { type Engine } from "@tsparticles/engine"; -import { NamedColorManager } from "./NamedColorManager.js"; - -declare const __VERSION__: string; - -/** - * This function is used to load the named color plugin - * @param engine - The engine, used to add the plugin - * @param refresh - Should it refresh the plugin - * @returns A promise that resolves when the plugin is loaded - */ -export async function loadNamedColorPlugin(engine: Engine, refresh = true): Promise { - engine.checkVersion(__VERSION__); - - await engine.addColorManager(new NamedColorManager(), refresh); -} diff --git a/plugins/colors/namedColor/webpack.config.js b/plugins/colors/namedColor/webpack.config.js deleted file mode 100644 index 86667f2ed29..00000000000 --- a/plugins/colors/namedColor/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; - -module.exports = loadParticlesPlugin({ - moduleName: "namedColor", - pluginName: "Named Color", - version, - dir: __dirname, -}); diff --git a/plugins/colors/oklab/.browserslistrc b/plugins/colors/oklab/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/plugins/colors/oklab/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/plugins/colors/oklab/.npmignore b/plugins/colors/oklab/.npmignore new file mode 100644 index 00000000000..5c901533f98 --- /dev/null +++ b/plugins/colors/oklab/.npmignore @@ -0,0 +1 @@ +report.html \ No newline at end of file diff --git a/plugins/colors/oklab/CHANGELOG.md b/plugins/colors/oklab/CHANGELOG.md new file mode 100644 index 00000000000..cb951c96099 --- /dev/null +++ b/plugins/colors/oklab/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-oklab-color diff --git a/plugins/colors/oklab/LICENSE b/plugins/colors/oklab/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/plugins/colors/oklab/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/colors/oklab/README.md b/plugins/colors/oklab/README.md new file mode 100644 index 00000000000..78acdab9fb0 --- /dev/null +++ b/plugins/colors/oklab/README.md @@ -0,0 +1,74 @@ +[![banner](https://particles.js.org/images/banner3.png)](https://particles.js.org) + +# tsParticles OKLAB Color Plugin + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/plugin-oklab-color/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/plugin-oklab-color) +[![npmjs](https://badge.fury.io/js/@tsparticles/plugin-oklab-color.svg)](https://www.npmjs.com/package/@tsparticles/plugin-oklab-color) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/plugin-oklab-color)](https://www.npmjs.com/package/@tsparticles/plugin-oklab-color) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) plugin for adding the OKLAB color support. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.plugin.oklabColor.min.js` file will export the function to load the plugin: + +```text +loadOklabColorPlugin +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the plugin like this: + +```javascript +(async () => { + await loadOklabColorPlugin(); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/plugin-oklab-color +``` + +or + +```shell +$ yarn add @tsparticles/plugin-oklab-color +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadOklabColorPlugin } = require("@tsparticles/plugin-oklab-color"); + +(async () => { + await loadOklabColorPlugin(); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadOklabColorPlugin } from "@tsparticles/plugin-oklab-color"; + +(async () => { + await loadOklabColorPlugin(); +})(); +``` diff --git a/plugins/colors/oklab/eslint.config.js b/plugins/colors/oklab/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/oklab/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/oklab/package.dist.json b/plugins/colors/oklab/package.dist.json new file mode 100644 index 00000000000..5923cd3a2db --- /dev/null +++ b/plugins/colors/oklab/package.dist.json @@ -0,0 +1,109 @@ +{ + "name": "@tsparticles/plugin-oklab-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles OKLAB color plugin", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/oklabColor" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "sideEffects": false, + "jsdelivr": "tsparticles.plugin.oklabColor.min.js", + "unpkg": "tsparticles.plugin.oklabColor.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module" +} diff --git a/plugins/colors/oklab/package.json b/plugins/colors/oklab/package.json new file mode 100644 index 00000000000..0d31d011ab0 --- /dev/null +++ b/plugins/colors/oklab/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-oklab-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles OKLAB color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/oklab" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/oklab/src/OklabColorManager.ts b/plugins/colors/oklab/src/OklabColorManager.ts new file mode 100644 index 00000000000..ad572eaef09 --- /dev/null +++ b/plugins/colors/oklab/src/OklabColorManager.ts @@ -0,0 +1,87 @@ +import { + type IColor, + type IColorManager, + type IOklab, + type IRangeColor, + type IRangeOklab, + type IRangeValueColor, + type IRgb, + type IRgba, + type IValueColor, + getRangeValue, + parseAlpha, +} from "@tsparticles/engine"; +import { oklabToRgb, oklabaToRgba } from "./utils.js"; + +const oklabRegex = + /oklab\(\s*(\d+(\.\d+)?)%\s+(-?\d+(\.\d+)?)\s+(-?\d+(\.\d+)?)(?:\s*\/\s*(0|1|0?\.\d+|\d{1,3}%))?\s*\)/i; + +export class OklabColorManager implements IColorManager { + readonly key; + + constructor() { + this.key = "oklab"; + } + + accepts(input: string): boolean { + return input.startsWith("oklab"); + } + + handleColor(color: IColor): IRgb | undefined { + const colorValue = color.value as IValueColor, + oklabColor = colorValue.oklab ?? (color.value as IOklab); + + if ( + !Object.hasOwn(oklabColor, "l") || + !Object.hasOwn(oklabColor, "aAxis") || + !Object.hasOwn(oklabColor, "bAxis") + ) { + return; + } + + return oklabToRgb(oklabColor); + } + + handleRangeColor(color: IRangeColor): IRgb | undefined { + const colorValue = color.value as IRangeValueColor, + oklabColor = colorValue.oklab ?? (color.value as IRangeOklab); + + if ( + !Object.hasOwn(oklabColor, "l") || + !Object.hasOwn(oklabColor, "aAxis") || + !Object.hasOwn(oklabColor, "bAxis") + ) { + return; + } + + return oklabToRgb({ + l: getRangeValue(oklabColor.l), + aAxis: getRangeValue(oklabColor.aAxis), + bAxis: getRangeValue(oklabColor.bAxis), + }); + } + + parseString(input: string): IRgba | undefined { + if (!this.accepts(input)) { + return; + } + + const result = oklabRegex.exec(input), + indexes = { + l: 1, + aAxis: 3, + bAxis: 5, + a: 7, + }, + defaultAlpha = 1; + + return result + ? oklabaToRgba({ + a: result[indexes.a] ? parseAlpha(result[indexes.a]) : defaultAlpha, + l: parseFloat(result[indexes.l] ?? "0"), + aAxis: parseFloat(result[indexes.aAxis] ?? "0"), + bAxis: parseFloat(result[indexes.bAxis] ?? "0"), + }) + : undefined; + } +} diff --git a/plugins/colors/oklab/src/index.ts b/plugins/colors/oklab/src/index.ts new file mode 100644 index 00000000000..3e1eb5c61dd --- /dev/null +++ b/plugins/colors/oklab/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the Oklab color plugin + * @param engine - The engine, used to add the color manager + */ +export function loadOklabColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { OklabColorManager } = await import("./OklabColorManager.js"); + + e.addColorManager(new OklabColorManager()); + }); +} diff --git a/plugins/colors/oklab/src/utils.ts b/plugins/colors/oklab/src/utils.ts new file mode 100644 index 00000000000..3915f3480dc --- /dev/null +++ b/plugins/colors/oklab/src/utils.ts @@ -0,0 +1,95 @@ +import { + type IOklab, + type IOklaba, + type IRgb, + type IRgba, + clamp, + inverseFactorNumerator, + percentDenominator, + rgbMax, +} from "@tsparticles/engine"; +// OKLab → LMS (non-linear) +const OKLAB_LMS = { + l: { L: 1, a: 0.3963377774, b: 0.2158037573 }, + m: { L: 1, a: -0.1055613458, b: -0.0638541728 }, + s: { L: 1, a: -0.0894841775, b: -1.291485548 }, + } as const, + // LMS → linear sRGB + LMS_TO_LINEAR_RGB = { + r: { l: 4.0767416621, m: -3.3077115913, s: 0.2309699292 }, + g: { l: -1.2684380046, m: 2.6097574011, s: -0.3413193965 }, + b: { l: -0.0041960863, m: -0.7034186147, s: 1.707614701 }, + } as const, + // sRGB transfer function + SRGB = { + GAMMA: 2.4, + LINEAR_THRESHOLD: 0.0031308, + LINEAR_SCALE: 12.92, + OFFSET: 0.055, + SCALE: 1.055, + } as const, + minSrgbValue = 0, + maxSrgbValue = 1; + +/** + * Converts an OKLAB ({@link IOklab}) object into an RGB ({@link IRgb}) object + * @param oklab - the OKLAB ({@link IOklab}) object + * @returns the {@link IRgb} object + */ +export function oklabToRgb(oklab: IOklab): IRgb { + // 1. Normalize OKLab inputs + const L = oklab.l / percentDenominator, + a = oklab.aAxis, + b = oklab.bAxis, + // 2. OKLab → LMS (non-linear) + l_ = OKLAB_LMS.l.L * L + OKLAB_LMS.l.a * a + OKLAB_LMS.l.b * b, + m_ = OKLAB_LMS.m.L * L + OKLAB_LMS.m.a * a + OKLAB_LMS.m.b * b, + s_ = OKLAB_LMS.s.L * L + OKLAB_LMS.s.a * a + OKLAB_LMS.s.b * b, + cubic = 3, + // 3. Cubic response + l = l_ ** cubic, + m = m_ ** cubic, + s = s_ ** cubic, + // 4. LMS → linear sRGB + rLinear = LMS_TO_LINEAR_RGB.r.l * l + LMS_TO_LINEAR_RGB.r.m * m + LMS_TO_LINEAR_RGB.r.s * s, + gLinear = LMS_TO_LINEAR_RGB.g.l * l + LMS_TO_LINEAR_RGB.g.m * m + LMS_TO_LINEAR_RGB.g.s * s, + bLinear = LMS_TO_LINEAR_RGB.b.l * l + LMS_TO_LINEAR_RGB.b.m * m + LMS_TO_LINEAR_RGB.b.s * s, + // 5. Linear → gamma-corrected sRGB + toSrgb = (x: number): number => + x <= SRGB.LINEAR_THRESHOLD + ? SRGB.LINEAR_SCALE * x + : SRGB.SCALE * Math.pow(x, inverseFactorNumerator / SRGB.GAMMA) - SRGB.OFFSET, + toSrgbFixed: (num: number) => number = num => + Math.round(clamp(toSrgb(num), minSrgbValue, maxSrgbValue) * rgbMax); + + return { + r: toSrgbFixed(rLinear), + g: toSrgbFixed(gLinear), + b: toSrgbFixed(bLinear), + }; +} + +/** + * Converts an OKLABA ({@link IOklaba}) object into an RGBA ({@link IRgba}) object + * @param oklaba - the OKLABA ({@link IOklaba}) object + * @returns the {@link IRgba} object + */ +export function oklabaToRgba(oklaba: IOklaba): IRgba { + return { + a: oklaba.a, + ...oklabToRgb(oklaba), + }; +} + +/** + * Gets a CSS style string from an OKLAB ({@link IOklab}) object and an optional opacity value + * @param color - the OKLAB ({@link IOklab}) object + * @param opacity - the opacity value + * @returns the CSS style string + */ +export function getStyleFromOklab(color: IOklab, opacity?: number): string { + const { l, aAxis, bAxis } = color, + alpha = opacity !== undefined ? ` / ${opacity.toString()}` : ""; + + return `oklab(${l.toString()}% ${aAxis.toString()} ${bAxis.toString()}${alpha})`; +} diff --git a/plugins/colors/oklab/tsconfig.base.json b/plugins/colors/oklab/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/plugins/colors/oklab/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/plugins/colors/oklab/tsconfig.browser.json b/plugins/colors/oklab/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/plugins/colors/oklab/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/plugins/colors/oklab/tsconfig.json b/plugins/colors/oklab/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/plugins/colors/oklab/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/plugins/colors/oklab/tsconfig.module.json b/plugins/colors/oklab/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/plugins/colors/oklab/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/plugins/colors/oklab/tsconfig.types.json b/plugins/colors/oklab/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/plugins/colors/oklab/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/plugins/colors/oklab/tsconfig.umd.json b/plugins/colors/oklab/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/plugins/colors/oklab/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/plugins/colors/oklab/typedoc.json b/plugins/colors/oklab/typedoc.json new file mode 100644 index 00000000000..1522ba9a360 --- /dev/null +++ b/plugins/colors/oklab/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles OKLAB Color Plugin", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/plugins/colors/oklab/webpack.config.js b/plugins/colors/oklab/webpack.config.js new file mode 100644 index 00000000000..905c20c492c --- /dev/null +++ b/plugins/colors/oklab/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "oklabColor", + pluginName: "OKLAB Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/oklch/.browserslistrc b/plugins/colors/oklch/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/plugins/colors/oklch/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/plugins/colors/oklch/.npmignore b/plugins/colors/oklch/.npmignore new file mode 100644 index 00000000000..5c901533f98 --- /dev/null +++ b/plugins/colors/oklch/.npmignore @@ -0,0 +1 @@ +report.html \ No newline at end of file diff --git a/plugins/colors/oklchColor/CHANGELOG.md b/plugins/colors/oklch/CHANGELOG.md similarity index 92% rename from plugins/colors/oklchColor/CHANGELOG.md rename to plugins/colors/oklch/CHANGELOG.md index 5a4ea1e5238..764f2475223 100644 --- a/plugins/colors/oklchColor/CHANGELOG.md +++ b/plugins/colors/oklch/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-oklch-color + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-oklch-color diff --git a/plugins/colors/oklch/LICENSE b/plugins/colors/oklch/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/plugins/colors/oklch/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/colors/oklchColor/README.md b/plugins/colors/oklch/README.md similarity index 100% rename from plugins/colors/oklchColor/README.md rename to plugins/colors/oklch/README.md diff --git a/plugins/colors/oklch/eslint.config.js b/plugins/colors/oklch/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/oklch/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/oklchColor/package.dist.json b/plugins/colors/oklch/package.dist.json similarity index 95% rename from plugins/colors/oklchColor/package.dist.json rename to plugins/colors/oklch/package.dist.json index 7e28cda37d1..907a9b2af50 100644 --- a/plugins/colors/oklchColor/package.dist.json +++ b/plugins/colors/oklch/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-oklch-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles OKLCH color plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/colors/oklch/package.json b/plugins/colors/oklch/package.json new file mode 100644 index 00000000000..f3f8b0c6861 --- /dev/null +++ b/plugins/colors/oklch/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-oklch-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles OKLCH color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/oklch" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/oklchColor/src/OklchColorManager.ts b/plugins/colors/oklch/src/OklchColorManager.ts similarity index 55% rename from plugins/colors/oklchColor/src/OklchColorManager.ts rename to plugins/colors/oklch/src/OklchColorManager.ts index 9fc3f484f15..7ed7d68301e 100644 --- a/plugins/colors/oklchColor/src/OklchColorManager.ts +++ b/plugins/colors/oklch/src/OklchColorManager.ts @@ -13,48 +13,52 @@ import { } from "@tsparticles/engine"; import { oklchToRgb, oklchaToRgba } from "./utils.js"; +const oklchRegex = + /oklch\(\s*(\d+(\.\d+)?)%\s+(\d+(\.\d+)?)\s+(\d+(\.\d+)?)(°)?(?:\s*\/\s*(0|1|0?\.\d+|\d{1,3}%))?\s*\)/i; + export class OklchColorManager implements IColorManager { readonly key; - readonly stringPrefix; constructor() { this.key = "oklch"; - this.stringPrefix = "oklch"; + } + + accepts(input: string): boolean { + return input.startsWith("oklch"); } handleColor(color: IColor): IRgb | undefined { const colorValue = color.value as IValueColor, oklchColor = colorValue.oklch ?? (color.value as IOklch); - if (oklchColor.l !== undefined && oklchColor.c !== undefined && oklchColor.h !== undefined) { - return oklchToRgb(oklchColor); + if (!Object.hasOwn(oklchColor, "l") && !Object.hasOwn(oklchColor, "c") && !Object.hasOwn(oklchColor, "h")) { + return; } + + return oklchToRgb(oklchColor); } handleRangeColor(color: IRangeColor): IRgb | undefined { const colorValue = color.value as IRangeValueColor, oklchColor = colorValue.oklch ?? (color.value as IRangeOklch); - if (oklchColor.l !== undefined && oklchColor.c !== undefined && oklchColor.h !== undefined) { - return oklchToRgb({ - l: getRangeValue(oklchColor.l), - c: getRangeValue(oklchColor.c), - h: getRangeValue(oklchColor.h), - }); + if (!Object.hasOwn(oklchColor, "l") && !Object.hasOwn(oklchColor, "c") && !Object.hasOwn(oklchColor, "h")) { + return; } + + return oklchToRgb({ + l: getRangeValue(oklchColor.l), + c: getRangeValue(oklchColor.c), + h: getRangeValue(oklchColor.h), + }); } parseString(input: string): IRgba | undefined { - const isOklch = input.startsWith("oklch"); - - if (!isOklch) { + if (!this.accepts(input)) { return; } - // Adjust regex for both LCH and OKLCH - const regex = - /oklch\(\s*(\d+(\.\d+)?)%\s+(\d+(\.\d+)?)\s+(\d+(\.\d+)?)(°)?(?:\s*\/\s*(0|1|0?\.\d+|\d{1,3}%))?\s*\)/i, - result = regex.exec(input), + const result = oklchRegex.exec(input), indexes = { l: 1, // Lightness c: 3, // Chroma @@ -66,10 +70,10 @@ export class OklchColorManager implements IColorManager { return result ? oklchaToRgba({ a: result[indexes.a] ? parseAlpha(result[indexes.a]) : defaultAlpha, - c: parseFloat(result[indexes.c]), // Chroma - h: parseFloat(result[indexes.h]), // Hue - l: parseFloat(result[indexes.l]), // Lightness + c: parseFloat(result[indexes.c] ?? "0"), // Chroma + h: parseFloat(result[indexes.h] ?? "0"), // Hue + l: parseFloat(result[indexes.l] ?? "0"), // Lightness }) - : undefined; // LCH parsing without alpha + : undefined; // OKLCH parsing without alpha } } diff --git a/plugins/colors/oklch/src/index.ts b/plugins/colors/oklch/src/index.ts new file mode 100644 index 00000000000..a90d16b5ff6 --- /dev/null +++ b/plugins/colors/oklch/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the Oklch color plugin + * @param engine - The engine, used to add the color manager + */ +export function loadOklchColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { OklchColorManager } = await import("./OklchColorManager.js"); + + e.addColorManager(new OklchColorManager()); + }); +} diff --git a/plugins/colors/oklch/src/utils.ts b/plugins/colors/oklch/src/utils.ts new file mode 100644 index 00000000000..5bf1920815d --- /dev/null +++ b/plugins/colors/oklch/src/utils.ts @@ -0,0 +1,97 @@ +import { + type IOklch, + type IOklcha, + type IRgb, + type IRgba, + clamp, + degToRad, + inverseFactorNumerator, + percentDenominator, + rgbMax, +} from "@tsparticles/engine"; + +const OKLAB_LMS = { + l: { L: 1, a: 0.3963377774, b: 0.2158037573 }, + m: { L: 1, a: -0.1055613458, b: -0.0638541728 }, + s: { L: 1, a: -0.0894841775, b: -1.291485548 }, + } as const, + LMS_TO_LINEAR_RGB = { + r: { l: 4.0767416621, m: -3.3077115913, s: 0.2309699292 }, + g: { l: -1.2684380046, m: 2.6097574011, s: -0.3413193965 }, + b: { l: -0.0041960863, m: -0.7034186147, s: 1.707614701 }, + } as const, + SRGB = { + GAMMA: 2.4, + LINEAR_THRESHOLD: 0.0031308, + LINEAR_SCALE: 12.92, + SCALE: 1.055, + OFFSET: 0.055, + } as const, + minSrgbValue = 0, + maxSrgbValue = 1; + +/** + * Converts an OKLCH ({@link IOklch}) object into an RGB ({@link IRgb}) object + * @param oklch - the OKLCH ({@link IOklch}) object + * @returns the {@link IRgb} object + */ +export function oklchToRgb(oklch: IOklch): IRgb { + // 1. Normalize OKLCH + const L = oklch.l / percentDenominator, + C = oklch.c / percentDenominator, + hRad = degToRad(oklch.h), + // 2. OKLCH → OKLAB + a = C * Math.cos(hRad), + b = C * Math.sin(hRad), + // 3. OKLAB → LMS (non-linear) + l_ = OKLAB_LMS.l.L * L + OKLAB_LMS.l.a * a + OKLAB_LMS.l.b * b, + m_ = OKLAB_LMS.m.L * L + OKLAB_LMS.m.a * a + OKLAB_LMS.m.b * b, + s_ = OKLAB_LMS.s.L * L + OKLAB_LMS.s.a * a + OKLAB_LMS.s.b * b, + // 4. Cubic response + cubic = 3, + l = l_ ** cubic, + m = m_ ** cubic, + s = s_ ** cubic, + // 5. LMS → linear sRGB + rLinear = LMS_TO_LINEAR_RGB.r.l * l + LMS_TO_LINEAR_RGB.r.m * m + LMS_TO_LINEAR_RGB.r.s * s, + gLinear = LMS_TO_LINEAR_RGB.g.l * l + LMS_TO_LINEAR_RGB.g.m * m + LMS_TO_LINEAR_RGB.g.s * s, + bLinear = LMS_TO_LINEAR_RGB.b.l * l + LMS_TO_LINEAR_RGB.b.m * m + LMS_TO_LINEAR_RGB.b.s * s, + // 6. Linear → gamma-corrected sRGB + toSrgb = (x: number): number => + x <= SRGB.LINEAR_THRESHOLD + ? SRGB.LINEAR_SCALE * x + : SRGB.SCALE * Math.pow(x, inverseFactorNumerator / SRGB.GAMMA) - SRGB.OFFSET, + toSrgbFixed: (num: number) => number = num => + Math.round(clamp(toSrgb(num), minSrgbValue, maxSrgbValue) * rgbMax); + + return { + r: toSrgbFixed(rLinear), + g: toSrgbFixed(gLinear), + b: toSrgbFixed(bLinear), + }; +} + +/** + * Converts an OKLCHA ({@link IOklcha}) object into an RGBA ({@link IRgba}) object + * @param oklcha - the OKLCHA ({@link IOklcha}) object + * @returns the {@link IRgba} object + */ +export function oklchaToRgba(oklcha: IOklcha): IRgba { + return { + a: oklcha.a, + ...oklchToRgb(oklcha), + }; +} + +/** + * Gets a CSS style string from an OKLCH ({@link IOklch}) object and an optional opacity value + * @param color - the OKLCH ({@link IOklch}) object + * @param opacity - the opacity value + * @returns the CSS style string + */ +export function getStyleFromOklch(color: IOklch, opacity?: number): string { + const { l, c, h } = color, + alpha = opacity !== undefined ? ` / ${opacity.toString()}` : ""; + + return `oklch(${l.toString()}% ${c.toString()}% ${h.toString()}°${alpha})`; +} diff --git a/plugins/colors/oklch/tsconfig.base.json b/plugins/colors/oklch/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/plugins/colors/oklch/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/plugins/colors/oklch/tsconfig.browser.json b/plugins/colors/oklch/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/plugins/colors/oklch/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/plugins/colors/oklch/tsconfig.json b/plugins/colors/oklch/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/plugins/colors/oklch/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/plugins/colors/oklch/tsconfig.module.json b/plugins/colors/oklch/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/plugins/colors/oklch/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/plugins/colors/oklch/tsconfig.types.json b/plugins/colors/oklch/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/plugins/colors/oklch/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/plugins/colors/oklch/tsconfig.umd.json b/plugins/colors/oklch/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/plugins/colors/oklch/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/plugins/colors/oklchColor/typedoc.json b/plugins/colors/oklch/typedoc.json similarity index 100% rename from plugins/colors/oklchColor/typedoc.json rename to plugins/colors/oklch/typedoc.json diff --git a/plugins/colors/oklch/webpack.config.js b/plugins/colors/oklch/webpack.config.js new file mode 100644 index 00000000000..5d3b8892ffb --- /dev/null +++ b/plugins/colors/oklch/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "oklchColor", + pluginName: "OKLCH Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/oklchColor/.eslintignore b/plugins/colors/oklchColor/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/colors/oklchColor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/colors/oklchColor/.eslintrc.js b/plugins/colors/oklchColor/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/colors/oklchColor/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/colors/oklchColor/package.json b/plugins/colors/oklchColor/package.json deleted file mode 100644 index fecc257ecee..00000000000 --- a/plugins/colors/oklchColor/package.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "name": "@tsparticles/plugin-oklch-color", - "version": "3.9.1", - "description": "tsParticles OKLCH color plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/colors/oklchColor" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } -} diff --git a/plugins/colors/oklchColor/src/index.ts b/plugins/colors/oklchColor/src/index.ts deleted file mode 100644 index 6abbec4ea93..00000000000 --- a/plugins/colors/oklchColor/src/index.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { type Engine } from "@tsparticles/engine"; -import { LchColorManager } from "./LchColorManager.js"; -import { OklchColorManager } from "./OklchColorManager.js"; - -declare const __VERSION__: string; - -/** - * This function is used to load the Oklch color plugin - * @param engine - The engine, used to add the color manager - * @param refresh - Whether the plugin is being refreshed - * @returns A promise that resolves when the plugin is loaded - */ -export async function loadOklchColorPlugin(engine: Engine, refresh = true): Promise { - engine.checkVersion(__VERSION__); - - await engine.addColorManager(new OklchColorManager(), refresh); - await engine.addColorManager(new LchColorManager(), refresh); -} diff --git a/plugins/colors/oklchColor/src/utils.ts b/plugins/colors/oklchColor/src/utils.ts deleted file mode 100644 index 6fde48df729..00000000000 --- a/plugins/colors/oklchColor/src/utils.ts +++ /dev/null @@ -1,94 +0,0 @@ -import { - type ILch, - type ILcha, - type IOklch, - type IOklcha, - type IRgb, - type IRgba, - percentDenominator, -} from "@tsparticles/engine"; - -const rgbFactor = 255, - fullDegree = 360; - -/** - * Converts an LCH ({@link ILch}) object into an RGB ({@link IRgb}) object - * @param lch - the LCH object - * @returns the {@link IRgb} object - */ -export function lchToRgb(lch: ILch): IRgb { - // Similar conversion logic as OKLCH, but adapted for LCH - const l = lch.l / percentDenominator, - c = lch.c, - h = lch.h / fullDegree, - result: IRgb = { r: 0, g: 0, b: 0 }; - - result.r = Math.floor(l * rgbFactor); // Example formula - result.g = Math.floor(c * rgbFactor); - result.b = Math.floor(h * rgbFactor); - - return result; -} - -/** - * Converts an LCHA ({@link ILcha}) object into an RGBA ({@link IRgba}) object - * @param lcha - the LCHA object - * @returns the {@link IRgba} object - */ -export function lchaToRgba(lcha: ILcha): IRgba { - return { - a: lcha.a, - ...lchToRgb(lcha), - }; -} - -/** - * Converts an OKLCH ({@link IOklch}) object into an RGB ({@link IRgb}) object - * @param oklch - the OKLCH ({@link IOklch}) object - * @returns the {@link IRgb} object - */ -export function oklchToRgb(oklch: IOklch): IRgb { - // Conversion logic from OKLCH to RGB (simplified, using a library is better for precision) - // You might use a pre-existing function for accurate color space conversion, but here’s an approximation - // Placeholder for conversion logic - - const l = oklch.l / percentDenominator, // Normalize lightness - c = oklch.c / percentDenominator, // Normalize chroma - h = oklch.h / fullDegree, // Normalize hue to 0-1 - // Simplified example of how to calculate rgb values based on l, c, h - result: IRgb = { r: 0, g: 0, b: 0 }; - - // Conversion would involve more accurate math and handling for out-of-gamut colors - // Use l, c, h in a way that accurately converts to RGB - - result.r = Math.floor(l * rgbFactor); // This is a placeholder formula - result.g = Math.floor(c * rgbFactor); - result.b = Math.floor(h * rgbFactor); - - return result; -} - -/** - * Converts an OKLCHA ({@link IOklcha}) object into an RGBA ({@link IRgba}) object - * @param oklcha - the OKLCHA ({@link IOklcha}) object - * @returns the {@link IRgba} object - */ -export function oklchaToRgba(oklcha: IOklcha): IRgba { - return { - a: oklcha.a, - ...oklchToRgb(oklcha), - }; -} - -/** - * Gets a CSS style string from an OKLCH ({@link IOklch}) object and an optional opacity value - * @param color - the OKLCH ({@link IOklch}) object - * @param opacity - the opacity value - * @returns the CSS style string - */ -export function getStyleFromOklch(color: IOklch, opacity?: number): string { - const { l, c, h } = color, - alpha = opacity !== undefined ? `, ${opacity}` : ""; - - return `oklch(${l}%, ${c}%, ${h}°${alpha})`; -} diff --git a/plugins/colors/oklchColor/webpack.config.js b/plugins/colors/oklchColor/webpack.config.js deleted file mode 100644 index b42dc460288..00000000000 --- a/plugins/colors/oklchColor/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; - -module.exports = loadParticlesPlugin({ - moduleName: "oklchColor", - pluginName: "OKLCH Color", - version, - dir: __dirname, -}); diff --git a/plugins/colors/rgb/.browserslistrc b/plugins/colors/rgb/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/plugins/colors/rgb/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/plugins/colors/rgb/.npmignore b/plugins/colors/rgb/.npmignore new file mode 100644 index 00000000000..5c901533f98 --- /dev/null +++ b/plugins/colors/rgb/.npmignore @@ -0,0 +1 @@ +report.html \ No newline at end of file diff --git a/plugins/colors/rgbColor/CHANGELOG.md b/plugins/colors/rgb/CHANGELOG.md similarity index 88% rename from plugins/colors/rgbColor/CHANGELOG.md rename to plugins/colors/rgb/CHANGELOG.md index 594e10a192e..c5c4f42e5ac 100644 --- a/plugins/colors/rgbColor/CHANGELOG.md +++ b/plugins/colors/rgb/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-rgb-color + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-rgb-color diff --git a/plugins/colors/rgb/LICENSE b/plugins/colors/rgb/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/plugins/colors/rgb/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/colors/rgbColor/README.md b/plugins/colors/rgb/README.md similarity index 100% rename from plugins/colors/rgbColor/README.md rename to plugins/colors/rgb/README.md diff --git a/plugins/colors/rgb/eslint.config.js b/plugins/colors/rgb/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/colors/rgb/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/colors/rgbColor/package.dist.json b/plugins/colors/rgb/package.dist.json similarity index 95% rename from plugins/colors/rgbColor/package.dist.json rename to plugins/colors/rgb/package.dist.json index 69519b226a5..811377073a8 100644 --- a/plugins/colors/rgbColor/package.dist.json +++ b/plugins/colors/rgb/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-rgb-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles RGB color plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/colors/rgb/package.json b/plugins/colors/rgb/package.json new file mode 100644 index 00000000000..30b55c03615 --- /dev/null +++ b/plugins/colors/rgb/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/plugin-rgb-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles RGB color plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/colors/rgb" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/colors/rgbColor/src/RgbColorManager.ts b/plugins/colors/rgb/src/RgbColorManager.ts similarity index 58% rename from plugins/colors/rgbColor/src/RgbColorManager.ts rename to plugins/colors/rgb/src/RgbColorManager.ts index 3be5fd2c0ee..4aa2cfb6952 100644 --- a/plugins/colors/rgbColor/src/RgbColorManager.ts +++ b/plugins/colors/rgb/src/RgbColorManager.ts @@ -17,47 +17,54 @@ enum RgbIndexes { a = 5, } +const rgbRegex = + /rgba?\(\s*(\d{1,3})\s*[\s,]\s*(\d{1,3})\s*[\s,]\s*(\d{1,3})\s*([\s,]\s*(0|1|0?\.\d+|(\d{1,3})%)\s*)?\)/i; + /** */ export class RgbColorManager implements IColorManager { readonly key; - readonly stringPrefix; constructor() { this.key = "rgb"; - this.stringPrefix = "rgb"; + } + + accepts(input: string): boolean { + return input.startsWith("rgb"); } handleColor(color: IColor): IRgb | undefined { const colorValue = color.value as IValueColor, rgbColor = colorValue.rgb ?? (color.value as IRgb); - if (rgbColor.r !== undefined) { - return rgbColor; + if (!Object.hasOwn(rgbColor, "r")) { + return; } + + return rgbColor; } handleRangeColor(color: IRangeColor): IRgb | undefined { const colorValue = color.value as IValueColor, rgbColor = colorValue.rgb ?? (color.value as IRangeRgb); - if (rgbColor.r !== undefined) { - return { - r: getRangeValue(rgbColor.r), - g: getRangeValue(rgbColor.g), - b: getRangeValue(rgbColor.b), - }; + if (!Object.hasOwn(rgbColor, "r")) { + return; } + + return { + r: getRangeValue(rgbColor.r), + g: getRangeValue(rgbColor.g), + b: getRangeValue(rgbColor.b), + }; } parseString(input: string): IRgba | undefined { - if (!input.startsWith(this.stringPrefix)) { + if (!this.accepts(input)) { return; } - const regex = - /rgba?\(\s*(\d{1,3})\s*[\s,]\s*(\d{1,3})\s*[\s,]\s*(\d{1,3})\s*([\s,]\s*(0|1|0?\.\d+|(\d{1,3})%)\s*)?\)/i, - result = regex.exec(input), + const result = rgbRegex.exec(input), radix = 10, minLength = 4, defaultAlpha = 1; @@ -65,9 +72,9 @@ export class RgbColorManager implements IColorManager { return result ? { a: result.length > minLength ? parseAlpha(result[RgbIndexes.a]) : defaultAlpha, - b: parseInt(result[RgbIndexes.b], radix), - g: parseInt(result[RgbIndexes.g], radix), - r: parseInt(result[RgbIndexes.r], radix), + b: parseInt(result[RgbIndexes.b] ?? "0", radix), + g: parseInt(result[RgbIndexes.g] ?? "0", radix), + r: parseInt(result[RgbIndexes.r] ?? "0", radix), } : undefined; } diff --git a/plugins/colors/rgb/src/index.ts b/plugins/colors/rgb/src/index.ts new file mode 100644 index 00000000000..4fc24bf20b1 --- /dev/null +++ b/plugins/colors/rgb/src/index.ts @@ -0,0 +1,17 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * This function is used to load the RGB color plugin + * @param engine - The engine that will use the plugin + */ +export function loadRgbColorPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { RgbColorManager } = await import("./RgbColorManager.js"); + + e.addColorManager(new RgbColorManager()); + }); +} diff --git a/plugins/colors/rgb/tsconfig.base.json b/plugins/colors/rgb/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/plugins/colors/rgb/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/plugins/colors/rgb/tsconfig.browser.json b/plugins/colors/rgb/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/plugins/colors/rgb/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/plugins/colors/rgb/tsconfig.json b/plugins/colors/rgb/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/plugins/colors/rgb/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/plugins/colors/rgb/tsconfig.module.json b/plugins/colors/rgb/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/plugins/colors/rgb/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/plugins/colors/rgb/tsconfig.types.json b/plugins/colors/rgb/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/plugins/colors/rgb/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/plugins/colors/rgb/tsconfig.umd.json b/plugins/colors/rgb/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/plugins/colors/rgb/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/plugins/colors/rgbColor/typedoc.json b/plugins/colors/rgb/typedoc.json similarity index 100% rename from plugins/colors/rgbColor/typedoc.json rename to plugins/colors/rgb/typedoc.json diff --git a/plugins/colors/rgb/webpack.config.js b/plugins/colors/rgb/webpack.config.js new file mode 100644 index 00000000000..532de6b3ebf --- /dev/null +++ b/plugins/colors/rgb/webpack.config.js @@ -0,0 +1,17 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ + moduleName: "rgbColor", + pluginName: "RGB Color", + version, + dir: __dirname, +}); diff --git a/plugins/colors/rgbColor/.eslintignore b/plugins/colors/rgbColor/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/colors/rgbColor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/colors/rgbColor/.eslintrc.js b/plugins/colors/rgbColor/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/colors/rgbColor/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/colors/rgbColor/package.json b/plugins/colors/rgbColor/package.json deleted file mode 100644 index b3f86c84c30..00000000000 --- a/plugins/colors/rgbColor/package.json +++ /dev/null @@ -1,118 +0,0 @@ -{ - "name": "@tsparticles/plugin-rgb-color", - "version": "3.9.1", - "description": "tsParticles RGB color plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/colors/rgbColor" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } -} diff --git a/plugins/colors/rgbColor/src/index.ts b/plugins/colors/rgbColor/src/index.ts deleted file mode 100644 index 67f06479f97..00000000000 --- a/plugins/colors/rgbColor/src/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { type Engine } from "@tsparticles/engine"; -import { RgbColorManager } from "./RgbColorManager.js"; - -declare const __VERSION__: string; - -/** - * This function is used to load the RGB color plugin - * @param engine - The engine that will use the plugin - * @param refresh - If the engine should be refreshed after the plugin is loaded - * @returns A promise that resolves when the plugin is loaded - */ -export async function loadRgbColorPlugin(engine: Engine, refresh = true): Promise { - engine.checkVersion(__VERSION__); - - await engine.addColorManager(new RgbColorManager(), refresh); -} diff --git a/plugins/colors/rgbColor/webpack.config.js b/plugins/colors/rgbColor/webpack.config.js deleted file mode 100644 index d52ea592979..00000000000 --- a/plugins/colors/rgbColor/webpack.config.js +++ /dev/null @@ -1,9 +0,0 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; - -module.exports = loadParticlesPlugin({ - moduleName: "rgbColor", - pluginName: "RGB Color", - version, - dir: __dirname, -}); diff --git a/plugins/easings/back/.eslintignore b/plugins/easings/back/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/back/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/back/.eslintrc.js b/plugins/easings/back/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/back/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/back/CHANGELOG.md b/plugins/easings/back/CHANGELOG.md index f11df31fceb..01c94cb6517 100644 --- a/plugins/easings/back/CHANGELOG.md +++ b/plugins/easings/back/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-back + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-back diff --git a/plugins/easings/back/eslint.config.js b/plugins/easings/back/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/back/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/back/package.dist.json b/plugins/easings/back/package.dist.json index 5fc0cf30777..8ab70441f15 100644 --- a/plugins/easings/back/package.dist.json +++ b/plugins/easings/back/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-back", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing back plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/back/package.json b/plugins/easings/back/package.json index bdb95be273f..82d20e3de53 100644 --- a/plugins/easings/back/package.json +++ b/plugins/easings/back/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-back", - "version": "3.9.1", - "description": "tsParticles easing back plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-back", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing back plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/back" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/back" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/back/src/index.ts b/plugins/easings/back/src/index.ts index 0e2e23aeb71..635188e3f85 100644 --- a/plugins/easings/back/src/index.ts +++ b/plugins/easings/back/src/index.ts @@ -1,50 +1,36 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingBackPlugin(engine: Engine, refresh = true): Promise { +export function loadEasingBackPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing( - EasingType.easeInBack, - value => { + engine.register(e => { + e.addEasing(EasingType.easeInBack, value => { const c1 = 1.70158, c3 = c1 + 1; return c3 * value ** 3 - c1 * value ** 2; - }, - false, - ); + }); - await engine.addEasing( - EasingType.easeOutBack, - value => { + e.addEasing(EasingType.easeOutBack, value => { const c1 = 1.70158, c3 = c1 + 1; return 1 + c3 * Math.pow(value - 1, 3) + c1 * Math.pow(value - 1, 2); - }, - false, - ); + }); - await engine.addEasing( - EasingType.easeInOutBack, - value => { + e.addEasing(EasingType.easeInOutBack, value => { const c1 = 1.70158, c2 = c1 * 1.525; return value < 0.5 ? ((2 * value) ** 2 * ((c2 + 1) * 2 * value - c2)) / 2 : ((2 * value - 2) ** 2 * ((c2 + 1) * (value * 2 - 2) + c2) + 2) / 2; - }, - false, - ); - - await engine.refresh(refresh); + }); + }); } diff --git a/plugins/easings/back/webpack.config.js b/plugins/easings/back/webpack.config.js index 24b46c4d6fc..095d928621e 100644 --- a/plugins/easings/back/webpack.config.js +++ b/plugins/easings/back/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "back", pluginName: "Back", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "back", pluginName: "Back", version, dir: __dirname }); diff --git a/plugins/easings/circ/.eslintignore b/plugins/easings/circ/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/circ/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/circ/.eslintrc.js b/plugins/easings/circ/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/circ/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/circ/CHANGELOG.md b/plugins/easings/circ/CHANGELOG.md index c625def4716..f5c6917bbc8 100644 --- a/plugins/easings/circ/CHANGELOG.md +++ b/plugins/easings/circ/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-circ + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-circ diff --git a/plugins/easings/circ/eslint.config.js b/plugins/easings/circ/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/circ/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/circ/package.dist.json b/plugins/easings/circ/package.dist.json index a1241ce8229..fd303a46b5c 100644 --- a/plugins/easings/circ/package.dist.json +++ b/plugins/easings/circ/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-circ", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing circ plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/circ/package.json b/plugins/easings/circ/package.json index 92350ac5bee..4d198dc06c4 100644 --- a/plugins/easings/circ/package.json +++ b/plugins/easings/circ/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-circ", - "version": "3.9.1", - "description": "tsParticles easing circ plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-circ", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing circ plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/circ" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/circ" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/circ/src/index.ts b/plugins/easings/circ/src/index.ts index cb4c03988b9..595377ab7e8 100644 --- a/plugins/easings/circ/src/index.ts +++ b/plugins/easings/circ/src/index.ts @@ -1,24 +1,19 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingCircPlugin(engine: Engine, refresh: false): Promise { +export function loadEasingCircPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing(EasingType.easeInCirc, value => 1 - Math.sqrt(1 - value ** 2), false); - await engine.addEasing(EasingType.easeOutCirc, value => Math.sqrt(1 - (value - 1) ** 2), false); - await engine.addEasing( - EasingType.easeInOutCirc, - value => + engine.register(e => { + e.addEasing(EasingType.easeInCirc, value => 1 - Math.sqrt(1 - value ** 2)); + e.addEasing(EasingType.easeOutCirc, value => Math.sqrt(1 - (value - 1) ** 2)); + e.addEasing(EasingType.easeInOutCirc, value => value < 0.5 ? (1 - Math.sqrt(1 - (2 * value) ** 2)) / 2 : (Math.sqrt(1 - (-2 * value + 2) ** 2) + 1) / 2, - false, - ); - - await engine.refresh(refresh); + ); + }); } diff --git a/plugins/easings/circ/webpack.config.js b/plugins/easings/circ/webpack.config.js index 64928caf681..6260663315d 100644 --- a/plugins/easings/circ/webpack.config.js +++ b/plugins/easings/circ/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "circ", pluginName: "Circ", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "circ", pluginName: "Circ", version, dir: __dirname }); diff --git a/plugins/easings/cubic/.eslintignore b/plugins/easings/cubic/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/cubic/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/cubic/.eslintrc.js b/plugins/easings/cubic/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/cubic/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/cubic/CHANGELOG.md b/plugins/easings/cubic/CHANGELOG.md index 5295f48e023..eb53c707626 100644 --- a/plugins/easings/cubic/CHANGELOG.md +++ b/plugins/easings/cubic/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-cubic + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-cubic diff --git a/plugins/easings/cubic/eslint.config.js b/plugins/easings/cubic/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/cubic/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/cubic/package.dist.json b/plugins/easings/cubic/package.dist.json index c1324363a3b..eb7fd0c3612 100644 --- a/plugins/easings/cubic/package.dist.json +++ b/plugins/easings/cubic/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-cubic", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing cubic plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/cubic/package.json b/plugins/easings/cubic/package.json index e5f28bca86a..7ec4691f942 100644 --- a/plugins/easings/cubic/package.json +++ b/plugins/easings/cubic/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-cubic", - "version": "3.9.1", - "description": "tsParticles easing cubic plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-cubic", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing cubic plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/cubic" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/cubic" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/cubic/src/index.ts b/plugins/easings/cubic/src/index.ts index ac71feba5c0..cb4b6e224e2 100644 --- a/plugins/easings/cubic/src/index.ts +++ b/plugins/easings/cubic/src/index.ts @@ -1,23 +1,17 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingCubicPlugin(engine: Engine, refresh = true): Promise { +export function loadEasingCubicPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing(EasingType.easeInCubic, value => value ** 3, false); - await engine.addEasing(EasingType.easeOutCubic, value => 1 - (1 - value) ** 3, false); - await engine.addEasing( - EasingType.easeInOutCubic, - value => (value < 0.5 ? 4 * value ** 3 : 1 - (-2 * value + 2) ** 3 / 2), - false, - ); - - await engine.refresh(refresh); + engine.register(e => { + e.addEasing(EasingType.easeInCubic, value => value ** 3); + e.addEasing(EasingType.easeOutCubic, value => 1 - (1 - value) ** 3); + e.addEasing(EasingType.easeInOutCubic, value => (value < 0.5 ? 4 * value ** 3 : 1 - (-2 * value + 2) ** 3 / 2)); + }); } diff --git a/plugins/easings/cubic/webpack.config.js b/plugins/easings/cubic/webpack.config.js index f9edce9b627..a4cf188187e 100644 --- a/plugins/easings/cubic/webpack.config.js +++ b/plugins/easings/cubic/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "cubic", pluginName: "Cubic", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "cubic", pluginName: "Cubic", version, dir: __dirname }); diff --git a/plugins/easings/expo/.eslintignore b/plugins/easings/expo/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/expo/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/expo/.eslintrc.js b/plugins/easings/expo/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/expo/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/expo/CHANGELOG.md b/plugins/easings/expo/CHANGELOG.md index 8201d817f21..a858b677b80 100644 --- a/plugins/easings/expo/CHANGELOG.md +++ b/plugins/easings/expo/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-expo + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-expo diff --git a/plugins/easings/expo/eslint.config.js b/plugins/easings/expo/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/expo/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/expo/package.dist.json b/plugins/easings/expo/package.dist.json index b67b5c315d7..97948adf3a1 100644 --- a/plugins/easings/expo/package.dist.json +++ b/plugins/easings/expo/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-expo", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing expo plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/expo/package.json b/plugins/easings/expo/package.json index 54334e8a0fc..148f9a717cb 100644 --- a/plugins/easings/expo/package.json +++ b/plugins/easings/expo/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-expo", - "version": "3.9.1", - "description": "tsParticles easing expo plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-expo", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing expo plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/expo" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/expo" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/expo/src/index.ts b/plugins/easings/expo/src/index.ts index 73d3d66d994..3e00fc6791e 100644 --- a/plugins/easings/expo/src/index.ts +++ b/plugins/easings/expo/src/index.ts @@ -1,31 +1,25 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingExpoPlugin(engine: Engine, refresh = true): Promise { +export function loadEasingExpoPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing(EasingType.easeInExpo, value => (!value ? 0 : 2 ** (10 * value - 10)), false); - await engine.addEasing(EasingType.easeOutExpo, value => (value === 1 ? 1 : 1 - Math.pow(2, -10 * value)), false); - await engine.addEasing( - EasingType.easeInOutExpo, - value => { + engine.register(e => { + e.addEasing(EasingType.easeInExpo, value => (value ? 2 ** (10 * value - 10) : 0)); + e.addEasing(EasingType.easeOutExpo, value => (value === 1 ? 1 : 1 - Math.pow(2, -10 * value))); + e.addEasing(EasingType.easeInOutExpo, value => { if (value === 1) { - return !value ? 0 : 1; - } else if (!value) { - return 0; - } else { + return 1; + } else if (value) { return value < 0.5 ? 2 ** (20 * value - 10) / 2 : (2 - 2 ** (-20 * value + 10)) / 2; + } else { + return 0; } - }, - false, - ); - - await engine.refresh(refresh); + }); + }); } diff --git a/plugins/easings/expo/webpack.config.js b/plugins/easings/expo/webpack.config.js index ad68d02d2aa..e738cd44a41 100644 --- a/plugins/easings/expo/webpack.config.js +++ b/plugins/easings/expo/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "expo", pluginName: "Expo", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "expo", pluginName: "Expo", version, dir: __dirname }); diff --git a/plugins/easings/linear/.eslintignore b/plugins/easings/linear/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/linear/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/linear/.eslintrc.js b/plugins/easings/linear/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/linear/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/linear/CHANGELOG.md b/plugins/easings/linear/CHANGELOG.md index 49458acb8f4..4111b12d763 100644 --- a/plugins/easings/linear/CHANGELOG.md +++ b/plugins/easings/linear/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-linear + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-linear diff --git a/plugins/easings/linear/eslint.config.js b/plugins/easings/linear/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/linear/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/linear/package.dist.json b/plugins/easings/linear/package.dist.json index 6a41045077a..106ab9676d4 100644 --- a/plugins/easings/linear/package.dist.json +++ b/plugins/easings/linear/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-linear", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing linear plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/linear/package.json b/plugins/easings/linear/package.json index 5a84919125b..ef30d459814 100644 --- a/plugins/easings/linear/package.json +++ b/plugins/easings/linear/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-linear", - "version": "3.9.1", - "description": "tsParticles easing linear plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-linear", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing linear plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/linear" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/linear" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/linear/src/index.ts b/plugins/easings/linear/src/index.ts index 0b40dd65d14..6577a34d824 100644 --- a/plugins/easings/linear/src/index.ts +++ b/plugins/easings/linear/src/index.ts @@ -4,34 +4,13 @@ declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingLinearPlugin(engine: Engine, refresh = true): Promise { +export function loadEasingLinearPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing( - EasingType.easeInLinear, - value => { - return value; - }, - false, - ); - - await engine.addEasing( - EasingType.easeOutLinear, - value => { - return value; - }, - false, - ); - - await engine.addEasing( - EasingType.easeInOutLinear, - value => { - return value; - }, - false, - ); - - await engine.refresh(refresh); + engine.register(e => { + e.addEasing(EasingType.easeInLinear, value => value); + e.addEasing(EasingType.easeOutLinear, value => value); + e.addEasing(EasingType.easeInOutLinear, value => value); + }); } diff --git a/plugins/easings/linear/webpack.config.js b/plugins/easings/linear/webpack.config.js index a7ad5eaef15..b3dbf39d6be 100644 --- a/plugins/easings/linear/webpack.config.js +++ b/plugins/easings/linear/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "linear", pluginName: "Linear", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "linear", pluginName: "Linear", version, dir: __dirname }); diff --git a/plugins/easings/quad/.eslintignore b/plugins/easings/quad/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/quad/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/quad/.eslintrc.js b/plugins/easings/quad/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/quad/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/quad/CHANGELOG.md b/plugins/easings/quad/CHANGELOG.md index 82c280e3938..55f49282007 100644 --- a/plugins/easings/quad/CHANGELOG.md +++ b/plugins/easings/quad/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-quad + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-quad diff --git a/plugins/easings/quad/eslint.config.js b/plugins/easings/quad/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/quad/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/quad/package.dist.json b/plugins/easings/quad/package.dist.json index def1f87b4c6..eaccbd13982 100644 --- a/plugins/easings/quad/package.dist.json +++ b/plugins/easings/quad/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-quad", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing quad plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/quad/package.json b/plugins/easings/quad/package.json index 16fc098592d..fc6c41cecc4 100644 --- a/plugins/easings/quad/package.json +++ b/plugins/easings/quad/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-quad", - "version": "3.9.1", - "description": "tsParticles easing quad plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-quad", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing quad plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/quad" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/quad" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/quad/src/index.ts b/plugins/easings/quad/src/index.ts index 8c4f5946aea..922178efa5b 100644 --- a/plugins/easings/quad/src/index.ts +++ b/plugins/easings/quad/src/index.ts @@ -1,23 +1,17 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingQuadPlugin(engine: Engine, refresh = true): Promise { +export function loadEasingQuadPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing(EasingType.easeInQuad, value => value ** 2, false); - await engine.addEasing(EasingType.easeOutQuad, value => 1 - (1 - value) ** 2, false); - await engine.addEasing( - EasingType.easeInOutQuad, - value => (value < 0.5 ? 2 * value ** 2 : 1 - (-2 * value + 2) ** 2 / 2), - false, - ); - - await engine.refresh(refresh); + engine.register(e => { + e.addEasing(EasingType.easeInQuad, value => value ** 2); + e.addEasing(EasingType.easeOutQuad, value => 1 - (1 - value) ** 2); + e.addEasing(EasingType.easeInOutQuad, value => (value < 0.5 ? 2 * value ** 2 : 1 - (-2 * value + 2) ** 2 / 2)); + }); } diff --git a/plugins/easings/quad/webpack.config.js b/plugins/easings/quad/webpack.config.js index ccabc4422e5..5e5d435d7c2 100644 --- a/plugins/easings/quad/webpack.config.js +++ b/plugins/easings/quad/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "quad", pluginName: "Quad", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "quad", pluginName: "Quad", version, dir: __dirname }); diff --git a/plugins/easings/quart/.eslintignore b/plugins/easings/quart/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/quart/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/quart/.eslintrc.js b/plugins/easings/quart/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/quart/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/quart/CHANGELOG.md b/plugins/easings/quart/CHANGELOG.md index 381e432b5e8..6529e596ca0 100644 --- a/plugins/easings/quart/CHANGELOG.md +++ b/plugins/easings/quart/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-quart + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-quart diff --git a/plugins/easings/quart/eslint.config.js b/plugins/easings/quart/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/quart/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/quart/package.dist.json b/plugins/easings/quart/package.dist.json index 27a4de59bcf..0cdd3cee7ee 100644 --- a/plugins/easings/quart/package.dist.json +++ b/plugins/easings/quart/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-quart", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing quart plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/quart/package.json b/plugins/easings/quart/package.json index aaa95269f9c..e316e45f72f 100644 --- a/plugins/easings/quart/package.json +++ b/plugins/easings/quart/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-quart", - "version": "3.9.1", - "description": "tsParticles easing quart plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-quart", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing quart plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/quart" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/quart" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/quart/src/index.ts b/plugins/easings/quart/src/index.ts index 6844b580dd4..77ccab3fe9f 100644 --- a/plugins/easings/quart/src/index.ts +++ b/plugins/easings/quart/src/index.ts @@ -1,22 +1,17 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingQuartPlugin(engine: Engine, refresh = true): Promise { +export function loadEasingQuartPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing(EasingType.easeInQuart, value => value ** 4, false); - await engine.addEasing(EasingType.easeOutQuart, value => 1 - (1 - value) ** 4, false); - await engine.addEasing( - EasingType.easeInOutQuart, - value => (value < 0.5 ? 8 * value ** 4 : 1 - (-2 * value + 2) ** 4 / 2), - false, - ); - await engine.refresh(refresh); + engine.register(e => { + e.addEasing(EasingType.easeInQuart, value => value ** 4); + e.addEasing(EasingType.easeOutQuart, value => 1 - (1 - value) ** 4); + e.addEasing(EasingType.easeInOutQuart, value => (value < 0.5 ? 8 * value ** 4 : 1 - (-2 * value + 2) ** 4 / 2)); + }); } diff --git a/plugins/easings/quart/webpack.config.js b/plugins/easings/quart/webpack.config.js index cff641bbfe2..769facdde10 100644 --- a/plugins/easings/quart/webpack.config.js +++ b/plugins/easings/quart/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "quart", pluginName: "Quart", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "quart", pluginName: "Quart", version, dir: __dirname }); diff --git a/plugins/easings/quint/.eslintignore b/plugins/easings/quint/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/quint/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/quint/.eslintrc.js b/plugins/easings/quint/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/quint/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/quint/CHANGELOG.md b/plugins/easings/quint/CHANGELOG.md index 72eeb134f2b..f231733c134 100644 --- a/plugins/easings/quint/CHANGELOG.md +++ b/plugins/easings/quint/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-quint + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-quint diff --git a/plugins/easings/quint/eslint.config.js b/plugins/easings/quint/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/quint/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/quint/package.dist.json b/plugins/easings/quint/package.dist.json index 5d44615586a..55ca53048c1 100644 --- a/plugins/easings/quint/package.dist.json +++ b/plugins/easings/quint/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-quint", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing quint plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/quint/package.json b/plugins/easings/quint/package.json index d801dbca4fe..f9a806d2c1e 100644 --- a/plugins/easings/quint/package.json +++ b/plugins/easings/quint/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-quint", - "version": "3.9.1", - "description": "tsParticles easing quint plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-quint", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing quint plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/quint" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/quint" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/quint/src/index.ts b/plugins/easings/quint/src/index.ts index d055468b498..c00a1d73c94 100644 --- a/plugins/easings/quint/src/index.ts +++ b/plugins/easings/quint/src/index.ts @@ -1,23 +1,19 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingQuintPlugin(engine: Engine, refresh = true): Promise { +export function loadEasingQuintPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing(EasingType.easeInQuint, value => value ** 5, false); - await engine.addEasing(EasingType.easeOutQuint, value => 1 - (1 - value) ** 5, false); - await engine.addEasing( - EasingType.easeInOutQuint, - value => (value < 0.5 ? 16 * value ** 5 : 1 - (-2 * value + 2) ** 5 / 2), - false, - ); - - await engine.refresh(refresh); + engine.register(e => { + e.addEasing(EasingType.easeInQuint, value => value ** 5); + e.addEasing(EasingType.easeOutQuint, value => 1 - (1 - value) ** 5); + e.addEasing(EasingType.easeInOutQuint, value => + value < 0.5 ? 16 * value ** 5 : 1 - (-2 * value + 2) ** 5 / 2, + ); + }); } diff --git a/plugins/easings/quint/webpack.config.js b/plugins/easings/quint/webpack.config.js index 0874590e970..9eb9dc3fe35 100644 --- a/plugins/easings/quint/webpack.config.js +++ b/plugins/easings/quint/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "quint", pluginName: "Quint", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "quint", pluginName: "Quint", version, dir: __dirname }); diff --git a/plugins/easings/sine/.eslintignore b/plugins/easings/sine/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/easings/sine/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/easings/sine/.eslintrc.js b/plugins/easings/sine/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/easings/sine/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/easings/sine/CHANGELOG.md b/plugins/easings/sine/CHANGELOG.md index a0c7ecc07c4..993fa7fa339 100644 --- a/plugins/easings/sine/CHANGELOG.md +++ b/plugins/easings/sine/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-easing-sine + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-easing-sine diff --git a/plugins/easings/sine/eslint.config.js b/plugins/easings/sine/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/easings/sine/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/easings/sine/package.dist.json b/plugins/easings/sine/package.dist.json index 2201470271b..fdb47b37c23 100644 --- a/plugins/easings/sine/package.dist.json +++ b/plugins/easings/sine/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-easing-sine", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles easing sine plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/easings/sine/package.json b/plugins/easings/sine/package.json index ba2a5041977..3b900a7f780 100644 --- a/plugins/easings/sine/package.json +++ b/plugins/easings/sine/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-easing-sine", - "version": "3.9.1", - "description": "tsParticles easing sine plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-easing-sine", + "version": "4.0.0-alpha.0", + "description": "tsParticles easing sine plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/easings/sine" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/easings/sine" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/easings/sine/src/index.ts b/plugins/easings/sine/src/index.ts index 91aea9d783b..4e36aa5f3c2 100644 --- a/plugins/easings/sine/src/index.ts +++ b/plugins/easings/sine/src/index.ts @@ -1,19 +1,17 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ - import { EasingType, type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEasingSinePlugin(engine: Engine, refresh = true): Promise { +export function loadEasingSinePlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addEasing(EasingType.easeInSine, value => 1 - Math.cos((value * Math.PI) / 2), false); - await engine.addEasing(EasingType.easeOutSine, value => Math.sin((value * Math.PI) / 2), false); - await engine.addEasing(EasingType.easeInOutSine, value => -(Math.cos(Math.PI * value) - 1) / 2, false); - - await engine.refresh(refresh); + engine.register(e => { + e.addEasing(EasingType.easeInSine, value => 1 - Math.cos((value * Math.PI) / 2)); + e.addEasing(EasingType.easeOutSine, value => Math.sin((value * Math.PI) / 2)); + e.addEasing(EasingType.easeInOutSine, value => -(Math.cos(Math.PI * value) - 1) / 2); + }); } diff --git a/plugins/easings/sine/webpack.config.js b/plugins/easings/sine/webpack.config.js index 1a7b53a3162..3516a0d5659 100644 --- a/plugins/easings/sine/webpack.config.js +++ b/plugins/easings/sine/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEasing } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEasing } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEasing({ moduleName: "sine", pluginName: "Sine", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEasing({ moduleName: "sine", pluginName: "Sine", version, dir: __dirname }); diff --git a/plugins/emitters/.eslintignore b/plugins/emitters/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/emitters/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/emitters/.eslintrc.js b/plugins/emitters/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/emitters/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/emitters/CHANGELOG.md b/plugins/emitters/CHANGELOG.md index f9282826f2a..d1907591b77 100644 --- a/plugins/emitters/CHANGELOG.md +++ b/plugins/emitters/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-emitters + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-emitters diff --git a/plugins/emitters/eslint.config.js b/plugins/emitters/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/emitters/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/emitters/package.dist.json b/plugins/emitters/package.dist.json index 28dbb7af6a2..1d6d344bd34 100644 --- a/plugins/emitters/package.dist.json +++ b/plugins/emitters/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-emitters", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles emitters plugin", "homepage": "https://particles.js.org", "repository": { @@ -86,9 +86,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/emitters/package.json b/plugins/emitters/package.json index 6ce6047a541..d89b2c3ab60 100644 --- a/plugins/emitters/package.json +++ b/plugins/emitters/package.json @@ -1,104 +1,105 @@ { - "name": "@tsparticles/plugin-emitters", - "version": "3.9.1", - "description": "tsParticles emitters plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-emitters", + "version": "4.0.0-alpha.0", + "description": "tsParticles emitters plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/emitters" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/emitters" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/emitters/src/EmitterInstance.ts b/plugins/emitters/src/EmitterInstance.ts index 9da6b71ceda..3b2c986ce28 100644 --- a/plugins/emitters/src/EmitterInstance.ts +++ b/plugins/emitters/src/EmitterInstance.ts @@ -15,11 +15,16 @@ import { deepExtend, getRangeValue, getSize, + hMax, + half, isPointInside, itemFromSingleOrMultiple, + lMax, millisecondsToSeconds, - randomInRange, + randomInRangeValue, rangeColorToHsl, + sMax, + safeDocument, } from "@tsparticles/engine"; import { Emitter } from "./Options/Classes/Emitter.js"; import { EmitterSize } from "./Options/Classes/EmitterSize.js"; @@ -29,8 +34,7 @@ import type { IEmitter } from "./Options/Interfaces/IEmitter.js"; import type { IEmitterShape } from "./IEmitterShape.js"; import type { IEmitterSize } from "./Options/Interfaces/IEmitterSize.js"; -const half = 0.5, - defaultLifeDelay = 0, +const defaultLifeDelay = 0, minLifeCount = 0, defaultSpawnDelay = 0, defaultEmitDelay = 0, @@ -113,9 +117,8 @@ export class EmitterInstance { this._firstSpawn = !this.options.life.wait; this._startParticlesAdded = false; - let particlesOptions = deepExtend({}, this.options.particles) as RecursivePartial; + const particlesOptions = deepExtend({}, this.options.particles) as RecursivePartial; - particlesOptions ??= {}; particlesOptions.move ??= {}; particlesOptions.move.direction ??= this.options.direction; @@ -131,7 +134,7 @@ export class EmitterInstance { this._immortal = this._lifeCount <= minLifeCount; if (this.options.domId) { - const element = document.getElementById(this.options.domId); + const element = safeDocument().getElementById(this.options.domId); if (element) { this._mutationObserver = new MutationObserver(() => { @@ -318,7 +321,7 @@ export class EmitterInstance { const container = this.container; if (this.options.domId) { - const element = document.getElementById(this.options.domId); + const element = safeDocument().getElementById(this.options.domId); if (element) { const elRect = element.getBoundingClientRect(), @@ -341,7 +344,7 @@ export class EmitterInstance { const container = this.container; if (this.options.domId) { - const element = document.getElementById(this.options.domId); + const element = safeDocument().getElementById(this.options.domId); if (element) { const elRect = element.getBoundingClientRect(); @@ -409,9 +412,9 @@ export class EmitterInstance { if (hslAnimation) { const maxValues = { - h: 360, - s: 100, - l: 100, + h: hMax, + s: sMax, + l: lMax, }, colorFactor = 3.6; @@ -470,7 +473,7 @@ export class EmitterInstance { } const duration = - this.options.life?.duration !== undefined ? getRangeValue(this.options.life.duration) : undefined, + this.options.life.duration !== undefined ? getRangeValue(this.options.life.duration) : undefined, minDuration = 0, minLifeCount = 0; @@ -491,13 +494,12 @@ export class EmitterInstance { return initValue; } - const colorOffset = randomInRange(animation.offset), + const colorOffset = randomInRangeValue(animation.offset), delay = getRangeValue(this.options.rate.delay), emitFactor = container.retina.reduceFactor ? (delay * millisecondsToSeconds) / container.retina.reduceFactor : Infinity, - defaultColorSpeed = 0, - colorSpeed = getRangeValue(animation.speed ?? defaultColorSpeed); + colorSpeed = getRangeValue(animation.speed); return (initValue + (colorSpeed * container.fpsLimit) / emitFactor + colorOffset * factor) % maxValue; }; diff --git a/plugins/emitters/src/Emitters.ts b/plugins/emitters/src/Emitters.ts index d20c7373746..45b8c04b835 100644 --- a/plugins/emitters/src/Emitters.ts +++ b/plugins/emitters/src/Emitters.ts @@ -94,8 +94,7 @@ export class Emitters implements IContainerPlugin { } handleClickMode(mode: string): void { - const emitterOptions = this.emitters, - modeEmitters = this.interactivityEmitters; + const modeEmitters = this.interactivityEmitters; if (mode !== (EmitterClickMode.emitter as string)) { return; @@ -103,7 +102,7 @@ export class Emitters implements IContainerPlugin { let emittersModeOptions: SingleOrMultiple | undefined; - if (modeEmitters && isArray(modeEmitters.value)) { + if (isArray(modeEmitters.value)) { const minLength = 0; if (modeEmitters.value.length > minLength && modeEmitters.random.enable) { @@ -119,16 +118,23 @@ export class Emitters implements IContainerPlugin { } usedIndexes.push(idx); - emittersModeOptions.push(itemFromArray(modeEmitters.value, idx)); + + const selectedOptions = itemFromArray(modeEmitters.value, idx); + + if (!selectedOptions) { + continue; + } + + emittersModeOptions.push(selectedOptions); } } else { emittersModeOptions = modeEmitters.value; } } else { - emittersModeOptions = modeEmitters?.value; + emittersModeOptions = modeEmitters.value; } - const emittersOptions = emittersModeOptions ?? emitterOptions, + const emittersOptions = emittersModeOptions, ePosition = this.container.interactivity.mouse.clickPosition; void executeOnSingleOrMultiple(emittersOptions, async emitter => { @@ -140,10 +146,6 @@ export class Emitters implements IContainerPlugin { this.emitters = this.container.actualOptions.emitters; this.interactivityEmitters = this.container.actualOptions.interactivity.modes.emitters; - if (!this.emitters) { - return; - } - if (isArray(this.emitters)) { for (const emitterOptions of this.emitters) { await this.addEmitter(emitterOptions); diff --git a/plugins/emitters/src/EmittersPlugin.ts b/plugins/emitters/src/EmittersPlugin.ts index 063b6ef4bf9..59904083a90 100644 --- a/plugins/emitters/src/EmittersPlugin.ts +++ b/plugins/emitters/src/EmittersPlugin.ts @@ -12,7 +12,6 @@ import { EmitterClickMode } from "./Enums/EmitterClickMode.js"; import type { EmitterContainer } from "./EmitterContainer.js"; import { Emitters } from "./Emitters.js"; import type { EmittersEngine } from "./EmittersEngine.js"; -import type { IEmitter } from "./Options/Interfaces/IEmitter.js"; /** */ @@ -65,46 +64,32 @@ export class EmittersPlugin implements IPlugin { } else { const emitterMode = interactivityEmitters as IEmitterModeOptions; - if (emitterMode.value !== undefined) { - const defaultCount = 1; - - if (isArray(emitterMode.value)) { - options.interactivity.modes.emitters = { - random: { - count: emitterMode.random.count ?? defaultCount, - enable: emitterMode.random.enable ?? false, - }, - value: emitterMode.value.map(s => { - const tmp = new Emitter(); + if (isArray(emitterMode.value)) { + options.interactivity.modes.emitters = { + random: { + count: emitterMode.random.count, + enable: emitterMode.random.enable, + }, + value: emitterMode.value.map(s => { + const tmp = new Emitter(); - tmp.load(s); + tmp.load(s); - return tmp; - }), - }; - } else { - const tmp = new Emitter(); + return tmp; + }), + }; + } else { + const tmp = new Emitter(); - tmp.load(emitterMode.value); + tmp.load(emitterMode.value); - options.interactivity.modes.emitters = { - random: { - count: emitterMode.random.count ?? defaultCount, - enable: emitterMode.random.enable ?? false, - }, - value: tmp, - }; - } - } else { - const emitterOptions = (options.interactivity.modes.emitters = { + options.interactivity.modes.emitters = { random: { - count: 1, - enable: false, + count: emitterMode.random.count, + enable: emitterMode.random.enable, }, - value: new Emitter(), - }); - - emitterOptions.value.load(interactivityEmitters as IEmitter); + value: tmp, + }; } } } diff --git a/plugins/emitters/src/Options/Classes/Emitter.ts b/plugins/emitters/src/Options/Classes/Emitter.ts index 5822a21d4e9..4f846bfa19d 100644 --- a/plugins/emitters/src/Options/Classes/Emitter.ts +++ b/plugins/emitters/src/Options/Classes/Emitter.ts @@ -55,9 +55,7 @@ export class Emitter implements IEmitter, IOptionLoader { } if (data.size !== undefined) { - if (!this.size) { - this.size = new EmitterSize(); - } + this.size ??= new EmitterSize(); this.size.load(data.size); } @@ -96,9 +94,7 @@ export class Emitter implements IEmitter, IOptionLoader { } if (data.spawnColor !== undefined) { - if (this.spawnColor === undefined) { - this.spawnColor = new AnimatableColor(); - } + this.spawnColor ??= new AnimatableColor(); this.spawnColor.load(data.spawnColor); } diff --git a/plugins/emitters/src/Options/Classes/EmitterShape.ts b/plugins/emitters/src/Options/Classes/EmitterShape.ts index c2e7709d8f1..5c96db10c2e 100644 --- a/plugins/emitters/src/Options/Classes/EmitterShape.ts +++ b/plugins/emitters/src/Options/Classes/EmitterShape.ts @@ -13,7 +13,7 @@ export class EmitterShape implements IEmitterShape, IOptionLoader this.type = "square"; } - load(data?: RecursivePartial | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emitters/src/Options/Classes/EmitterShapeReplace.ts b/plugins/emitters/src/Options/Classes/EmitterShapeReplace.ts index f8954c37709..eec5a840232 100644 --- a/plugins/emitters/src/Options/Classes/EmitterShapeReplace.ts +++ b/plugins/emitters/src/Options/Classes/EmitterShapeReplace.ts @@ -10,7 +10,7 @@ export class EmitterShapeReplace implements IEmitterShapeReplace, IOptionLoader< this.opacity = false; } - load(data?: RecursivePartial | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emitters/src/ShapeManager.ts b/plugins/emitters/src/ShapeManager.ts index b29a7e51b6a..b374047ba73 100644 --- a/plugins/emitters/src/ShapeManager.ts +++ b/plugins/emitters/src/ShapeManager.ts @@ -1,15 +1,8 @@ -import type { Engine } from "@tsparticles/engine"; import type { IEmitterShapeGenerator } from "./IEmitterShapeGenerator.js"; const shapeGeneratorss: Map = new Map(); export class ShapeManager { - private readonly _engine; - - constructor(engine: Engine) { - this._engine = engine; - } - addShapeGenerator(name: string, generator: IEmitterShapeGenerator): void { if (!this.getShapeGenerator(name)) { shapeGeneratorss.set(name, generator); diff --git a/plugins/emitters/src/index.ts b/plugins/emitters/src/index.ts index fe97fbbbd4a..b9a4ad24472 100644 --- a/plugins/emitters/src/index.ts +++ b/plugins/emitters/src/index.ts @@ -1,36 +1,34 @@ import type { EmittersEngine } from "./EmittersEngine.js"; -import { EmittersPlugin } from "./EmittersPlugin.js"; +import type { Engine } from "@tsparticles/engine"; import type { IEmitterShapeGenerator } from "./IEmitterShapeGenerator.js"; -import { ShapeManager } from "./ShapeManager.js"; declare const __VERSION__: string; /** * @param engine - The [[EmittersEngine]] instance to load the plugin into - * @param refresh - */ -export async function loadEmittersPlugin(engine: EmittersEngine, refresh = true): Promise { +export function loadEmittersPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - if (!engine.emitterShapeManager) { - engine.emitterShapeManager = new ShapeManager(engine); - } + engine.register(async (e: EmittersEngine) => { + const { ShapeManager } = await import("./ShapeManager.js"), + { EmittersPlugin } = await import("./EmittersPlugin.js"); - if (!engine.addEmitterShapeGenerator) { - engine.addEmitterShapeGenerator = (name: string, generator: IEmitterShapeGenerator): void => { - engine.emitterShapeManager?.addShapeGenerator(name, generator); + e.emitterShapeManager ??= new ShapeManager(); + e.addEmitterShapeGenerator ??= (name: string, generator: IEmitterShapeGenerator): void => { + e.emitterShapeManager?.addShapeGenerator(name, generator); }; - } - const plugin = new EmittersPlugin(engine); + const plugin = new EmittersPlugin(e); - await engine.addPlugin(plugin, refresh); + e.addPlugin(plugin); + }); } -export * from "./EmitterContainer.js"; +export type * from "./EmitterContainer.js"; export * from "./EmitterShapeBase.js"; -export * from "./EmittersEngine.js"; -export * from "./IEmitterShape.js"; -export * from "./IEmitterShapeGenerator.js"; +export type * from "./EmittersEngine.js"; +export type * from "./IEmitterShape.js"; +export type * from "./IEmitterShapeGenerator.js"; export * from "./Enums/EmitterClickMode.js"; -export * from "./IRandomPositionData.js"; +export type * from "./IRandomPositionData.js"; diff --git a/plugins/emitters/webpack.config.js b/plugins/emitters/webpack.config.js index eb5424d6800..55d09db89ea 100644 --- a/plugins/emitters/webpack.config.js +++ b/plugins/emitters/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ moduleName: "emitters", pluginName: "Emitters", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "emitters", pluginName: "Emitters", version, dir: __dirname }); diff --git a/plugins/emittersShapes/canvas/.eslintignore b/plugins/emittersShapes/canvas/.eslintignore deleted file mode 100644 index de4d1f007dd..00000000000 --- a/plugins/emittersShapes/canvas/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules diff --git a/plugins/emittersShapes/canvas/.eslintrc.js b/plugins/emittersShapes/canvas/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/emittersShapes/canvas/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/emittersShapes/canvas/CHANGELOG.md b/plugins/emittersShapes/canvas/CHANGELOG.md index a4b8003ac5d..17ec0116245 100644 --- a/plugins/emittersShapes/canvas/CHANGELOG.md +++ b/plugins/emittersShapes/canvas/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-emitters-shape-canvas + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-emitters-shape-canvas diff --git a/plugins/emittersShapes/canvas/eslint.config.js b/plugins/emittersShapes/canvas/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/emittersShapes/canvas/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/emittersShapes/canvas/package.dist.json b/plugins/emittersShapes/canvas/package.dist.json index 2dd7bcfb2a9..396df3b0a84 100644 --- a/plugins/emittersShapes/canvas/package.dist.json +++ b/plugins/emittersShapes/canvas/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-emitters-shape-canvas", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles emitters shape canvas plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,10 +100,11 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/plugin-emitters": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/emittersShapes/canvas/package.json b/plugins/emittersShapes/canvas/package.json index 73a482918ad..d9461017e0e 100644 --- a/plugins/emittersShapes/canvas/package.json +++ b/plugins/emittersShapes/canvas/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/plugin-emitters-shape-canvas", - "version": "3.9.1", - "description": "tsParticles emitters shape canvas plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-emitters-shape-canvas", + "version": "4.0.0-alpha.0", + "description": "tsParticles emitters shape canvas plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/emittersShapes/canvas" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/emittersShapes/canvas" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/emittersShapes/canvas/src/EmittersCanvasShape.ts b/plugins/emittersShapes/canvas/src/EmittersCanvasShape.ts index 701788367a2..e07ef7eced1 100644 --- a/plugins/emittersShapes/canvas/src/EmittersCanvasShape.ts +++ b/plugins/emittersShapes/canvas/src/EmittersCanvasShape.ts @@ -7,6 +7,7 @@ import { isFunction, isNull, isString, + safeDocument, } from "@tsparticles/engine"; import { getCanvasImageData, getImageData, getTextData } from "./utils.js"; import type { CanvasPixelData } from "./types.js"; @@ -28,18 +29,16 @@ export class EmittersCanvasShape extends EmitterShapeBase boolean = (pixel): boolean => pixel.a > minAlpha; - if (filter !== undefined) { - if (isString(filter)) { - if (Object.hasOwn(window, filter)) { - const wndFilter = (window as unknown as Record boolean>)[filter]; + if (isString(filter)) { + if (Object.hasOwn(globalThis, filter)) { + const wndFilter = (globalThis as unknown as Record boolean>)[filter]; - if (isFunction(wndFilter)) { - filterFunc = wndFilter; - } + if (isFunction(wndFilter)) { + filterFunc = wndFilter; } - } else { - filterFunc = filter; } + } else { + filterFunc = filter; } this.filter = filterFunc; @@ -72,16 +71,8 @@ export class EmittersCanvasShape extends EmitterShapeBase(selector)); + const canvas = element ?? (selector && safeDocument().querySelector(selector)); if (!canvas) { return; @@ -94,10 +85,14 @@ export class EmittersCanvasShape extends EmitterShapeBase | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emittersShapes/canvas/src/Options/Classes/PixelsOptions.ts b/plugins/emittersShapes/canvas/src/Options/Classes/PixelsOptions.ts index ea317257313..50dc183ba56 100644 --- a/plugins/emittersShapes/canvas/src/Options/Classes/PixelsOptions.ts +++ b/plugins/emittersShapes/canvas/src/Options/Classes/PixelsOptions.ts @@ -8,7 +8,7 @@ export class PixelsOptions implements IPixelsOptions, IOptionLoader | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emittersShapes/canvas/src/Options/Classes/TextFontOptions.ts b/plugins/emittersShapes/canvas/src/Options/Classes/TextFontOptions.ts index fb44052b04e..4885c1424cb 100644 --- a/plugins/emittersShapes/canvas/src/Options/Classes/TextFontOptions.ts +++ b/plugins/emittersShapes/canvas/src/Options/Classes/TextFontOptions.ts @@ -16,7 +16,7 @@ export class TextFontOptions implements ITextFontOptions, IOptionLoader | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emittersShapes/canvas/src/Options/Classes/TextLinesOptions.ts b/plugins/emittersShapes/canvas/src/Options/Classes/TextLinesOptions.ts index 8a372d914a4..9c02676eecc 100644 --- a/plugins/emittersShapes/canvas/src/Options/Classes/TextLinesOptions.ts +++ b/plugins/emittersShapes/canvas/src/Options/Classes/TextLinesOptions.ts @@ -10,7 +10,7 @@ export class TextLinesOptions implements ITextLinesOptions, IOptionLoader | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emittersShapes/canvas/src/Options/Classes/TextOptions.ts b/plugins/emittersShapes/canvas/src/Options/Classes/TextOptions.ts index 8f7371ada3e..a9f7b32ab10 100644 --- a/plugins/emittersShapes/canvas/src/Options/Classes/TextOptions.ts +++ b/plugins/emittersShapes/canvas/src/Options/Classes/TextOptions.ts @@ -16,7 +16,7 @@ export class TextOptions implements ITextOptions, IOptionLoader { this.text = ""; } - load(data?: RecursivePartial | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emittersShapes/canvas/src/index.ts b/plugins/emittersShapes/canvas/src/index.ts index f91363874f6..027039e7a37 100644 --- a/plugins/emittersShapes/canvas/src/index.ts +++ b/plugins/emittersShapes/canvas/src/index.ts @@ -1,4 +1,3 @@ -import { EmittersCanvasShapeGenerator } from "./EmittersCanvasShapeGenerator.js"; import type { EmittersEngine } from "@tsparticles/plugin-emitters"; import { type Engine } from "@tsparticles/engine"; @@ -7,14 +6,13 @@ declare const __VERSION__: string; /** * * @param engine - - * @param refresh - */ -export async function loadEmittersShapeCanvas(engine: Engine, refresh = true): Promise { - const emittersEngine = engine as EmittersEngine; +export function loadEmittersShapeCanvas(engine: Engine): void { + engine.checkVersion(__VERSION__); - emittersEngine.checkVersion(__VERSION__); + engine.register(async (emittersEngine: EmittersEngine) => { + const { EmittersCanvasShapeGenerator } = await import("./EmittersCanvasShapeGenerator.js"); - emittersEngine.addEmitterShapeGenerator?.("canvas", new EmittersCanvasShapeGenerator()); - - await emittersEngine.refresh(refresh); + emittersEngine.addEmitterShapeGenerator?.("canvas", new EmittersCanvasShapeGenerator()); + }); } diff --git a/plugins/emittersShapes/canvas/src/utils.ts b/plugins/emittersShapes/canvas/src/utils.ts index fa0bcf94a09..4b8a6912fa0 100644 --- a/plugins/emittersShapes/canvas/src/utils.ts +++ b/plugins/emittersShapes/canvas/src/utils.ts @@ -1,12 +1,14 @@ import type { CanvasPixelData, TextLineData } from "./types.js"; -import { type ICoordinates, type IDimension, type IRgba, errorPrefix, isNumber } from "@tsparticles/engine"; +import { type ICoordinates, type IDimension, type IRgba, isNumber, safeDocument } from "@tsparticles/engine"; import type { TextOptions } from "./Options/Classes/TextOptions.js"; const origin: ICoordinates = { x: 0, y: 0, }, - minWidth = 0; + minWidth = 0, + defaultRgbValue = 0, + defaultAlphaValue = 1; /** * @param ctx - @@ -36,9 +38,7 @@ export function getCanvasImageData( y: Math.floor(idx / size.width), }; - if (!pixels[pos.y]) { - pixels[pos.y] = []; - } + pixels[pos.y] ??= []; const indexesOffset = { r: 0, @@ -46,13 +46,18 @@ export function getCanvasImageData( b: 2, a: 3, }, - alphaFactor = 255; + alphaFactor = 255, + row = pixels[pos.y]; + + if (!row) { + continue; + } - pixels[pos.y][pos.x] = { - r: imageData[i + indexesOffset.r], - g: imageData[i + indexesOffset.g], - b: imageData[i + indexesOffset.b], - a: imageData[i + indexesOffset.a] / alphaFactor, + row[pos.x] = { + r: imageData[i + indexesOffset.r] ?? defaultRgbValue, + g: imageData[i + indexesOffset.g] ?? defaultRgbValue, + b: imageData[i + indexesOffset.b] ?? defaultRgbValue, + a: (imageData[i + indexesOffset.a] ?? defaultAlphaValue) / alphaFactor, }; } @@ -76,7 +81,7 @@ export function getImageData(src: string, offset: number): Promise((resolve, reject) => { image.onerror = reject; image.onload = (): void => { - const canvas = document.createElement("canvas"); + const canvas = safeDocument().createElement("canvas"); canvas.width = image.width; canvas.height = image.height; @@ -84,7 +89,8 @@ export function getImageData(src: string, offset: number): Promise", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/emittersShapes/circle" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/emittersShapes/circle/src/index.ts b/plugins/emittersShapes/circle/src/index.ts index 8e834c2e1cc..7bf2e4bf8bd 100644 --- a/plugins/emittersShapes/circle/src/index.ts +++ b/plugins/emittersShapes/circle/src/index.ts @@ -1,19 +1,17 @@ -import { EmittersCircleShapeGenerator } from "./EmittersCircleShapeGenerator.js"; import type { EmittersEngine } from "@tsparticles/plugin-emitters"; -import { type Engine } from "@tsparticles/engine"; +import type { Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEmittersShapeCircle(engine: Engine, refresh = true): Promise { - const emittersEngine = engine as EmittersEngine; +export function loadEmittersShapeCircle(engine: Engine): void { + engine.checkVersion(__VERSION__); - emittersEngine.checkVersion(__VERSION__); + engine.register(async (emittersEngine: EmittersEngine) => { + const { EmittersCircleShapeGenerator } = await import("./EmittersCircleShapeGenerator.js"); - emittersEngine.addEmitterShapeGenerator?.("circle", new EmittersCircleShapeGenerator()); - - await emittersEngine.refresh(refresh); + emittersEngine.addEmitterShapeGenerator?.("circle", new EmittersCircleShapeGenerator()); + }); } diff --git a/plugins/emittersShapes/circle/webpack.config.js b/plugins/emittersShapes/circle/webpack.config.js index bd8336e85c7..5052cfb47c9 100644 --- a/plugins/emittersShapes/circle/webpack.config.js +++ b/plugins/emittersShapes/circle/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEmittersShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEmittersShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEmittersShape({ moduleName: "circle", pluginName: "Circle", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEmittersShape({ moduleName: "circle", pluginName: "Circle", version, dir: __dirname }); diff --git a/plugins/emittersShapes/path/.eslintignore b/plugins/emittersShapes/path/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/emittersShapes/path/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/emittersShapes/path/.eslintrc.js b/plugins/emittersShapes/path/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/emittersShapes/path/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/emittersShapes/path/CHANGELOG.md b/plugins/emittersShapes/path/CHANGELOG.md index 6ff50560eff..c4d627a8b3d 100644 --- a/plugins/emittersShapes/path/CHANGELOG.md +++ b/plugins/emittersShapes/path/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-emitters-shape-path + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-emitters-shape-path diff --git a/plugins/emittersShapes/path/eslint.config.js b/plugins/emittersShapes/path/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/emittersShapes/path/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/emittersShapes/path/package.dist.json b/plugins/emittersShapes/path/package.dist.json index 2d7f35d3ca8..bff557ecd6b 100644 --- a/plugins/emittersShapes/path/package.dist.json +++ b/plugins/emittersShapes/path/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-emitters-shape-path", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles emitters shape path plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,10 +100,11 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/plugin-emitters": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/emittersShapes/path/package.json b/plugins/emittersShapes/path/package.json index d918e8a6e4b..bfa7e2e8c6a 100644 --- a/plugins/emittersShapes/path/package.json +++ b/plugins/emittersShapes/path/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/plugin-emitters-shape-path", - "version": "3.9.1", - "description": "tsParticles emitters shape path plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-emitters-shape-path", + "version": "4.0.0-alpha.0", + "description": "tsParticles emitters shape path plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/emittersShapes/path" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/emittersShapes/path" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/emittersShapes/path/src/EmittersPathShape.ts b/plugins/emittersShapes/path/src/EmittersPathShape.ts index 41d22206847..37eb760f07c 100644 --- a/plugins/emittersShapes/path/src/EmittersPathShape.ts +++ b/plugins/emittersShapes/path/src/EmittersPathShape.ts @@ -1,5 +1,5 @@ import { EmitterShapeBase, type IRandomPositionData } from "@tsparticles/plugin-emitters"; -import { type ICoordinates, type IDimension, errorPrefix, percentDenominator } from "@tsparticles/engine"; +import { type ICoordinates, type IDimension, percentDenominator, safeDocument } from "@tsparticles/engine"; import { generateRandomPointOnPathPerimeter, generateRandomPointWithinPath } from "./utils.js"; import type { EmittersPathShapeOptions } from "./Options/Classes/EmittersPathShapeOptions.js"; @@ -13,10 +13,10 @@ export class EmittersPathShape extends EmitterShapeBase | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emittersShapes/path/src/index.ts b/plugins/emittersShapes/path/src/index.ts index 61e6ca3d68d..8d0da2379a6 100644 --- a/plugins/emittersShapes/path/src/index.ts +++ b/plugins/emittersShapes/path/src/index.ts @@ -1,20 +1,18 @@ import type { EmittersEngine } from "@tsparticles/plugin-emitters"; -import { EmittersPathShapeGenerator } from "./EmittersPathShapeGenerator.js"; -import { type Engine } from "@tsparticles/engine"; +import type { Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * * @param engine - - * @param refresh - */ -export async function loadEmittersShapePath(engine: Engine, refresh = true): Promise { - const emittersEngine = engine as EmittersEngine; +export function loadEmittersShapePath(engine: Engine): void { + engine.checkVersion(__VERSION__); - emittersEngine.checkVersion(__VERSION__); + engine.register(async (emittersEngine: EmittersEngine) => { + const { EmittersPathShapeGenerator } = await import("./EmittersPathShapeGenerator.js"); - emittersEngine.addEmitterShapeGenerator?.("path", new EmittersPathShapeGenerator()); - - await emittersEngine.refresh(refresh); + emittersEngine.addEmitterShapeGenerator?.("path", new EmittersPathShapeGenerator()); + }); } diff --git a/plugins/emittersShapes/path/webpack.config.js b/plugins/emittersShapes/path/webpack.config.js index e5e56a9d51f..8cd8b58e0db 100644 --- a/plugins/emittersShapes/path/webpack.config.js +++ b/plugins/emittersShapes/path/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEmittersShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEmittersShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEmittersShape({ moduleName: "path", pluginName: "Path", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEmittersShape({ moduleName: "path", pluginName: "Path", version, dir: __dirname }); diff --git a/plugins/emittersShapes/polygon/.eslintignore b/plugins/emittersShapes/polygon/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/emittersShapes/polygon/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/emittersShapes/polygon/.eslintrc.js b/plugins/emittersShapes/polygon/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/emittersShapes/polygon/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/emittersShapes/polygon/CHANGELOG.md b/plugins/emittersShapes/polygon/CHANGELOG.md index f14820a27cb..82e08f30bab 100644 --- a/plugins/emittersShapes/polygon/CHANGELOG.md +++ b/plugins/emittersShapes/polygon/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-emitters-shape-polygon + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-emitters-shape-polygon diff --git a/plugins/emittersShapes/polygon/eslint.config.js b/plugins/emittersShapes/polygon/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/emittersShapes/polygon/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/emittersShapes/polygon/package.dist.json b/plugins/emittersShapes/polygon/package.dist.json index 177a4f00aa8..7ac98ca3e54 100644 --- a/plugins/emittersShapes/polygon/package.dist.json +++ b/plugins/emittersShapes/polygon/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-emitters-shape-polygon", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles emitters shape polygon plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,10 +100,11 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/plugin-emitters": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/emittersShapes/polygon/package.json b/plugins/emittersShapes/polygon/package.json index dc7cf5d9798..fd0c1fea297 100644 --- a/plugins/emittersShapes/polygon/package.json +++ b/plugins/emittersShapes/polygon/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/plugin-emitters-shape-polygon", - "version": "3.9.1", - "description": "tsParticles emitters shape polygon plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-emitters-shape-polygon", + "version": "4.0.0-alpha.0", + "description": "tsParticles emitters shape polygon plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/emittersShapes/polygon" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/emittersShapes/polygon" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/emittersShapes/polygon/src/EmittersPolygonShape.ts b/plugins/emittersShapes/polygon/src/EmittersPolygonShape.ts index ee21c2355b2..fecdd513ae6 100644 --- a/plugins/emittersShapes/polygon/src/EmittersPolygonShape.ts +++ b/plugins/emittersShapes/polygon/src/EmittersPolygonShape.ts @@ -34,7 +34,7 @@ export class EmittersPolygonShape extends EmitterShapeBase | undefined): void { + load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/plugins/emittersShapes/polygon/src/index.ts b/plugins/emittersShapes/polygon/src/index.ts index 309c7ab960f..41af40e3c51 100644 --- a/plugins/emittersShapes/polygon/src/index.ts +++ b/plugins/emittersShapes/polygon/src/index.ts @@ -1,20 +1,18 @@ import type { EmittersEngine } from "@tsparticles/plugin-emitters"; -import { EmittersPolygonShapeGenerator } from "./EmittersPolygonShapeGenerator.js"; -import { type Engine } from "@tsparticles/engine"; +import type { Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * * @param engine - - * @param refresh - */ -export async function loadEmittersShapePolygon(engine: Engine, refresh = true): Promise { - const emittersEngine = engine as EmittersEngine; +export function loadEmittersShapePolygon(engine: Engine): void { + engine.checkVersion(__VERSION__); - emittersEngine.checkVersion(__VERSION__); + engine.register(async (emittersEngine: EmittersEngine) => { + const { EmittersPolygonShapeGenerator } = await import("./EmittersPolygonShapeGenerator.js"); - emittersEngine.addEmitterShapeGenerator?.("polygon", new EmittersPolygonShapeGenerator()); - - await emittersEngine.refresh(refresh); + emittersEngine.addEmitterShapeGenerator?.("polygon", new EmittersPolygonShapeGenerator()); + }); } diff --git a/plugins/emittersShapes/polygon/src/utils.ts b/plugins/emittersShapes/polygon/src/utils.ts index 167df2f4faa..f786d8d84b0 100644 --- a/plugins/emittersShapes/polygon/src/utils.ts +++ b/plugins/emittersShapes/polygon/src/utils.ts @@ -41,8 +41,13 @@ export function generateRandomPolygon( */ export function generateRandomPointWithinPolygon(polygon: ICoordinates[]): ICoordinates | null { const firstIndex = 0, - firstPoint = polygon[firstIndex], - min = { ...firstPoint }, + firstPoint = polygon[firstIndex]; + + if (!firstPoint) { + return null; + } + + const min = { ...firstPoint }, max = { ...firstPoint }; for (const point of polygon) { @@ -86,12 +91,22 @@ export function generateRandomPointWithinPolygon(polygon: ICoordinates[]): ICoor * @param polygon - * @returns a random point on the perimeter of the polygon */ -export function generateRandomPointOnPolygonPerimeter(polygon: ICoordinates[]): ICoordinates { +export function generateRandomPointOnPolygonPerimeter(polygon: ICoordinates[]): ICoordinates | undefined { const sideIndex = Math.floor(getRandom() * polygon.length), - startPoint = polygon[sideIndex], - offset = 1, - endPoint = polygon[(sideIndex + offset) % polygon.length], - t = getRandom(); + startPoint = polygon[sideIndex]; + + if (!startPoint) { + return; + } + + const offset = 1, + endPoint = polygon[(sideIndex + offset) % polygon.length]; + + if (!endPoint) { + return; + } + + const t = getRandom(); return { x: startPoint.x + (endPoint.x - startPoint.x) * t, y: startPoint.y + (endPoint.y - startPoint.y) * t }; } @@ -111,6 +126,10 @@ export function isPointInPolygon(point: ICoordinates, polygon: ICoordinates[]): const pi = polygon[i], pj = polygon[j]; + if (!pi || !pj) { + continue; + } + const intersect = pi.y > point.y !== pj.y > point.y && point.x < ((pj.x - pi.x) * (point.y - pi.y)) / (pj.y - pi.y) + pi.x; diff --git a/plugins/emittersShapes/polygon/webpack.config.js b/plugins/emittersShapes/polygon/webpack.config.js index a146ff5ced6..3999db16259 100644 --- a/plugins/emittersShapes/polygon/webpack.config.js +++ b/plugins/emittersShapes/polygon/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEmittersShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEmittersShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEmittersShape({ moduleName: "polygon", pluginName: "Polygon", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEmittersShape({ moduleName: "polygon", pluginName: "Polygon", version, dir: __dirname }); diff --git a/plugins/emittersShapes/square/.eslintignore b/plugins/emittersShapes/square/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/emittersShapes/square/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/emittersShapes/square/.eslintrc.js b/plugins/emittersShapes/square/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/emittersShapes/square/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/emittersShapes/square/CHANGELOG.md b/plugins/emittersShapes/square/CHANGELOG.md index 58ef0f5d30a..c51d9087979 100644 --- a/plugins/emittersShapes/square/CHANGELOG.md +++ b/plugins/emittersShapes/square/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-emitters-shape-square + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-emitters-shape-square diff --git a/plugins/emittersShapes/square/eslint.config.js b/plugins/emittersShapes/square/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/emittersShapes/square/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/emittersShapes/square/package.dist.json b/plugins/emittersShapes/square/package.dist.json index b4547c91cbf..13a81edd538 100644 --- a/plugins/emittersShapes/square/package.dist.json +++ b/plugins/emittersShapes/square/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-emitters-shape-square", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles emitters shape square plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,10 +100,11 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1", - "@tsparticles/plugin-emitters": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/emittersShapes/square/package.json b/plugins/emittersShapes/square/package.json index 1595bf946b3..5d7707bfa66 100644 --- a/plugins/emittersShapes/square/package.json +++ b/plugins/emittersShapes/square/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/plugin-emitters-shape-square", - "version": "3.9.1", - "description": "tsParticles emitters shape square plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-emitters-shape-square", + "version": "4.0.0-alpha.0", + "description": "tsParticles emitters shape square plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/emittersShapes/square" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/emittersShapes/square" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-emitters": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-emitters": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/emittersShapes/square/src/index.ts b/plugins/emittersShapes/square/src/index.ts index e0ea4b06d80..ccc985cbe57 100644 --- a/plugins/emittersShapes/square/src/index.ts +++ b/plugins/emittersShapes/square/src/index.ts @@ -1,5 +1,4 @@ import type { EmittersEngine } from "@tsparticles/plugin-emitters"; -import { EmittersSquareShapeGenerator } from "./EmittersSquareShapeGenerator.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; @@ -7,14 +6,13 @@ declare const __VERSION__: string; /** * * @param engine - - * @param refresh - */ -export async function loadEmittersShapeSquare(engine: Engine, refresh = true): Promise { - const emittersEngine = engine as EmittersEngine; +export function loadEmittersShapeSquare(engine: Engine): void { + engine.checkVersion(__VERSION__); - emittersEngine.checkVersion(__VERSION__); + engine.register(async (emittersEngine: EmittersEngine) => { + const { EmittersSquareShapeGenerator } = await import("./EmittersSquareShapeGenerator.js"); - emittersEngine.addEmitterShapeGenerator?.("square", new EmittersSquareShapeGenerator()); - - await emittersEngine.refresh(refresh); + emittersEngine.addEmitterShapeGenerator?.("square", new EmittersSquareShapeGenerator()); + }); } diff --git a/plugins/emittersShapes/square/webpack.config.js b/plugins/emittersShapes/square/webpack.config.js index 67ac0e1c93a..8d69906f910 100644 --- a/plugins/emittersShapes/square/webpack.config.js +++ b/plugins/emittersShapes/square/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginEmittersShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginEmittersShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginEmittersShape({ moduleName: "square", pluginName: "Square", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginEmittersShape({ moduleName: "square", pluginName: "Square", version, dir: __dirname }); diff --git a/plugins/exports/image/.eslintignore b/plugins/exports/image/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/exports/image/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/exports/image/.eslintrc.js b/plugins/exports/image/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/exports/image/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/exports/image/CHANGELOG.md b/plugins/exports/image/CHANGELOG.md index 01efd6de2fa..8d0e25ffa65 100644 --- a/plugins/exports/image/CHANGELOG.md +++ b/plugins/exports/image/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-export-image + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-export-image diff --git a/plugins/exports/image/eslint.config.js b/plugins/exports/image/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/exports/image/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/exports/image/package.dist.json b/plugins/exports/image/package.dist.json index e9e2fd0de28..de3837b3d5a 100644 --- a/plugins/exports/image/package.dist.json +++ b/plugins/exports/image/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-export-image", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles export image plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/exports/image/package.json b/plugins/exports/image/package.json index 5e258a00af2..2826c9b1407 100644 --- a/plugins/exports/image/package.json +++ b/plugins/exports/image/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-export-image", - "version": "3.9.1", - "description": "tsParticles export image plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-export-image", + "version": "4.0.0-alpha.0", + "description": "tsParticles export image plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/exports/image" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/exports/image" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/exports/image/src/ExportImageInstance.ts b/plugins/exports/image/src/ExportImageInstance.ts index 27c5e6d5cfc..536648a688f 100644 --- a/plugins/exports/image/src/ExportImageInstance.ts +++ b/plugins/exports/image/src/ExportImageInstance.ts @@ -1,13 +1,11 @@ -import type { Container, Engine, ExportResult, IContainerPlugin } from "@tsparticles/engine"; +import type { Container, ExportResult, IContainerPlugin } from "@tsparticles/engine"; import type { IExportImageData } from "./IExportImageData.js"; export class ExportImageInstance implements IContainerPlugin { private readonly _container: Container; - private readonly _engine: Engine; - constructor(container: Container, engine: Engine) { + constructor(container: Container) { this._container = container; - this._engine = engine; } async export(type: string, data: Record): Promise { diff --git a/plugins/exports/image/src/ExportImagePlugin.ts b/plugins/exports/image/src/ExportImagePlugin.ts index f5b6d049f14..045074ea5d9 100644 --- a/plugins/exports/image/src/ExportImagePlugin.ts +++ b/plugins/exports/image/src/ExportImagePlugin.ts @@ -1,4 +1,4 @@ -import type { Container, Engine, IPlugin } from "@tsparticles/engine"; +import type { Container, IPlugin } from "@tsparticles/engine"; import { ExportImageInstance } from "./ExportImageInstance.js"; /** @@ -6,16 +6,12 @@ import { ExportImageInstance } from "./ExportImageInstance.js"; export class ExportImagePlugin implements IPlugin { readonly id; - private readonly _engine; - - constructor(engine: Engine) { + constructor() { this.id = "export-image"; - - this._engine = engine; } getPlugin(container: Container): Promise { - return Promise.resolve(new ExportImageInstance(container, this._engine)); + return Promise.resolve(new ExportImageInstance(container)); } loadOptions(): void { diff --git a/plugins/exports/image/src/index.ts b/plugins/exports/image/src/index.ts index 78d72a5da68..ee56d1d29a0 100644 --- a/plugins/exports/image/src/index.ts +++ b/plugins/exports/image/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { ExportImagePlugin } from "./ExportImagePlugin.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExportImagePlugin(engine: Engine, refresh = true): Promise { +export function loadExportImagePlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new ExportImagePlugin(engine), refresh); + engine.register(async e => { + const { ExportImagePlugin } = await import("./ExportImagePlugin.js"); + + e.addPlugin(new ExportImagePlugin()); + }); } diff --git a/plugins/exports/image/webpack.config.js b/plugins/exports/image/webpack.config.js index ece2d04631c..c66e24b64b3 100644 --- a/plugins/exports/image/webpack.config.js +++ b/plugins/exports/image/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginExport } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginExport } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginExport({ moduleName: "image", pluginName: "Image", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginExport({ moduleName: "image", pluginName: "Image", version, dir: __dirname }); diff --git a/plugins/exports/json/.eslintignore b/plugins/exports/json/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/exports/json/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/exports/json/.eslintrc.js b/plugins/exports/json/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/exports/json/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/exports/json/CHANGELOG.md b/plugins/exports/json/CHANGELOG.md index c54612d0fe5..a7f70a3b9df 100644 --- a/plugins/exports/json/CHANGELOG.md +++ b/plugins/exports/json/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-export-json + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-export-json diff --git a/plugins/exports/json/eslint.config.js b/plugins/exports/json/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/exports/json/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/exports/json/package.dist.json b/plugins/exports/json/package.dist.json index a2b708de024..b710cc4e930 100644 --- a/plugins/exports/json/package.dist.json +++ b/plugins/exports/json/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-export-json", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles export json plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/exports/json/package.json b/plugins/exports/json/package.json index 0908c01f03d..c838f6f3c2c 100644 --- a/plugins/exports/json/package.json +++ b/plugins/exports/json/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-export-json", - "version": "3.9.1", - "description": "tsParticles export json plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-export-json", + "version": "4.0.0-alpha.0", + "description": "tsParticles export json plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/exports/json" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/exports/json" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/exports/json/src/ExportJSONInstance.ts b/plugins/exports/json/src/ExportJSONInstance.ts index a630dc5e4a0..e7889878866 100644 --- a/plugins/exports/json/src/ExportJSONInstance.ts +++ b/plugins/exports/json/src/ExportJSONInstance.ts @@ -1,14 +1,12 @@ -import type { Container, Engine, ExportResult, IContainerPlugin } from "@tsparticles/engine"; +import type { Container, ExportResult, IContainerPlugin } from "@tsparticles/engine"; const indent = 2; export class ExportJSONInstance implements IContainerPlugin { private readonly _container: Container; - private readonly _engine: Engine; - constructor(container: Container, engine: Engine) { + constructor(container: Container) { this._container = container; - this._engine = engine; } async export(type: string): Promise { diff --git a/plugins/exports/json/src/ExportJSONPlugin.ts b/plugins/exports/json/src/ExportJSONPlugin.ts index 855ae86f397..925056b719b 100644 --- a/plugins/exports/json/src/ExportJSONPlugin.ts +++ b/plugins/exports/json/src/ExportJSONPlugin.ts @@ -1,4 +1,4 @@ -import type { Container, Engine, IPlugin } from "@tsparticles/engine"; +import type { Container, IPlugin } from "@tsparticles/engine"; import { ExportJSONInstance } from "./ExportJSONInstance.js"; /** @@ -6,16 +6,12 @@ import { ExportJSONInstance } from "./ExportJSONInstance.js"; export class ExportJSONPlugin implements IPlugin { readonly id; - private readonly _engine; - - constructor(engine: Engine) { + constructor() { this.id = "export-json"; - - this._engine = engine; } getPlugin(container: Container): Promise { - return Promise.resolve(new ExportJSONInstance(container, this._engine)); + return Promise.resolve(new ExportJSONInstance(container)); } loadOptions(): void { diff --git a/plugins/exports/json/src/index.ts b/plugins/exports/json/src/index.ts index 9f3fc4899ac..0b2015122e3 100644 --- a/plugins/exports/json/src/index.ts +++ b/plugins/exports/json/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { ExportJSONPlugin } from "./ExportJSONPlugin.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExportJSONPlugin(engine: Engine, refresh = true): Promise { +export function loadExportJSONPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new ExportJSONPlugin(engine), refresh); + engine.register(async e => { + const { ExportJSONPlugin } = await import("./ExportJSONPlugin.js"); + + e.addPlugin(new ExportJSONPlugin()); + }); } diff --git a/plugins/exports/json/webpack.config.js b/plugins/exports/json/webpack.config.js index 8d71ac16a4e..7b786912b99 100644 --- a/plugins/exports/json/webpack.config.js +++ b/plugins/exports/json/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginExport } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginExport } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginExport({ moduleName: "json", pluginName: "JSON", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginExport({ moduleName: "json", pluginName: "JSON", version, dir: __dirname }); diff --git a/plugins/exports/video/.eslintignore b/plugins/exports/video/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/exports/video/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/exports/video/.eslintrc.js b/plugins/exports/video/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/exports/video/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/exports/video/CHANGELOG.md b/plugins/exports/video/CHANGELOG.md index 5edf1e0a85b..6c330ed5ed6 100644 --- a/plugins/exports/video/CHANGELOG.md +++ b/plugins/exports/video/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-export-video + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-export-video diff --git a/plugins/exports/video/eslint.config.js b/plugins/exports/video/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/exports/video/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/exports/video/package.dist.json b/plugins/exports/video/package.dist.json index 7823e0ec299..dff901eb981 100644 --- a/plugins/exports/video/package.dist.json +++ b/plugins/exports/video/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-export-video", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles export video plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/exports/video/package.json b/plugins/exports/video/package.json index 0d508f8a8d6..6c5e9a3c69e 100644 --- a/plugins/exports/video/package.json +++ b/plugins/exports/video/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-export-video", - "version": "3.9.1", - "description": "tsParticles export video plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-export-video", + "version": "4.0.0-alpha.0", + "description": "tsParticles export video plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/exports/video" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/exports/video" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/exports/video/src/ExportVideoInstance.ts b/plugins/exports/video/src/ExportVideoInstance.ts index 7e4d8225a81..390553eb060 100644 --- a/plugins/exports/video/src/ExportVideoInstance.ts +++ b/plugins/exports/video/src/ExportVideoInstance.ts @@ -1,10 +1,4 @@ -import { - type Container, - type Engine, - type ExportResult, - type IContainerPlugin, - millisecondsToSeconds, -} from "@tsparticles/engine"; +import { type Container, type ExportResult, type IContainerPlugin, millisecondsToSeconds } from "@tsparticles/engine"; import type { IExportVideoData } from "./IExportVideoData.js"; const videoTypes = ["webm", "ogg", "mp4", "x-matroska"], @@ -36,7 +30,7 @@ function getVideoSupportedMimeTypes(): string[] { videoTypes.forEach(type => { const mimeType = `video/${type}`; - codecs.forEach(codec => + codecs.forEach(codec => { [ `${mimeType};codecs=${codec}`, `${mimeType};codecs=${codec.toUpperCase()}`, @@ -47,8 +41,8 @@ function getVideoSupportedMimeTypes(): string[] { if (isSupported(variation)) { supported.push(variation); } - }), - ); + }); + }); if (isSupported(mimeType)) { supported.push(mimeType); @@ -60,12 +54,10 @@ function getVideoSupportedMimeTypes(): string[] { export class ExportVideoInstance implements IContainerPlugin { private readonly _container: Container; - private readonly _engine: Engine; private readonly _supportedTypes: string[] = []; - constructor(container: Container, engine: Engine) { + constructor(container: Container) { this._container = container; - this._engine = engine; this._supportedTypes = getVideoSupportedMimeTypes(); } diff --git a/plugins/exports/video/src/ExportVideoPlugin.ts b/plugins/exports/video/src/ExportVideoPlugin.ts index 609a020ee00..ef17d68c30b 100644 --- a/plugins/exports/video/src/ExportVideoPlugin.ts +++ b/plugins/exports/video/src/ExportVideoPlugin.ts @@ -1,4 +1,4 @@ -import type { Container, Engine, IPlugin } from "@tsparticles/engine"; +import type { Container, IPlugin } from "@tsparticles/engine"; import { ExportVideoInstance } from "./ExportVideoInstance.js"; /** @@ -6,16 +6,12 @@ import { ExportVideoInstance } from "./ExportVideoInstance.js"; export class ExportVideoPlugin implements IPlugin { readonly id; - private readonly _engine; - - constructor(engine: Engine) { + constructor() { this.id = "export-video"; - - this._engine = engine; } getPlugin(container: Container): Promise { - return Promise.resolve(new ExportVideoInstance(container, this._engine)); + return Promise.resolve(new ExportVideoInstance(container)); } loadOptions(): void { diff --git a/plugins/exports/video/src/index.ts b/plugins/exports/video/src/index.ts index 38b8bf6de11..40d6ca59c8c 100644 --- a/plugins/exports/video/src/index.ts +++ b/plugins/exports/video/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { ExportVideoPlugin } from "./ExportVideoPlugin.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadExportVideoPlugin(engine: Engine, refresh = true): Promise { +export function loadExportVideoPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new ExportVideoPlugin(engine), refresh); + engine.register(async e => { + const { ExportVideoPlugin } = await import("./ExportVideoPlugin.js"); + + e.addPlugin(new ExportVideoPlugin()); + }); } diff --git a/plugins/exports/video/webpack.config.js b/plugins/exports/video/webpack.config.js index 1acf0d53960..5fa06bd9c69 100644 --- a/plugins/exports/video/webpack.config.js +++ b/plugins/exports/video/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPluginExport } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPluginExport } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPluginExport({ moduleName: "video", pluginName: "Video", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPluginExport({ moduleName: "video", pluginName: "Video", version, dir: __dirname }); diff --git a/plugins/infection/.eslintignore b/plugins/infection/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/plugins/infection/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/plugins/infection/.eslintrc.js b/plugins/infection/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/infection/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/infection/CHANGELOG.md b/plugins/infection/CHANGELOG.md index 8a3e0e60b6d..c2c99c01905 100644 --- a/plugins/infection/CHANGELOG.md +++ b/plugins/infection/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-infection + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-infection diff --git a/plugins/infection/eslint.config.js b/plugins/infection/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/infection/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/infection/package.dist.json b/plugins/infection/package.dist.json index 11c08893730..1becc1cbfa3 100644 --- a/plugins/infection/package.dist.json +++ b/plugins/infection/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-infection", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles infection plugin", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/infection/package.json b/plugins/infection/package.json index cd34c7a6423..1da0b48a0f4 100644 --- a/plugins/infection/package.json +++ b/plugins/infection/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/plugin-infection", - "version": "3.9.1", - "description": "tsParticles infection plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-infection", + "version": "4.0.0-alpha.0", + "description": "tsParticles infection plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/infection" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/infection" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/infection/src/Infecter.ts b/plugins/infection/src/Infecter.ts index 780600663a4..221f628aec3 100644 --- a/plugins/infection/src/Infecter.ts +++ b/plugins/infection/src/Infecter.ts @@ -67,7 +67,7 @@ export class Infecter { if (infection.stage !== undefined && infection.time !== undefined) { const infectionStage = stages[infection.stage]; - if (infectionStage.duration !== undefined && infectionStage.duration >= minDuration) { + if (infectionStage?.duration !== undefined && infectionStage.duration >= minDuration) { if (infection.time > infectionStage.duration * millisecondsToSeconds) { this._nextInfectionStage(particle); } else { diff --git a/plugins/infection/src/InfectionInstance.ts b/plugins/infection/src/InfectionInstance.ts index 0e1216649e2..27ca1029251 100644 --- a/plugins/infection/src/InfectionInstance.ts +++ b/plugins/infection/src/InfectionInstance.ts @@ -23,7 +23,7 @@ export class InfectionInstance implements IContainerPlugin { infection = options.infection, infectionStages = infection.stages; - return infectionStage !== undefined ? infectionStages[infectionStage].color : undefined; + return infectionStage === undefined ? undefined : infectionStages[infectionStage]?.color; } particleStrokeColor(particle: Particle): string | IOptionsColor | undefined { @@ -41,15 +41,17 @@ export class InfectionInstance implements IContainerPlugin { const notInfected = this._container.particles.filter(p => { const infP = p as InfectableParticle; - if (!infP.infection) { - infP.infection = {}; - } + infP.infection ??= {}; return infP.infection.stage === undefined; }); const infected = itemFromArray(notInfected); + if (!infected) { + continue; + } + this._container.infecter?.startInfection(infected, minStage); } } diff --git a/plugins/infection/src/InfectionPlugin.ts b/plugins/infection/src/InfectionPlugin.ts index ea4509f1784..0d5612933a1 100644 --- a/plugins/infection/src/InfectionPlugin.ts +++ b/plugins/infection/src/InfectionPlugin.ts @@ -21,7 +21,7 @@ export class InfectionPlugin implements IPlugin { return; } - let infectionOptions = options.infection!; + let infectionOptions = options.infection; if (infectionOptions?.load === undefined) { options.infection = infectionOptions = new Infection(); diff --git a/plugins/infection/src/ParticlesInfecter.ts b/plugins/infection/src/ParticlesInfecter.ts index 12530aece60..a09f9e8c163 100644 --- a/plugins/infection/src/ParticlesInfecter.ts +++ b/plugins/infection/src/ParticlesInfecter.ts @@ -41,8 +41,13 @@ export class ParticlesInfecter extends ParticlesInteractorBase p1.infection.stage) { const infectionStage2 = infectionOptions.stages[infP2.infection.stage]; - const infectedStage2 = infectionStage2?.infectedStage ?? infP2.infection.stage; + + if (!infectionStage2) { + continue; + } + + const infectedStage2 = infectionStage2.infectedStage ?? infP2.infection.stage; infecter.updateInfectionStage(p1, infectedStage2); } @@ -77,7 +87,7 @@ export class ParticlesInfecter extends ParticlesInteractorBase { +export function loadInfectionPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - const plugin = new InfectionPlugin(); + engine.register(async e => { + const { InfectionPlugin } = await import("./InfectionPlugin.js"); - await engine.addPlugin(plugin, refresh); - await engine.addInteractor( - "particlesInfection", - container => { - return Promise.resolve(new ParticlesInfecter(container)); - }, - refresh, - ); + e.addPlugin(new InfectionPlugin()); + e.addInteractor("particlesInfection", async container => { + const { ParticlesInfecter } = await import("./ParticlesInfecter.js"); + + return new ParticlesInfecter(container); + }); + }); } -export * from "./Options/Interfaces/IInfection.js"; -export * from "./Options/Interfaces/IInfectionStage.js"; +export type * from "./Options/Interfaces/IInfection.js"; +export type * from "./Options/Interfaces/IInfectionStage.js"; diff --git a/plugins/infection/webpack.config.js b/plugins/infection/webpack.config.js index 4d6f0776d57..83c7eaf25d6 100644 --- a/plugins/infection/webpack.config.js +++ b/plugins/infection/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ moduleName: "infection", pluginName: "Infection", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "infection", pluginName: "Infection", version, dir: __dirname }); diff --git a/plugins/motion/.eslintignore b/plugins/motion/.eslintignore deleted file mode 100644 index 43b53119167..00000000000 --- a/plugins/motion/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -src/pathseg.* diff --git a/plugins/motion/.eslintrc.js b/plugins/motion/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/motion/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/motion/CHANGELOG.md b/plugins/motion/CHANGELOG.md index 847f23755f9..9321647cd47 100644 --- a/plugins/motion/CHANGELOG.md +++ b/plugins/motion/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-motion + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-motion diff --git a/plugins/motion/eslint.config.js b/plugins/motion/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/motion/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/motion/package.dist.json b/plugins/motion/package.dist.json index 0667b873ca0..b679ca8fc4c 100644 --- a/plugins/motion/package.dist.json +++ b/plugins/motion/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-motion", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles motion sickness plugin", "homepage": "https://particles.js.org", "repository": { @@ -86,9 +86,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/motion/package.json b/plugins/motion/package.json index ec2ed3a320f..086033e2971 100644 --- a/plugins/motion/package.json +++ b/plugins/motion/package.json @@ -1,104 +1,105 @@ { - "name": "@tsparticles/plugin-motion", - "version": "3.9.1", - "description": "tsParticles motion sickness plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-motion", + "version": "4.0.0-alpha.0", + "description": "tsParticles motion sickness plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/motion" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/motion" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/motion/src/MotionInstance.ts b/plugins/motion/src/MotionInstance.ts index 69875b5cf6e..6bd0efd878f 100644 --- a/plugins/motion/src/MotionInstance.ts +++ b/plugins/motion/src/MotionInstance.ts @@ -1,4 +1,4 @@ -import { type Engine, type IContainerPlugin, safeMatchMedia } from "@tsparticles/engine"; +import { type IContainerPlugin, safeMatchMedia } from "@tsparticles/engine"; import type { MotionContainer } from "./types.js"; const defaultFactor = 1, @@ -8,11 +8,9 @@ const defaultFactor = 1, export class MotionInstance implements IContainerPlugin { private readonly _container; - private readonly _engine; - constructor(container: MotionContainer, engine: Engine) { + constructor(container: MotionContainer) { this._container = container; - this._engine = engine; } async init(): Promise { @@ -49,11 +47,7 @@ export class MotionInstance implements IContainerPlugin { })(); }; - if (mediaQuery.addEventListener !== undefined) { - mediaQuery.addEventListener("change", handleChange); - } else if (mediaQuery.addListener !== undefined) { - mediaQuery.addListener(handleChange); - } + mediaQuery.addEventListener("change", handleChange); await Promise.resolve(); } diff --git a/plugins/motion/src/MotionPlugin.ts b/plugins/motion/src/MotionPlugin.ts index 0d0711034cb..c47c7f9cabf 100644 --- a/plugins/motion/src/MotionPlugin.ts +++ b/plugins/motion/src/MotionPlugin.ts @@ -1,4 +1,4 @@ -import type { Container, Engine, IPlugin, RecursivePartial } from "@tsparticles/engine"; +import type { Container, IPlugin, RecursivePartial } from "@tsparticles/engine"; import type { IMotionOptions, MotionOptions } from "./types.js"; import { Motion } from "./Options/Classes/Motion.js"; import { MotionInstance } from "./MotionInstance.js"; @@ -8,16 +8,12 @@ import { MotionInstance } from "./MotionInstance.js"; export class MotionPlugin implements IPlugin { readonly id; - private readonly _engine; - - constructor(engine: Engine) { + constructor() { this.id = "motion"; - - this._engine = engine; } getPlugin(container: Container): Promise { - return Promise.resolve(new MotionInstance(container, this._engine)); + return Promise.resolve(new MotionInstance(container)); } loadOptions(options: MotionOptions, source?: RecursivePartial): void { @@ -25,7 +21,7 @@ export class MotionPlugin implements IPlugin { return; } - let motionOptions = options.motion!; + let motionOptions = options.motion; if (!motionOptions?.load) { options.motion = motionOptions = new Motion(); diff --git a/plugins/motion/src/index.ts b/plugins/motion/src/index.ts index bd42f02e7f9..8eac4638bb1 100644 --- a/plugins/motion/src/index.ts +++ b/plugins/motion/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { MotionPlugin } from "./MotionPlugin.js"; declare const __VERSION__: string; /** * @param engine - The engine instance - * @param refresh - */ -export async function loadMotionPlugin(engine: Engine, refresh = true): Promise { +export function loadMotionPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new MotionPlugin(engine), refresh); + engine.register(async e => { + const { MotionPlugin } = await import("./MotionPlugin.js"); + + e.addPlugin(new MotionPlugin()); + }); } diff --git a/plugins/motion/webpack.config.js b/plugins/motion/webpack.config.js index e1143880e86..bc1dc964780 100644 --- a/plugins/motion/webpack.config.js +++ b/plugins/motion/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ moduleName: "motion", pluginName: "Motion", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "motion", pluginName: "Motion", version, dir: __dirname }); diff --git a/plugins/poisson/.eslintignore b/plugins/poisson/.eslintignore deleted file mode 100644 index de4d1f007dd..00000000000 --- a/plugins/poisson/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules diff --git a/plugins/poisson/.eslintrc.js b/plugins/poisson/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/poisson/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/poisson/CHANGELOG.md b/plugins/poisson/CHANGELOG.md index 4729dc29955..6899beb9186 100644 --- a/plugins/poisson/CHANGELOG.md +++ b/plugins/poisson/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-poisson-disc + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-poisson-disc diff --git a/plugins/poisson/eslint.config.js b/plugins/poisson/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/poisson/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/poisson/package.dist.json b/plugins/poisson/package.dist.json index a850538504d..d5febd2577e 100644 --- a/plugins/poisson/package.dist.json +++ b/plugins/poisson/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-poisson-disc", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles poisson disc plugin", "homepage": "https://particles.js.org", "repository": { @@ -85,9 +85,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/poisson/package.json b/plugins/poisson/package.json index 37254f8c246..93cb5bf4626 100644 --- a/plugins/poisson/package.json +++ b/plugins/poisson/package.json @@ -1,88 +1,89 @@ { - "name": "@tsparticles/plugin-poisson-disc", - "version": "3.9.1", - "description": "tsParticles poisson disc plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/poisson" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "prettier": "@tsparticles/prettier-config", - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "name": "@tsparticles/plugin-poisson-disc", + "version": "4.0.0-alpha.0", + "description": "tsParticles poisson disc plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/poisson" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "prettier": "@tsparticles/prettier-config", + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/poisson/src/PoissonDisc.ts b/plugins/poisson/src/PoissonDisc.ts index 21dc2a5bd0e..25075846407 100644 --- a/plugins/poisson/src/PoissonDisc.ts +++ b/plugins/poisson/src/PoissonDisc.ts @@ -95,10 +95,17 @@ export class PoissonDisc { y: Math.floor(inputPoint.y / this.cellSize), }, }, - pointIndex = this.points.length; + pointIndex = this.points.length, + row = this.grid[point.gridPosition.y]; + + if (!row) { + return; + } this.points.push(point); - this.grid[point.gridPosition.y][point.gridPosition.x] = pointIndex; + + row[point.gridPosition.x] = pointIndex; + this.active.push(pointIndex); } @@ -119,8 +126,14 @@ export class PoissonDisc { for (let y = 0; y <= this.rows; y++) { this.grid[y] = []; + const row = this.grid[y]; + + if (!row) { + continue; + } + for (let x = 0; x <= this.cols; x++) { - this.grid[y][x] = -1; + row[x] = -1; } } } @@ -208,8 +221,20 @@ export class PoissonDisc { newPoint.y > minCoordinate && newPoint.y < this.size.height ) { + const row = this.grid[newGridCoords.y]; + + if (!row) { + return; + } + + const point = row[newGridCoords.x]; + + if (point === undefined) { + return; + } + /* It is inside the screen area */ - if (this.grid[newGridCoords.y][newGridCoords.x] < gridMinValue) { + if (point < gridMinValue) { /* There is not a point at this grid reference - get the neighbours */ for (let i = -1; i <= maxNeighbourIndex; i++) { for (let j = -1; j <= maxNeighbourIndex; j++) { @@ -227,11 +252,16 @@ export class PoissonDisc { (neighbourGrid.x !== newGridCoords.x || neighbourGrid.y !== newGridCoords.y) ) { /* Neighbour is within the grid and not the centre point */ - if (this.grid[neighbourGrid.y][neighbourGrid.x] >= gridMinValue) { + if (point >= gridMinValue) { /* It has a point in it - check how far away it is */ - const neighbourIndex = this.grid[neighbourGrid.y][neighbourGrid.x], - neighbour = this.points[neighbourIndex], - dist = getDistance(newPoint, neighbour.position); + const neighbourIndex = point, + neighbour = this.points[neighbourIndex]; + + if (!neighbour) { + continue; + } + + const dist = getDistance(newPoint, neighbour.position); /* Invalid, to close to a neighbour point */ if (dist < this.radius) { @@ -261,7 +291,19 @@ export class PoissonDisc { let foundNewPoint = false; for (let tries = 0; tries < this.retries; tries++) { - const newPoint = this._getNewPoint(this.points[this.active[randomActive]], tries); + const randomActivePointIndex = this.active[randomActive]; + + if (randomActivePointIndex === undefined) { + continue; + } + + const point = this.points[randomActivePointIndex]; + + if (!point) { + continue; + } + + const newPoint = this._getNewPoint(point, tries); if (newPoint) { /* Valid, add this point */ diff --git a/plugins/poisson/src/PoissonDiscPlugin.ts b/plugins/poisson/src/PoissonDiscPlugin.ts index 61b212bb75d..fb126f2a498 100644 --- a/plugins/poisson/src/PoissonDiscPlugin.ts +++ b/plugins/poisson/src/PoissonDiscPlugin.ts @@ -1,4 +1,4 @@ -import { type Container, type Engine, type IPlugin, type RecursivePartial } from "@tsparticles/engine"; +import { type Container, type IPlugin, type RecursivePartial } from "@tsparticles/engine"; import type { IPoissonOptions, PoissonOptions } from "./types.js"; import { Poisson } from "./Options/Classes/Poisson.js"; import { PoissonInstance } from "./PoissonInstance.js"; @@ -8,16 +8,12 @@ import { PoissonInstance } from "./PoissonInstance.js"; export class PoissonDiscPlugin implements IPlugin { readonly id; - private readonly _engine; - - constructor(engine: Engine) { + constructor() { this.id = "poisson"; - - this._engine = engine; } getPlugin(container: Container): Promise { - return Promise.resolve(new PoissonInstance(container, this._engine)); + return Promise.resolve(new PoissonInstance(container)); } loadOptions(options: PoissonOptions, source?: RecursivePartial): void { diff --git a/plugins/poisson/src/PoissonInstance.ts b/plugins/poisson/src/PoissonInstance.ts index 6c046170227..defaf898fd5 100644 --- a/plugins/poisson/src/PoissonInstance.ts +++ b/plugins/poisson/src/PoissonInstance.ts @@ -1,4 +1,4 @@ -import { type Engine, type IContainerPlugin, type ICoordinates, getRangeMax } from "@tsparticles/engine"; +import { type IContainerPlugin, type ICoordinates, getRangeMax } from "@tsparticles/engine"; import type { PoissonContainer } from "./types.js"; import { PoissonDisc } from "./PoissonDisc.js"; @@ -11,11 +11,9 @@ export class PoissonInstance implements IContainerPlugin { private readonly _container: PoissonContainer; private _currentIndex: number; - private readonly _engine: Engine; - constructor(container: PoissonContainer, engine: Engine) { + constructor(container: PoissonContainer) { this._container = container; - this._engine = engine; this._currentIndex = 0; } @@ -31,7 +29,7 @@ export class PoissonInstance implements IContainerPlugin { return; } - return position ?? this.poissonDisc?.points[this._currentIndex++]?.position; + return position ?? this.poissonDisc.points[this._currentIndex++]?.position; } resize(): void { diff --git a/plugins/poisson/src/index.ts b/plugins/poisson/src/index.ts index 94fc518e497..b7fe675a232 100644 --- a/plugins/poisson/src/index.ts +++ b/plugins/poisson/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { PoissonDiscPlugin } from "./PoissonDiscPlugin.js"; declare const __VERSION__: string; /** * @param engine - The engine to add the plugin to - * @param refresh - */ -export async function loadPoissonDiscPlugin(engine: Engine, refresh = true): Promise { +export function loadPoissonDiscPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new PoissonDiscPlugin(engine), refresh); + engine.register(async e => { + const { PoissonDiscPlugin } = await import("./PoissonDiscPlugin.js"); + + e.addPlugin(new PoissonDiscPlugin()); + }); } diff --git a/plugins/poisson/webpack.config.js b/plugins/poisson/webpack.config.js index 66f91922dfb..a64cd279fc5 100644 --- a/plugins/poisson/webpack.config.js +++ b/plugins/poisson/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "poisson", pluginName: "Poisson Disc", version, diff --git a/plugins/polygonMask/.eslintignore b/plugins/polygonMask/.eslintignore deleted file mode 100644 index 43b53119167..00000000000 --- a/plugins/polygonMask/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -src/pathseg.* diff --git a/plugins/polygonMask/.eslintrc.js b/plugins/polygonMask/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/polygonMask/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/polygonMask/CHANGELOG.md b/plugins/polygonMask/CHANGELOG.md index 89428bd7a58..a9ab1bf4603 100644 --- a/plugins/polygonMask/CHANGELOG.md +++ b/plugins/polygonMask/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-polygon-mask diff --git a/plugins/polygonMask/eslint.config.js b/plugins/polygonMask/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/polygonMask/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/polygonMask/package.dist.json b/plugins/polygonMask/package.dist.json index 91edd93ee9d..f46d2d7adf3 100644 --- a/plugins/polygonMask/package.dist.json +++ b/plugins/polygonMask/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-polygon-mask", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles polygon mask plugin", "homepage": "https://particles.js.org", "repository": { @@ -88,9 +88,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/polygonMask/package.json b/plugins/polygonMask/package.json index 7096985bc3d..aaee9fa6d83 100644 --- a/plugins/polygonMask/package.json +++ b/plugins/polygonMask/package.json @@ -1,91 +1,92 @@ { - "name": "@tsparticles/plugin-polygon-mask", - "version": "3.9.1", - "description": "tsParticles polygon mask plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/polygonMask" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "prettier": "@tsparticles/prettier-config", - "sideEffects": [ - "dist/**/pathseg.js" - ], - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "name": "@tsparticles/plugin-polygon-mask", + "version": "4.0.0-alpha.0", + "description": "tsParticles polygon mask plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/polygonMask" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "prettier": "@tsparticles/prettier-config", + "sideEffects": [ + "dist/**/pathseg.js" + ], + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/polygonMask/src/PolygonMaskInstance.ts b/plugins/polygonMask/src/PolygonMaskInstance.ts index 9aec62cbc5d..bb54a1adab6 100644 --- a/plugins/polygonMask/src/PolygonMaskInstance.ts +++ b/plugins/polygonMask/src/PolygonMaskInstance.ts @@ -1,3 +1,4 @@ +import "./pathseg.js"; import { type Engine, type IContainerPlugin, @@ -7,7 +8,6 @@ import { OutModeDirection, type Particle, deepExtend, - errorPrefix, getDistance, getDistances, getRandom, @@ -15,6 +15,7 @@ import { isString, itemFromArray, percentDenominator, + safeDocument, } from "@tsparticles/engine"; import { calcClosestPointOnSegment, drawPolygonMask, drawPolygonMaskPath, parsePaths, segmentBounce } from "./utils.js"; import type { ISvgPath } from "./Interfaces/ISvgPath.js"; @@ -22,8 +23,8 @@ import type { PolygonMaskContainer } from "./types.js"; import { PolygonMaskInlineArrangement } from "./Enums/PolygonMaskInlineArrangement.js"; import { PolygonMaskType } from "./Enums/PolygonMaskType.js"; -const noPolygonDataLoaded = `${errorPrefix} No polygon data loaded.`, - noPolygonFound = `${errorPrefix} No polygon found, you need to specify SVG url in config.`, +const noPolygonDataLoaded = `No polygon data loaded.`, + noPolygonFound = `No polygon found, you need to specify SVG url in config.`, origin: ICoordinates = { x: 0, y: 0, @@ -90,14 +91,17 @@ export class PolygonMaskInstance implements IContainerPlugin { for (const path of this.paths) { const path2d = path.path2d; - if (!context) { - continue; - } - if (path2d && this.offset) { - drawPolygonMaskPath(this._engine, context, path2d, polygonDraw.stroke, this.offset); + drawPolygonMaskPath( + this._engine, + context, + path2d, + polygonDraw.stroke, + this.offset, + this._container.hdr, + ); } else if (rawData) { - drawPolygonMask(this._engine, context, rawData, polygonDraw.stroke); + drawPolygonMask(this._engine, context, rawData, polygonDraw.stroke, this._container.hdr); } } } @@ -132,7 +136,7 @@ export class PolygonMaskInstance implements IContainerPlugin { return; } - return deepExtend({}, position ? position : this._randomPoint()) as ICoordinates; + return deepExtend({}, position ?? this._randomPoint()) as ICoordinates; } particlesInitialization(): boolean { @@ -207,8 +211,13 @@ export class PolygonMaskInstance implements IContainerPlugin { // } else { for (let i = 0, j = this.raw.length - indexOffset; i < this.raw.length; j = i++) { const pi = this.raw[i], - pj = this.raw[j], - intersect = pi.y > y !== pj.y > y && x < ((pj.x - pi.x) * (y - pi.y)) / (pj.y - pi.y) + pi.x; + pj = this.raw[j]; + + if (!pi || !pj) { + continue; + } + + const intersect = pi.y > y !== pj.y > y && x < ((pj.x - pi.x) * (y - pi.y)) / (pj.y - pi.y) + pi.x; if (intersect) { inside = !inside; @@ -219,7 +228,7 @@ export class PolygonMaskInstance implements IContainerPlugin { if (options.type === PolygonMaskType.inside) { return inside; } else { - return options.type === PolygonMaskType.outside ? !inside : false; + return !inside; } }; @@ -232,21 +241,17 @@ export class PolygonMaskInstance implements IContainerPlugin { } for (const path of this.paths) { - const pathData = path.element?.getAttribute("d"); + const pathData = path.element.getAttribute("d"); if (pathData) { const path2d = new Path2D(pathData), - matrix = document.createElementNS("http://www.w3.org/2000/svg", "svg").createSVGMatrix(), + matrix = safeDocument().createElementNS("http://www.w3.org/2000/svg", "svg").createSVGMatrix(), finalPath = new Path2D(), transform = matrix.scale(this._scale); - if (finalPath.addPath) { - finalPath.addPath(path2d, transform); + finalPath.addPath(path2d, transform); - path.path2d = finalPath; - } else { - delete path.path2d; - } + path.path2d = finalPath; } else { delete path.path2d; } @@ -260,6 +265,10 @@ export class PolygonMaskInstance implements IContainerPlugin { const firstIndex = 0, firstPoint = this.raw[firstIndex]; + if (!firstPoint) { + continue; + } + path.path2d.moveTo(firstPoint.x, firstPoint.y); this.raw.forEach((pos, i) => { @@ -302,7 +311,7 @@ export class PolygonMaskInstance implements IContainerPlugin { const req = await fetch(url); if (!req.ok) { - throw new Error(`${errorPrefix} occurred during polygon mask download`); + throw new Error(`Error occurred during polygon mask download`); } return this._parseSvgPath(await req.text(), force); @@ -361,26 +370,34 @@ export class PolygonMaskInstance implements IContainerPlugin { }; }; - private readonly _getPointByIndex: (index: number) => ICoordinates = index => { + private readonly _getPointByIndex: (index: number) => ICoordinates | undefined = index => { if (!this.raw?.length) { throw new Error(noPolygonDataLoaded); } const coords = this.raw[index % this.raw.length]; + if (!coords) { + return; + } + return { x: coords.x, y: coords.y, }; }; - private readonly _getRandomPoint: () => ICoordinates = () => { + private readonly _getRandomPoint: () => ICoordinates | undefined = () => { if (!this.raw?.length) { throw new Error(noPolygonDataLoaded); } const coords = itemFromArray(this.raw); + if (!coords) { + return; + } + return { x: coords.x, y: coords.y, @@ -399,8 +416,13 @@ export class PolygonMaskInstance implements IContainerPlugin { throw new Error(noPolygonDataLoaded); } - const path = itemFromArray(this.paths), - offset = 1, + const path = itemFromArray(this.paths); + + if (!path) { + return; + } + + const offset = 1, distance = Math.floor(getRandom() * path.length) + offset, point = path.element.getPointAtLength(distance), scale = this._scale; @@ -433,7 +455,7 @@ export class PolygonMaskInstance implements IContainerPlugin { const namespaces = 'xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"'; - svg = `${path}`; + svg = `${path}`; } this.raw = this._parseSvgPath(svg, force); @@ -465,6 +487,10 @@ export class PolygonMaskInstance implements IContainerPlugin { firstIndex = 0, svg = doc.getElementsByTagName("svg")[firstIndex]; + if (!svg) { + return; + } + let svgPaths = svg.getElementsByTagName("path"); if (!svgPaths.length) { @@ -504,7 +530,7 @@ export class PolygonMaskInstance implements IContainerPlugin { return parsePaths(this.paths, scale, this.offset); }; - private readonly _polygonBounce = (particle: Particle, delta: IDelta, direction: OutModeDirection): boolean => { + private readonly _polygonBounce = (particle: Particle, _delta: IDelta, direction: OutModeDirection): boolean => { const options = this._container.actualOptions.polygon; if (!this.raw || !options?.enable || direction !== OutModeDirection.top) { @@ -521,6 +547,10 @@ export class PolygonMaskInstance implements IContainerPlugin { const pi = this.raw[i], pj = this.raw[j]; + if (!pi || !pj) { + continue; + } + closest = calcClosestPointOnSegment(pi, pj, pos); const dist = getDistances(pos, closest); @@ -554,7 +584,7 @@ export class PolygonMaskInstance implements IContainerPlugin { return true; } - } else if (options.type === PolygonMaskType.inline && particle.initialPosition) { + } else if (options.type === PolygonMaskType.inline) { const dist = getDistance(particle.initialPosition, particle.getPosition()), { velocity } = particle; diff --git a/plugins/polygonMask/src/index.ts b/plugins/polygonMask/src/index.ts index 4fb1e0e8f1c..3a208c9c598 100644 --- a/plugins/polygonMask/src/index.ts +++ b/plugins/polygonMask/src/index.ts @@ -1,17 +1,18 @@ -import "./pathseg.js"; import { type Engine } from "@tsparticles/engine"; -import { PolygonMaskPlugin } from "./PolygonMaskPlugin.js"; declare const __VERSION__: string; /** * @param engine - The engine to add the plugin to - * @param refresh - */ -export async function loadPolygonMaskPlugin(engine: Engine, refresh = true): Promise { +export function loadPolygonMaskPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new PolygonMaskPlugin(engine), refresh); + engine.register(async e => { + const { PolygonMaskPlugin } = await import("./PolygonMaskPlugin.js"); + + e.addPlugin(new PolygonMaskPlugin(engine)); + }); } export * from "./Enums/PolygonMaskInlineArrangement.js"; diff --git a/plugins/polygonMask/src/pathseg.d.ts b/plugins/polygonMask/src/pathseg.d.ts index dbdf9e508ce..3eec248819e 100644 --- a/plugins/polygonMask/src/pathseg.d.ts +++ b/plugins/polygonMask/src/pathseg.d.ts @@ -1,3 +1,4 @@ +/* eslint-disable */ export interface SVGElementInstance extends EventTarget { readonly correspondingElement: SVGElement; readonly correspondingUseElement: SVGUseElement; @@ -325,7 +326,5 @@ declare var SVGPathElement: { }; declare global { - interface Window { - SVGPathSeg: SVGPathSeg; - } + var SVGPathSeg: SVGPathSeg; } diff --git a/plugins/polygonMask/src/pathseg.js b/plugins/polygonMask/src/pathseg.js index f8878c4dee6..a398f1f8e83 100644 --- a/plugins/polygonMask/src/pathseg.js +++ b/plugins/polygonMask/src/pathseg.js @@ -1,3 +1,4 @@ +/* eslint-disable */ // SVGPathSeg API polyfill // // This is a drop-in replacement for the SVGPathSeg and SVGPathSegList APIs that were removed from @@ -1200,7 +1201,7 @@ }; // When a path segment changes the list needs to be synchronized back to the path element. - window.SVGPathSegList.prototype.segmentChanged = function (/*pathSeg*/) { + window.SVGPathSegList.prototype.segmentChanged = function (/* pathSeg */) { this._writeListToPath(); }; @@ -1303,7 +1304,7 @@ // This closely follows SVGPathParser::parsePath from Source/core/svg/SVGPathParser.cpp. window.SVGPathSegList.prototype._parsePath = function (string) { - if (!string || !string.length) return []; + if (!string?.length) return []; const owningPathSegList = this; diff --git a/plugins/polygonMask/src/utils.ts b/plugins/polygonMask/src/utils.ts index 13685c17786..e51de391ebe 100644 --- a/plugins/polygonMask/src/utils.ts +++ b/plugins/polygonMask/src/utils.ts @@ -29,12 +29,14 @@ const squareExp = 2, * @param context - * @param rawData - * @param stroke - + * @param hdr - */ export function drawPolygonMask( engine: Engine, context: CanvasRenderingContext2D, rawData: ICoordinates[], stroke: IPolygonMaskDrawStroke, + hdr = false, ): void { const color = rangeColorToRgb(engine, stroke.color); @@ -45,6 +47,10 @@ export function drawPolygonMask( const firstIndex = 0, firstItem = rawData[firstIndex]; + if (!firstItem) { + return; + } + context.beginPath(); context.moveTo(firstItem.x, firstItem.y); @@ -53,7 +59,7 @@ export function drawPolygonMask( } context.closePath(); - context.strokeStyle = getStyleFromRgb(color); + context.strokeStyle = getStyleFromRgb(color, hdr); context.lineWidth = stroke.width; context.stroke(); } @@ -64,6 +70,7 @@ export function drawPolygonMask( * @param path - * @param stroke - * @param position - + * @param hdr - */ export function drawPolygonMaskPath( engine: Engine, @@ -71,6 +78,7 @@ export function drawPolygonMaskPath( path: Path2D, stroke: IPolygonMaskDrawStroke, position: ICoordinates, + hdr = false, ): void { const defaultTransform = { a: 1, @@ -94,7 +102,7 @@ export function drawPolygonMaskPath( return; } - context.strokeStyle = getStyleFromRgb(color, stroke.opacity); + context.strokeStyle = getStyleFromRgb(color, hdr, stroke.opacity); context.lineWidth = stroke.width; context.stroke(path); context.resetTransform(); @@ -120,7 +128,7 @@ export function parsePaths(paths: ISvgPath[], scale: number, offset: ICoordinate for (let i = 0; i < len; i++) { const segment: SVGPathSeg | undefined = segments?.getItem(i), - svgPathSeg = window.SVGPathSeg; + svgPathSeg = globalThis.SVGPathSeg; switch (segment?.pathSegType) { // diff --git a/plugins/polygonMask/webpack.config.js b/plugins/polygonMask/webpack.config.js index a2d468c1e44..aae5109c1f9 100644 --- a/plugins/polygonMask/webpack.config.js +++ b/plugins/polygonMask/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "polygon-mask", pluginName: "Polygon Mask", version, diff --git a/plugins/sounds/.eslintignore b/plugins/sounds/.eslintignore deleted file mode 100644 index 43b53119167..00000000000 --- a/plugins/sounds/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -dist -node_modules -src/pathseg.* diff --git a/plugins/sounds/.eslintrc.js b/plugins/sounds/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/plugins/sounds/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/plugins/sounds/CHANGELOG.md b/plugins/sounds/CHANGELOG.md index 2f2577270eb..1fd081a7d3c 100644 --- a/plugins/sounds/CHANGELOG.md +++ b/plugins/sounds/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/plugin-sounds + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/plugin-sounds diff --git a/plugins/sounds/eslint.config.js b/plugins/sounds/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/sounds/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/sounds/package.dist.json b/plugins/sounds/package.dist.json index e05c907af70..211d617653f 100644 --- a/plugins/sounds/package.dist.json +++ b/plugins/sounds/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/plugin-sounds", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles sounds plugin", "homepage": "https://particles.js.org", "repository": { @@ -86,9 +86,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/plugins/sounds/package.json b/plugins/sounds/package.json index 90a02385160..df902652967 100644 --- a/plugins/sounds/package.json +++ b/plugins/sounds/package.json @@ -1,104 +1,105 @@ { - "name": "@tsparticles/plugin-sounds", - "version": "3.9.1", - "description": "tsParticles sounds plugin", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/plugin-sounds", + "version": "4.0.0-alpha.0", + "description": "tsParticles sounds plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/sounds" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "plugins/sounds" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/plugins/sounds/src/Options/Classes/SoundsEvent.ts b/plugins/sounds/src/Options/Classes/SoundsEvent.ts index 2aa17a70cbb..d6526c8a9fd 100644 --- a/plugins/sounds/src/Options/Classes/SoundsEvent.ts +++ b/plugins/sounds/src/Options/Classes/SoundsEvent.ts @@ -76,7 +76,7 @@ export class SoundsEvent implements ISoundsEvent, IOptionLoader { if (data.filter) { if (isString(data.filter)) { - const filterFunc = (window as unknown as Record)[data.filter]; + const filterFunc = (globalThis as Record)[data.filter]; if (isFunction(filterFunc)) { this.filter = filterFunc as FilterFunction; diff --git a/plugins/sounds/src/SoundsInstance.ts b/plugins/sounds/src/SoundsInstance.ts index 65d2f95b300..de6f845904b 100644 --- a/plugins/sounds/src/SoundsInstance.ts +++ b/plugins/sounds/src/SoundsInstance.ts @@ -11,6 +11,7 @@ import { itemFromSingleOrMultiple, mouseDownEvent, percentDenominator, + safeDocument, touchStartEvent, } from "@tsparticles/engine"; import { ImageDisplay, SoundsEventType } from "./enums.js"; @@ -28,7 +29,7 @@ const zIndexOffset = 1, * @returns the image element */ function initImage(data: InitImageData): HTMLImageElement { - const img = document.createElement("img"), + const img = safeDocument().createElement("img"), { clickCb, container, display, iconOptions, margin, options, pos, rightOffsets } = data, { width, path, style, svg } = iconOptions, defaultAccumulator = 0; @@ -49,7 +50,7 @@ function initImage(data: InitImageData): HTMLImageElement { img.src = path ?? (svg ? `data:image/svg+xml;base64,${btoa(svg)}` : ""); - const parent = container.canvas.element?.parentNode ?? document.body; + const parent = container.canvas.element?.parentNode ?? safeDocument().body; parent.append(img); @@ -93,18 +94,17 @@ function setIconStyle( style: string, ): void { icon.style.userSelect = "none"; - icon.style.webkitUserSelect = "none"; icon.style.position = "absolute"; - icon.style.top = `${top + margin}px`; - icon.style.left = `${left - margin - width}px`; + icon.style.top = `${(top + margin).toString()}px`; + icon.style.left = `${(left - margin - width).toString()}px`; icon.style.display = display; - icon.style.zIndex = `${zIndex + zIndexOffset}`; + icon.style.zIndex = (zIndex + zIndexOffset).toString(); icon.style.cssText += style; } export class SoundsInstance implements IContainerPlugin { private _audioMap: Map; - private _audioSources: AudioScheduledSourceNode[]; + private readonly _audioSources: AudioScheduledSourceNode[]; private readonly _container; private readonly _engine; private _gain?: GainNode; @@ -343,9 +343,7 @@ export class SoundsInstance implements IContainerPlugin { private _getAudioContext(): AudioContext { const container = this._container; - if (!container.audioContext) { - container.audioContext = new AudioContext(); - } + container.audioContext ??= new AudioContext(); return container.audioContext; } @@ -367,7 +365,7 @@ export class SoundsInstance implements IContainerPlugin { return; } - if (!this._container || !!this._container.muted || this._container.destroyed) { + if (!!this._container.muted || this._container.destroyed) { executeOnSingleOrMultiple(event.event, item => { this._engine.removeEventListener(item, cb); }); @@ -382,10 +380,20 @@ export class SoundsInstance implements IContainerPlugin { const defaultNoteIndex = 0; if (event.audio) { - this._playBuffer(itemFromSingleOrMultiple(event.audio)); + const audio = itemFromSingleOrMultiple(event.audio); + + if (!audio) { + return; + } + + this._playBuffer(audio); } else if (event.melodies) { const melody = itemFromArray(event.melodies); + if (!melody) { + return; + } + if (melody.melodies.length) { await Promise.allSettled( melody.melodies.map(m => this._playNote(m.notes, defaultNoteIndex, melody.loop)), @@ -396,6 +404,10 @@ export class SoundsInstance implements IContainerPlugin { } else if (event.notes) { const note = itemFromArray(event.notes); + if (!note) { + return; + } + await this._playNote([note], defaultNoteIndex, false); } })(); @@ -515,11 +527,10 @@ export class SoundsInstance implements IContainerPlugin { return; } - const value = note.value; - - const promises = executeOnSingleOrMultiple(value, async (_, idx) => { - return this._playNoteValue(notes, noteIdx, idx); - }); + const value = note.value, + promises = executeOnSingleOrMultiple(value, async (_, idx) => { + return this._playNoteValue(notes, noteIdx, idx); + }); await (isArray(promises) ? Promise.allSettled(promises) : promises); @@ -531,10 +542,6 @@ export class SoundsInstance implements IContainerPlugin { nextNoteIdx = nextNoteIdx % notes.length; } - if (this._container.muted) { - return; - } - await this._playNote(notes, nextNoteIdx, loop); }; @@ -551,6 +558,10 @@ export class SoundsInstance implements IContainerPlugin { const value = itemFromSingleOrMultiple(note.value, valueIdx, true); + if (!value) { + return; + } + try { const freq = getNoteFrequency(value); @@ -582,13 +593,8 @@ export class SoundsInstance implements IContainerPlugin { return; } - const audioContext = this._getAudioContext(); - - if (!this._audioSources) { - this._audioSources = []; - } - - const gain = audioContext.createGain(); + const audioContext = this._getAudioContext(), + gain = audioContext.createGain(); gain.connect(audioContext.destination); @@ -626,10 +632,10 @@ export class SoundsInstance implements IContainerPlugin { audioContext = this._getAudioContext(); if (container.muted) { - await audioContext?.suspend(); + await audioContext.suspend(); await this._mute(); } else { - await audioContext?.resume(); + await audioContext.resume(); this._unmute(); this._playMuteSound(); diff --git a/plugins/sounds/src/index.ts b/plugins/sounds/src/index.ts index 9495d527ab2..ac93b69dc69 100644 --- a/plugins/sounds/src/index.ts +++ b/plugins/sounds/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { SoundsPlugin } from "./SoundsPlugin.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadSoundsPlugin(engine: Engine, refresh = true): Promise { +export function loadSoundsPlugin(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addPlugin(new SoundsPlugin(engine), refresh); + engine.register(async e => { + const { SoundsPlugin } = await import("./SoundsPlugin.js"); + + e.addPlugin(new SoundsPlugin(engine)); + }); } diff --git a/plugins/sounds/src/utils.ts b/plugins/sounds/src/utils.ts index 20c1b853bd3..101c5a463a6 100644 --- a/plugins/sounds/src/utils.ts +++ b/plugins/sounds/src/utils.ts @@ -42,14 +42,14 @@ export function getNoteFrequency(note: string): number | undefined { return; } - const noteKey = result[groupKey] || result[defaultMatchKey], + const noteKey = result[groupKey] ?? result[defaultMatchKey], noteItem = notes.get(noteKey); if (!noteItem) { return; } - return noteItem[parseInt(result[innerGroupKey] || "0")]; + return noteItem[parseInt(result[innerGroupKey] ?? "0")]; } let muted = true; diff --git a/plugins/sounds/webpack.config.js b/plugins/sounds/webpack.config.js index e32e17b4a2b..91a559841df 100644 --- a/plugins/sounds/webpack.config.js +++ b/plugins/sounds/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesPlugin } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesPlugin({ moduleName: "sounds", pluginName: "Sounds", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "sounds", pluginName: "Sounds", version, dir: __dirname }); diff --git a/plugins/trail/.browserslistrc b/plugins/trail/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/plugins/trail/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/plugins/trail/.npmignore b/plugins/trail/.npmignore new file mode 100644 index 00000000000..5c901533f98 --- /dev/null +++ b/plugins/trail/.npmignore @@ -0,0 +1 @@ +report.html \ No newline at end of file diff --git a/plugins/trail/CHANGELOG.md b/plugins/trail/CHANGELOG.md new file mode 100644 index 00000000000..d4fac19f759 --- /dev/null +++ b/plugins/trail/CHANGELOG.md @@ -0,0 +1,11 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) diff --git a/plugins/trail/LICENSE b/plugins/trail/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/plugins/trail/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/plugins/trail/README.md b/plugins/trail/README.md new file mode 100644 index 00000000000..bcbd80143e3 --- /dev/null +++ b/plugins/trail/README.md @@ -0,0 +1,74 @@ +[![banner](https://particles.js.org/images/banner2.png)](https://particles.js.org) + +# tsParticles Trail Plugin + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/plugin-trail/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/plugin-trail) +[![npmjs](https://badge.fury.io/js/@tsparticles/plugin-trail.svg)](https://www.npmjs.com/package/@tsparticles/plugin-trail) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/plugin-trail)](https://www.npmjs.com/package/@tsparticles/plugin-trail) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) plugin for handling trail feature. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.plugin.trail.min.js` file will export the function to load the plugin: + +```javascript +loadTrailPlugin; +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the plugin like this: + +```javascript +(async () => { + await loadTrailPlugin(tsParticles); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/plugin-trail +``` + +or + +```shell +$ yarn add @tsparticles/plugin-trail +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadTrailPlugin } = require("@tsparticles/plugin-trail"); + +(async () => { + await loadTrailPlugin(tsParticles); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadTrailPlugin } from "@tsparticles/plugin-trail"; + +(async () => { + await loadTrailPlugin(tsParticles); +})(); +``` diff --git a/plugins/trail/eslint.config.js b/plugins/trail/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/plugins/trail/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/plugins/trail/package.dist.json b/plugins/trail/package.dist.json new file mode 100644 index 00000000000..c8571ae6ede --- /dev/null +++ b/plugins/trail/package.dist.json @@ -0,0 +1,95 @@ +{ + "name": "@tsparticles/plugin-trail", + "version": "4.0.0-alpha.0", + "description": "tsParticles trail plugin", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/trail" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "sideEffects": false, + "jsdelivr": "tsparticles.plugin.trail.min.js", + "unpkg": "tsparticles.plugin.trail.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public" + }, + "type": "module" +} diff --git a/plugins/trail/package.json b/plugins/trail/package.json new file mode 100644 index 00000000000..5bd1cb88b1a --- /dev/null +++ b/plugins/trail/package.json @@ -0,0 +1,105 @@ +{ + "name": "@tsparticles/plugin-trail", + "version": "4.0.0-alpha.0", + "description": "tsParticles trail plugin", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "plugins/trail" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/plugins/trail/src/Options/Classes/Trail.ts b/plugins/trail/src/Options/Classes/Trail.ts new file mode 100644 index 00000000000..b908dea4c85 --- /dev/null +++ b/plugins/trail/src/Options/Classes/Trail.ts @@ -0,0 +1,35 @@ +import { type IOptionLoader, type RecursivePartial, isNull } from "@tsparticles/engine"; +import { type ITrail } from "../Interfaces/ITrail.js"; +import { TrailFill } from "./TrailFill.js"; + +/** + */ +export class Trail implements ITrail, IOptionLoader { + enable; + readonly fill; + length; + + constructor() { + this.enable = false; + this.length = 10; + this.fill = new TrailFill(); + } + + load(data?: RecursivePartial): void { + if (isNull(data)) { + return; + } + + if (data.enable !== undefined) { + this.enable = data.enable; + } + + if (data.fill !== undefined) { + this.fill.load(data.fill); + } + + if (data.length !== undefined) { + this.length = data.length; + } + } +} diff --git a/plugins/trail/src/Options/Classes/TrailFill.ts b/plugins/trail/src/Options/Classes/TrailFill.ts new file mode 100644 index 00000000000..36dc3013335 --- /dev/null +++ b/plugins/trail/src/Options/Classes/TrailFill.ts @@ -0,0 +1,21 @@ +import { type IOptionLoader, OptionsColor, type RecursivePartial, isNull } from "@tsparticles/engine"; +import { type ITrailFill } from "../Interfaces/ITrailFill.js"; + +export class TrailFill implements ITrailFill, IOptionLoader { + color?: OptionsColor; + image?: string; + + load(data?: RecursivePartial): void { + if (isNull(data)) { + return; + } + + if (data.color !== undefined) { + this.color = OptionsColor.create(this.color, data.color); + } + + if (data.image !== undefined) { + this.image = data.image; + } + } +} diff --git a/plugins/trail/src/Options/Interfaces/ITrail.ts b/plugins/trail/src/Options/Interfaces/ITrail.ts new file mode 100644 index 00000000000..7f2ab86827b --- /dev/null +++ b/plugins/trail/src/Options/Interfaces/ITrail.ts @@ -0,0 +1,11 @@ +import type { ITrailFill } from "./ITrailFill.js"; + +/** + */ +export interface ITrail { + enable: boolean; + + fill: ITrailFill; + + length: number; +} diff --git a/plugins/trail/src/Options/Interfaces/ITrailFill.ts b/plugins/trail/src/Options/Interfaces/ITrailFill.ts new file mode 100644 index 00000000000..3d82292e3e2 --- /dev/null +++ b/plugins/trail/src/Options/Interfaces/ITrailFill.ts @@ -0,0 +1,6 @@ +import { type IOptionsColor } from "@tsparticles/engine"; + +export interface ITrailFill { + color?: string | IOptionsColor; + image?: string; +} diff --git a/plugins/trail/src/TrailInstance.ts b/plugins/trail/src/TrailInstance.ts new file mode 100644 index 00000000000..fbeda50b8d7 --- /dev/null +++ b/plugins/trail/src/TrailInstance.ts @@ -0,0 +1,116 @@ +import { + type Engine, + type IContainerPlugin, + type IRgb, + getLogger, + getStyleFromRgb, + inverseFactorNumerator, + rangeColorToRgb, + safeDocument, +} from "@tsparticles/engine"; +import type { TrailContainer } from "./types.js"; + +const minimumLength = 0; + +interface ITrailFillData { + color?: IRgb; + image?: HTMLImageElement; + opacity: number; +} + +export class TrailInstance implements IContainerPlugin { + private readonly _container; + private readonly _engine; + private _trailFill?: ITrailFillData; + + constructor(container: TrailContainer, engine: Engine) { + this._container = container; + this._engine = engine; + } + + canvasClear(): boolean { + const container = this._container, + trail = container.actualOptions.trail, + trailFill = this._trailFill; + + if (!trail?.enable || !trailFill || trail.length <= minimumLength) { + return false; + } + + let handled = false; + + const canvas = container.canvas; + + if (trailFill.color) { + canvas.paintBase(getStyleFromRgb(trailFill.color, container.hdr, trailFill.opacity)); + + handled = true; + } else if (trailFill.image) { + canvas.paintImage(trailFill.image, trailFill.opacity); + + handled = true; + } + + return handled; + } + + async init(): Promise { + try { + await this._initTrail(); + } catch (e) { + getLogger().error(e); + } + } + + private readonly _initTrail: () => Promise = async () => { + const options = this._container.actualOptions, + trail = options.trail; + + if (!trail?.enable) { + return; + } + + const trailFill = trail.fill, + opacity = inverseFactorNumerator / trail.length; + + if (trailFill.color) { + const fillColor = rangeColorToRgb(this._engine, trailFill.color); + + if (!fillColor) { + return; + } + + this._trailFill = { + color: { + ...fillColor, + }, + opacity, + }; + } else { + await new Promise((resolve, reject) => { + if (!trailFill.image) { + return; + } + + const img = safeDocument().createElement("img"); + + img.addEventListener("load", () => { + this._trailFill = { + image: img, + opacity, + }; + + resolve(); + }); + + img.addEventListener("error", evt => { + getLogger().error(evt); + + reject(new Error("Error loading image")); + }); + + img.src = trailFill.image; + }); + } + }; +} diff --git a/plugins/trail/src/TrailPlugin.ts b/plugins/trail/src/TrailPlugin.ts new file mode 100644 index 00000000000..a8b6869f464 --- /dev/null +++ b/plugins/trail/src/TrailPlugin.ts @@ -0,0 +1,40 @@ +import type { Container, Engine, IPlugin, RecursivePartial } from "@tsparticles/engine"; +import type { ITrailOptions, TrailOptions } from "./types.js"; +import { Trail } from "./Options/Classes/Trail.js"; +import { TrailInstance } from "./TrailInstance.js"; + +/** + */ +export class TrailPlugin implements IPlugin { + readonly id; + + private readonly _engine; + + constructor(engine: Engine) { + this.id = "trail"; + + this._engine = engine; + } + + getPlugin(container: Container): Promise { + return Promise.resolve(new TrailInstance(container, this._engine)); + } + + loadOptions(options: TrailOptions, source?: RecursivePartial): void { + if (!this.needsPlugin()) { + return; + } + + let trailOptions = options.trail; + + if (!trailOptions?.load) { + options.trail = trailOptions = new Trail(); + } + + trailOptions.load(source?.trail); + } + + needsPlugin(): boolean { + return true; + } +} diff --git a/plugins/trail/src/index.ts b/plugins/trail/src/index.ts new file mode 100644 index 00000000000..aa8348e8054 --- /dev/null +++ b/plugins/trail/src/index.ts @@ -0,0 +1,16 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * @param engine - The engine instance + */ +export function loadTrailPlugin(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { TrailPlugin } = await import("./TrailPlugin.js"); + + e.addPlugin(new TrailPlugin(engine)); + }); +} diff --git a/plugins/trail/src/types.ts b/plugins/trail/src/types.ts new file mode 100644 index 00000000000..cdac56443b6 --- /dev/null +++ b/plugins/trail/src/types.ts @@ -0,0 +1,15 @@ +import type { Container, IOptions, Options } from "@tsparticles/engine"; +import type { ITrail } from "./Options/Interfaces/ITrail.js"; +import type { Trail } from "./Options/Classes/Trail.js"; + +export type ITrailOptions = IOptions & { + trail?: ITrail; +}; + +export type TrailOptions = Options & { + trail?: Trail; +}; + +export type TrailContainer = Container & { + actualOptions: TrailOptions; +}; diff --git a/plugins/trail/tsconfig.base.json b/plugins/trail/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/plugins/trail/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/plugins/trail/tsconfig.browser.json b/plugins/trail/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/plugins/trail/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/plugins/trail/tsconfig.json b/plugins/trail/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/plugins/trail/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/plugins/trail/tsconfig.module.json b/plugins/trail/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/plugins/trail/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/plugins/trail/tsconfig.types.json b/plugins/trail/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/plugins/trail/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/plugins/trail/tsconfig.umd.json b/plugins/trail/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/plugins/trail/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/plugins/trail/typedoc.json b/plugins/trail/typedoc.json new file mode 100644 index 00000000000..4b74ecd21e9 --- /dev/null +++ b/plugins/trail/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles Trail Plugin", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/plugins/trail/webpack.config.js b/plugins/trail/webpack.config.js new file mode 100644 index 00000000000..3c5d1bfcf71 --- /dev/null +++ b/plugins/trail/webpack.config.js @@ -0,0 +1,12 @@ +import { loadParticlesPlugin } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesPlugin({ moduleName: "trail", pluginName: "Trail", version, dir: __dirname }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2a164a0f061..3efcb633193 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,91 +1,87 @@ -lockfileVersion: '9.0' +lockfileVersion: "9.0" settings: autoInstallPeers: true excludeLinksFromLockfile: false importers: - .: devDependencies: - '@babel/core': - specifier: ^7.28.0 - version: 7.28.0 - '@commitlint/cli': - specifier: ^19.8.1 - version: 19.8.1(@types/node@24.1.0)(typescript@5.9.2) - '@commitlint/config-conventional': - specifier: ^19.8.1 - version: 19.8.1 - '@nx/workspace': - specifier: ^19.8.4 - version: 19.8.4(@swc/core@1.9.2) - '@tsparticles/cli': - specifier: ^2.3.3 - version: 2.3.3(@swc/core@1.9.2)(@types/eslint@8.56.6)(webpack-cli@6.0.1) - '@tsparticles/eslint-config': - specifier: ^2.3.0 - version: 2.3.0(@types/eslint@8.56.6) - '@tsparticles/prettier-config': - specifier: ^2.1.6 - version: 2.1.6 - '@tsparticles/tsconfig': - specifier: ^2.3.0 - version: 2.3.0 - '@tsparticles/webpack-plugin': - specifier: ^2.3.0 - version: 2.3.0(@swc/core@1.9.2)(@types/eslint@8.56.6) - '@types/jsdom': - specifier: ^21.1.7 - version: 21.1.7 - '@types/node': - specifier: ^24.1.0 - version: 24.1.0 - '@types/webpack-env': + "@babel/core": + specifier: ^7.28.5 + version: 7.28.5 + "@commitlint/cli": + specifier: ^20.2.0 + version: 20.2.0(@types/node@25.0.3)(typescript@5.9.3) + "@commitlint/config-conventional": + specifier: ^20.2.0 + version: 20.2.0 + "@nx/workspace": + specifier: ^22.3.3 + version: 22.3.3(@swc/core@1.9.2) + "@tsparticles/cli": + specifier: ^3.0.14 + version: 3.0.14(@swc/core@1.9.2)(@types/eslint@8.56.6)(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(jiti@2.4.2)(webpack-cli@6.0.1) + "@tsparticles/eslint-config": + specifier: ^3.0.9 + version: 3.0.9(eslint@9.39.2(jiti@2.4.2)) + "@tsparticles/prettier-config": + specifier: ^3.0.7 + version: 3.0.7 + "@tsparticles/tsconfig": + specifier: ^3.0.9 + version: 3.0.9 + "@tsparticles/webpack-plugin": + specifier: ^3.0.9 + version: 3.0.9(@swc/core@1.9.2)(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(jiti@2.4.2) + "@types/jsdom": + specifier: ^27.0.0 + version: 27.0.0 + "@types/node": + specifier: ^25.0.3 + version: 25.0.3 + "@types/webpack-env": specifier: ^1.18.8 version: 1.18.8 - '@typescript-eslint/eslint-plugin': - specifier: ^7.18.0 - version: 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': - specifier: ^7.18.0 - version: 7.18.0(eslint@8.57.1)(typescript@5.9.2) - '@vitest/coverage-v8': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4) - '@vitest/ui': - specifier: ^3.2.4 - version: 3.2.4(vitest@3.2.4) + "@vitest/coverage-v8": + specifier: ^4.0.16 + version: 4.0.16(vitest@4.0.16) + "@vitest/ui": + specifier: ^4.0.16 + version: 4.0.16(vitest@4.0.16) babel-loader: specifier: ^10.0.0 - version: 10.0.0(@babel/core@7.28.0)(webpack@5.101.0) + version: 10.0.0(@babel/core@7.28.5)(webpack@5.104.1) browserslist: - specifier: ^4.25.1 - version: 4.25.1 + specifier: ^4.28.1 + version: 4.28.1 canvas: - specifier: ^3.1.2 - version: 3.1.2 + specifier: ^3.2.0 + version: 3.2.0 copyfiles: specifier: ^2.4.1 version: 2.4.1 cross-env: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^10.1.0 + version: 10.1.0 eslint: - specifier: ^8.57.1 - version: 8.57.1 + specifier: ^9.39.2 + version: 9.39.2(jiti@2.4.2) eslint-config-prettier: - specifier: ^10.1.2 - version: 10.1.2(eslint@8.57.1) + specifier: ^10.1.8 + version: 10.1.8(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-jsdoc: - specifier: ^50.6.11 - version: 50.6.11(eslint@8.57.1) + specifier: ^61.5.0 + version: 61.5.0(eslint@9.39.2(jiti@2.4.2)) eslint-plugin-prettier: - specifier: ^5.4.0 - version: 5.4.0(@types/eslint@8.56.6)(eslint-config-prettier@10.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) + specifier: ^5.5.4 + version: 5.5.4(@types/eslint@8.56.6)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.4.2)))(eslint@9.39.2(jiti@2.4.2))(prettier@3.7.4) eslint-plugin-tsdoc: - specifier: ^0.4.0 - version: 0.4.0 + specifier: ^0.5.0 + version: 0.5.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + fs-extra: + specifier: ^11.3.3 + version: 11.3.3 gh-pages: specifier: ^6.3.0 version: 6.3.0 @@ -93,887 +89,935 @@ importers: specifier: ^9.1.7 version: 9.1.7 jsdom: - specifier: ^26.1.0 - version: 26.1.0(canvas@3.1.2) + specifier: ^27.4.0 + version: 27.4.0(canvas@3.2.0) jsdom-global: specifier: ^3.0.2 - version: 3.0.2(jsdom@26.1.0(canvas@3.1.2)) + version: 3.0.2(jsdom@27.4.0(canvas@3.2.0)) lerna: - specifier: ^8.2.3 - version: 8.2.3(@swc/core@1.9.2)(encoding@0.1.13) + specifier: ^9.0.3 + version: 9.0.3(@swc/core@1.9.2)(@types/node@25.0.3) madge: specifier: ^8.0.0 - version: 8.0.0(typescript@5.9.2) + version: 8.0.0(typescript@5.9.3) nx: - specifier: 19.8.14 - version: 19.8.14(@swc/core@1.9.2) + specifier: ^22.3.3 + version: 22.3.3(@swc/core@1.9.2) nx-cloud: specifier: ^19.1.0 version: 19.1.0 prettier: - specifier: ^3.6.2 - version: 3.6.2 + specifier: ^3.7.4 + version: 3.7.4 prettier-plugin-multiline-arrays: - specifier: ^4.0.3 - version: 4.0.3(prettier@3.6.2) + specifier: 4.1.3 + version: 4.1.3(prettier@3.7.4) rimraf: - specifier: ^6.0.1 - version: 6.0.1 + specifier: ^6.1.2 + version: 6.1.2 source-map-support: specifier: ^0.5.21 version: 0.5.21 terser-webpack-plugin: - specifier: ^5.3.14 - version: 5.3.14(@swc/core@1.9.2)(webpack@5.101.0) + specifier: ^5.3.16 + version: 5.3.16(@swc/core@1.9.2)(webpack@5.104.1) ts-json-schema-generator: specifier: ^2.4.0 version: 2.4.0 ts-node: specifier: ^10.9.2 - version: 10.9.2(@swc/core@1.9.2)(@types/node@24.1.0)(typescript@5.9.2) + version: 10.9.2(@swc/core@1.9.2)(@types/node@25.0.3)(typescript@5.9.3) typedoc: - specifier: ^0.28.9 - version: 0.28.9(typescript@5.9.2) + specifier: ^0.28.15 + version: 0.28.15(typescript@5.9.3) typedoc-plugin-carbon-ads: specifier: ^1.6.0 - version: 1.6.0(typedoc@0.28.9(typescript@5.9.2)) + version: 1.6.0(typedoc@0.28.15(typescript@5.9.3)) typedoc-plugin-clarity: specifier: ^1.6.0 - version: 1.6.0(typedoc@0.28.9(typescript@5.9.2)) + version: 1.6.0(typedoc@0.28.15(typescript@5.9.3)) typedoc-plugin-coverage: - specifier: ^4.0.1 - version: 4.0.1(typedoc@0.28.9(typescript@5.9.2)) + specifier: ^4.0.2 + version: 4.0.2(typedoc@0.28.15(typescript@5.9.3)) typedoc-plugin-keywords: specifier: ^1.6.0 - version: 1.6.0(typedoc@0.28.9(typescript@5.9.2)) + version: 1.6.0(typedoc@0.28.15(typescript@5.9.3)) typedoc-plugin-mdn-links: - specifier: ^5.0.7 - version: 5.0.7(typedoc@0.28.9(typescript@5.9.2)) + specifier: ^5.0.10 + version: 5.0.10(typedoc@0.28.15(typescript@5.9.3)) typedoc-plugin-missing-exports: - specifier: ^4.0.0 - version: 4.0.0(typedoc@0.28.9(typescript@5.9.2)) + specifier: ^4.1.2 + version: 4.1.2(typedoc@0.28.15(typescript@5.9.3)) typescript: - specifier: ^5.9.2 - version: 5.9.2 + specifier: ^5.9.3 + version: 5.9.3 + typescript-eslint: + specifier: ^8.51.0 + version: 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) typescript-json-schema: - specifier: ^0.65.1 - version: 0.65.1(@swc/core@1.9.2) + specifier: ^0.67.1 + version: 0.67.1(@swc/core@1.9.2) vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/node@24.1.0)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0(canvas@3.1.2))(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) + specifier: ^4.0.16 + version: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@27.4.0(canvas@3.2.0))(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1) webpack: - specifier: ^5.101.0 - version: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) + specifier: ^5.104.1 + version: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) webpack-bundle-analyzer: - specifier: ^4.10.2 - version: 4.10.2 + specifier: ^5.1.0 + version: 5.1.0 webpack-cli: specifier: ^6.0.1 - version: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + version: 6.0.1(webpack-bundle-analyzer@5.1.0)(webpack@5.104.1) yargs: specifier: ^18.0.0 version: 18.0.0 bundles/all: dependencies: - '@tsparticles/effect-bubble': - specifier: workspace:3.9.1 + "@tsparticles/effect-bubble": + specifier: workspace:4.0.0-alpha.0 version: link:../../effects/bubble/dist - '@tsparticles/effect-trail': - specifier: workspace:3.9.1 + "@tsparticles/effect-shadow": + specifier: workspace:4.0.0-alpha.0 + version: link:../../effects/shadow/dist + "@tsparticles/effect-trail": + specifier: workspace:4.0.0-alpha.0 version: link:../../effects/trail/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/interaction-external-particle': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-particle": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/particle/dist - '@tsparticles/interaction-external-pop': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-pop": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/pop/dist - '@tsparticles/interaction-light': - specifier: workspace:3.9.1 + "@tsparticles/interaction-light": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/light/dist - '@tsparticles/interaction-particles-repulse': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-repulse": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/repulse/dist - '@tsparticles/path-curl-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-curl-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/curlNoise/dist - '@tsparticles/path-curves': - specifier: workspace:3.9.1 + "@tsparticles/path-curves": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/curves/dist - '@tsparticles/path-fractal-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-fractal-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/fractalNoise/dist - '@tsparticles/path-perlin-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-perlin-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/perlinNoise/dist - '@tsparticles/path-polygon': - specifier: workspace:3.9.1 + "@tsparticles/path-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/polygon/dist - '@tsparticles/path-simplex-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-simplex-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/simplexNoise/dist - '@tsparticles/path-svg': - specifier: workspace:3.9.1 + "@tsparticles/path-svg": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/svg/dist - '@tsparticles/path-zig-zag': - specifier: workspace:3.9.1 + "@tsparticles/path-zig-zag": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/zigzag/dist - '@tsparticles/pjs': - specifier: workspace:3.9.1 + "@tsparticles/pjs": + specifier: workspace:4.0.0-alpha.0 version: link:../pjs/dist - '@tsparticles/plugin-canvas-mask': - specifier: workspace:3.9.1 + "@tsparticles/plugin-background-mask": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/backgroundMask/dist + "@tsparticles/plugin-canvas-mask": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/canvasMask/dist - '@tsparticles/plugin-easing-back': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-back": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/back/dist - '@tsparticles/plugin-easing-circ': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-circ": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/circ/dist - '@tsparticles/plugin-easing-cubic': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-cubic": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/cubic/dist - '@tsparticles/plugin-easing-expo': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-expo": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/expo/dist - '@tsparticles/plugin-easing-linear': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-linear": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/linear/dist - '@tsparticles/plugin-easing-quart': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-quart": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/quart/dist - '@tsparticles/plugin-easing-quint': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-quint": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/quint/dist - '@tsparticles/plugin-easing-sine': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-sine": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/sine/dist - '@tsparticles/plugin-emitters-shape-canvas': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-canvas": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/canvas/dist - '@tsparticles/plugin-emitters-shape-path': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-path": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/path/dist - '@tsparticles/plugin-emitters-shape-polygon': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/polygon/dist - '@tsparticles/plugin-export-image': - specifier: workspace:3.9.1 + "@tsparticles/plugin-export-image": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/exports/image/dist - '@tsparticles/plugin-export-json': - specifier: workspace:3.9.1 + "@tsparticles/plugin-export-json": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/exports/json/dist - '@tsparticles/plugin-export-video': - specifier: workspace:3.9.1 + "@tsparticles/plugin-export-video": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/exports/video/dist - '@tsparticles/plugin-hsv-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hsvColor/dist - '@tsparticles/plugin-infection': - specifier: workspace:3.9.1 + "@tsparticles/plugin-hsv-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hsv/dist + "@tsparticles/plugin-hwb-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hwb/dist + "@tsparticles/plugin-infection": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/infection/dist - '@tsparticles/plugin-motion': - specifier: workspace:3.9.1 + "@tsparticles/plugin-lab-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/lab/dist + "@tsparticles/plugin-lch-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/lch/dist + "@tsparticles/plugin-motion": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/motion/dist - '@tsparticles/plugin-named-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/namedColor/dist - '@tsparticles/plugin-oklch-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/oklchColor/dist - '@tsparticles/plugin-poisson-disc': - specifier: workspace:3.9.1 + "@tsparticles/plugin-named-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/named/dist + "@tsparticles/plugin-oklab-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/oklab/dist + "@tsparticles/plugin-oklch-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/oklch/dist + "@tsparticles/plugin-poisson-disc": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/poisson/dist - '@tsparticles/plugin-polygon-mask': - specifier: workspace:3.9.1 + "@tsparticles/plugin-polygon-mask": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/polygonMask/dist - '@tsparticles/plugin-sounds': - specifier: workspace:3.9.1 + "@tsparticles/plugin-sounds": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/sounds/dist - '@tsparticles/shape-arrow': - specifier: workspace:3.9.1 + "@tsparticles/plugin-trail": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/trail/dist + "@tsparticles/shape-arrow": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/arrow/dist - '@tsparticles/shape-cards': - specifier: workspace:3.9.1 + "@tsparticles/shape-cards": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/cards/dist - '@tsparticles/shape-cog': - specifier: workspace:3.9.1 + "@tsparticles/shape-cog": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/cog/dist - '@tsparticles/shape-heart': - specifier: workspace:3.9.1 + "@tsparticles/shape-heart": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/heart/dist - '@tsparticles/shape-infinity': - specifier: workspace:3.9.1 + "@tsparticles/shape-infinity": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/infinity/dist - '@tsparticles/shape-path': - specifier: workspace:3.9.1 + "@tsparticles/shape-path": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/path/dist - '@tsparticles/shape-rounded-polygon': - specifier: workspace:3.9.1 + "@tsparticles/shape-rounded-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/rounded-polygon/dist - '@tsparticles/shape-rounded-rect': - specifier: workspace:3.9.1 + "@tsparticles/shape-rounded-rect": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/rounded-rect/dist - '@tsparticles/shape-spiral': - specifier: workspace:3.9.1 + "@tsparticles/shape-spiral": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/spiral/dist - '@tsparticles/updater-gradient': - specifier: workspace:3.9.1 + "@tsparticles/updater-gradient": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/gradient/dist - '@tsparticles/updater-orbit': - specifier: workspace:3.9.1 + "@tsparticles/updater-orbit": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/orbit/dist tsparticles: - specifier: workspace:3.9.1 + specifier: workspace:4.0.0-alpha.0 version: link:../full/dist publishDirectory: dist bundles/basic: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/move-base': - specifier: workspace:3.9.1 + "@tsparticles/move-base": + specifier: workspace:4.0.0-alpha.0 version: link:../../move/base/dist - '@tsparticles/plugin-hex-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hexColor/dist - '@tsparticles/plugin-hsl-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hslColor/dist - '@tsparticles/plugin-rgb-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/rgbColor/dist - '@tsparticles/shape-circle': - specifier: workspace:3.9.1 + "@tsparticles/plugin-hex-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hex/dist + "@tsparticles/plugin-hsl-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hsl/dist + "@tsparticles/plugin-rgb-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/rgb/dist + "@tsparticles/shape-circle": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/circle/dist - '@tsparticles/updater-color': - specifier: workspace:3.9.1 + "@tsparticles/updater-color": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/color/dist - '@tsparticles/updater-opacity': - specifier: workspace:3.9.1 + "@tsparticles/updater-opacity": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/opacity/dist - '@tsparticles/updater-out-modes': - specifier: workspace:3.9.1 + "@tsparticles/updater-out-modes": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/outModes/dist - '@tsparticles/updater-size': - specifier: workspace:3.9.1 + "@tsparticles/updater-size": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/size/dist publishDirectory: dist bundles/confetti: dependencies: - '@tsparticles/basic': - specifier: workspace:3.9.1 + "@tsparticles/basic": + specifier: workspace:4.0.0-alpha.0 version: link:../basic/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emitters/dist - '@tsparticles/plugin-motion': - specifier: workspace:3.9.1 + "@tsparticles/plugin-motion": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/motion/dist - '@tsparticles/shape-cards': - specifier: workspace:3.9.1 + "@tsparticles/shape-cards": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/cards/dist - '@tsparticles/shape-emoji': - specifier: workspace:3.9.1 + "@tsparticles/shape-emoji": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/emoji/dist - '@tsparticles/shape-heart': - specifier: workspace:3.9.1 + "@tsparticles/shape-heart": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/heart/dist - '@tsparticles/shape-image': - specifier: workspace:3.9.1 + "@tsparticles/shape-image": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/image/dist - '@tsparticles/shape-polygon': - specifier: workspace:3.9.1 + "@tsparticles/shape-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/polygon/dist - '@tsparticles/shape-square': - specifier: workspace:3.9.1 + "@tsparticles/shape-square": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/square/dist - '@tsparticles/shape-star': - specifier: workspace:3.9.1 + "@tsparticles/shape-star": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/star/dist - '@tsparticles/updater-life': - specifier: workspace:3.9.1 + "@tsparticles/updater-life": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/life/dist - '@tsparticles/updater-roll': - specifier: workspace:3.9.1 + "@tsparticles/updater-roll": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/roll/dist - '@tsparticles/updater-rotate': - specifier: workspace:3.9.1 + "@tsparticles/updater-rotate": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/rotate/dist - '@tsparticles/updater-tilt': - specifier: workspace:3.9.1 + "@tsparticles/updater-tilt": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/tilt/dist - '@tsparticles/updater-wobble': - specifier: workspace:3.9.1 + "@tsparticles/updater-wobble": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/wobble/dist publishDirectory: dist bundles/fireworks: dependencies: - '@tsparticles/basic': - specifier: workspace:3.9.1 + "@tsparticles/basic": + specifier: workspace:4.0.0-alpha.0 version: link:../basic/dist - '@tsparticles/effect-trail': - specifier: workspace:3.9.1 + "@tsparticles/effect-trail": + specifier: workspace:4.0.0-alpha.0 version: link:../../effects/trail/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emitters/dist - '@tsparticles/plugin-emitters-shape-square': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-square": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/square/dist - '@tsparticles/plugin-sounds': - specifier: workspace:3.9.1 + "@tsparticles/plugin-sounds": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/sounds/dist - '@tsparticles/updater-destroy': - specifier: workspace:3.9.1 + "@tsparticles/updater-destroy": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/destroy/dist - '@tsparticles/updater-life': - specifier: workspace:3.9.1 + "@tsparticles/updater-life": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/life/dist - '@tsparticles/updater-rotate': - specifier: workspace:3.9.1 + "@tsparticles/updater-rotate": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/rotate/dist publishDirectory: dist bundles/full: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/interaction-external-trail': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-trail": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/trail/dist - '@tsparticles/plugin-absorbers': - specifier: workspace:3.9.1 + "@tsparticles/plugin-absorbers": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/absorbers/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emitters/dist - '@tsparticles/plugin-emitters-shape-circle': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-circle": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/circle/dist - '@tsparticles/plugin-emitters-shape-square': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-square": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/square/dist - '@tsparticles/shape-text': - specifier: workspace:3.9.1 + "@tsparticles/shape-text": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/text/dist - '@tsparticles/slim': - specifier: workspace:3.9.1 + "@tsparticles/slim": + specifier: workspace:4.0.0-alpha.0 version: link:../slim/dist - '@tsparticles/updater-destroy': - specifier: workspace:3.9.1 + "@tsparticles/updater-destroy": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/destroy/dist - '@tsparticles/updater-roll': - specifier: workspace:3.9.1 + "@tsparticles/updater-roll": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/roll/dist - '@tsparticles/updater-tilt': - specifier: workspace:3.9.1 + "@tsparticles/updater-tilt": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/tilt/dist - '@tsparticles/updater-twinkle': - specifier: workspace:3.9.1 + "@tsparticles/updater-twinkle": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/twinkle/dist - '@tsparticles/updater-wobble': - specifier: workspace:3.9.1 + "@tsparticles/updater-wobble": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/wobble/dist publishDirectory: dist bundles/pjs: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist bundles/slim: dependencies: - '@tsparticles/basic': - specifier: workspace:3.9.1 + "@tsparticles/basic": + specifier: workspace:4.0.0-alpha.0 version: link:../basic/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/interaction-external-attract': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-attract": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/attract/dist - '@tsparticles/interaction-external-bounce': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-bounce": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/bounce/dist - '@tsparticles/interaction-external-bubble': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-bubble": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/bubble/dist - '@tsparticles/interaction-external-connect': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-connect": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/connect/dist - '@tsparticles/interaction-external-grab': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-grab": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/grab/dist - '@tsparticles/interaction-external-pause': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-pause": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/pause/dist - '@tsparticles/interaction-external-push': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-push": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/push/dist - '@tsparticles/interaction-external-remove': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-remove": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/remove/dist - '@tsparticles/interaction-external-repulse': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-repulse": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/repulse/dist - '@tsparticles/interaction-external-slow': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-slow": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/slow/dist - '@tsparticles/interaction-particles-attract': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-attract": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/attract/dist - '@tsparticles/interaction-particles-collisions': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-collisions": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/collisions/dist - '@tsparticles/interaction-particles-links': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-links": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/links/dist - '@tsparticles/move-parallax': - specifier: workspace:3.9.1 + "@tsparticles/move-parallax": + specifier: workspace:4.0.0-alpha.0 version: link:../../move/parallax/dist - '@tsparticles/plugin-easing-quad': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-quad": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/quad/dist - '@tsparticles/shape-emoji': - specifier: workspace:3.9.1 + "@tsparticles/shape-emoji": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/emoji/dist - '@tsparticles/shape-image': - specifier: workspace:3.9.1 + "@tsparticles/shape-image": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/image/dist - '@tsparticles/shape-line': - specifier: workspace:3.9.1 + "@tsparticles/shape-line": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/line/dist - '@tsparticles/shape-polygon': - specifier: workspace:3.9.1 + "@tsparticles/shape-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/polygon/dist - '@tsparticles/shape-square': - specifier: workspace:3.9.1 + "@tsparticles/shape-square": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/square/dist - '@tsparticles/shape-star': - specifier: workspace:3.9.1 + "@tsparticles/shape-star": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/star/dist - '@tsparticles/updater-life': - specifier: workspace:3.9.1 + "@tsparticles/updater-life": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/life/dist - '@tsparticles/updater-rotate': - specifier: workspace:3.9.1 + "@tsparticles/updater-rotate": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/rotate/dist - '@tsparticles/updater-stroke-color': - specifier: workspace:3.9.1 + "@tsparticles/updater-stroke-color": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/strokeColor/dist publishDirectory: dist demo/electron: dependencies: - '@tsparticles/configs': - specifier: workspace:3.9.1 + "@tsparticles/configs": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/configs/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist tsparticles: - specifier: workspace:3.9.1 + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/full/dist devDependencies: electron: - specifier: ^35.0.0 - version: 35.0.0 + specifier: ^39.2.7 + version: 39.2.7 demo/vanilla: dependencies: - '@tsparticles/all': - specifier: workspace:3.9.1 + "@tsparticles/all": + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/all/dist - '@tsparticles/basic': - specifier: workspace:3.9.1 + "@tsparticles/basic": + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/basic/dist - '@tsparticles/confetti': - specifier: workspace:3.9.1 + "@tsparticles/confetti": + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/confetti/dist - '@tsparticles/configs': - specifier: workspace:3.9.1 + "@tsparticles/configs": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/configs/dist - '@tsparticles/effect-bubble': - specifier: workspace:3.9.1 + "@tsparticles/effect-bubble": + specifier: workspace:4.0.0-alpha.0 version: link:../../effects/bubble/dist - '@tsparticles/effect-trail': - specifier: workspace:3.9.1 + "@tsparticles/effect-shadow": + specifier: workspace:4.0.0-alpha.0 + version: link:../../effects/shadow/dist + "@tsparticles/effect-trail": + specifier: workspace:4.0.0-alpha.0 version: link:../../effects/trail/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/fireworks': - specifier: workspace:3.9.1 + "@tsparticles/fireworks": + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/fireworks/dist - '@tsparticles/fractal-noise': - specifier: workspace:3.9.1 + "@tsparticles/fractal-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/fractalNoise/dist - '@tsparticles/interaction-external-attract': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-attract": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/attract/dist - '@tsparticles/interaction-external-bounce': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-bounce": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/bounce/dist - '@tsparticles/interaction-external-bubble': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-bubble": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/bubble/dist - '@tsparticles/interaction-external-connect': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-connect": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/connect/dist - '@tsparticles/interaction-external-grab': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-grab": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/grab/dist - '@tsparticles/interaction-external-particle': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-particle": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/particle/dist - '@tsparticles/interaction-external-pause': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-pause": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/pause/dist - '@tsparticles/interaction-external-pop': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-pop": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/pop/dist - '@tsparticles/interaction-external-push': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-push": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/push/dist - '@tsparticles/interaction-external-remove': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-remove": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/remove/dist - '@tsparticles/interaction-external-repulse': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-repulse": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/repulse/dist - '@tsparticles/interaction-external-slow': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-slow": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/slow/dist - '@tsparticles/interaction-external-trail': - specifier: workspace:3.9.1 + "@tsparticles/interaction-external-trail": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/external/trail/dist - '@tsparticles/interaction-light': - specifier: workspace:3.9.1 + "@tsparticles/interaction-light": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/light/dist - '@tsparticles/interaction-particles-attract': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-attract": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/attract/dist - '@tsparticles/interaction-particles-collisions': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-collisions": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/collisions/dist - '@tsparticles/interaction-particles-links': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-links": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/links/dist - '@tsparticles/interaction-particles-repulse': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-repulse": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/repulse/dist - '@tsparticles/move-base': - specifier: workspace:3.9.1 + "@tsparticles/move-base": + specifier: workspace:4.0.0-alpha.0 version: link:../../move/base/dist - '@tsparticles/move-parallax': - specifier: workspace:3.9.1 + "@tsparticles/move-parallax": + specifier: workspace:4.0.0-alpha.0 version: link:../../move/parallax/dist - '@tsparticles/path-curl-noise': - specifier: workspace:3.9.1 + "@tsparticles/noise-field": + specifier: workspace:4.0.0-alpha.0 + version: link:../../utils/noiseField/dist + "@tsparticles/path-curl-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/curlNoise/dist - '@tsparticles/path-curves': - specifier: workspace:3.9.1 + "@tsparticles/path-curves": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/curves/dist - '@tsparticles/path-fractal-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-fractal-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/fractalNoise/dist - '@tsparticles/path-perlin-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-perlin-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/perlinNoise/dist - '@tsparticles/path-polygon': - specifier: workspace:3.9.1 + "@tsparticles/path-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/polygon/dist - '@tsparticles/path-simplex-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-simplex-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/simplexNoise/dist - '@tsparticles/path-svg': - specifier: workspace:3.9.1 + "@tsparticles/path-svg": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/svg/dist - '@tsparticles/path-zig-zag': - specifier: workspace:3.9.1 + "@tsparticles/path-zig-zag": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/zigzag/dist - '@tsparticles/perlin-noise': - specifier: workspace:3.9.1 + "@tsparticles/perlin-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/perlinNoise/dist - '@tsparticles/pjs': - specifier: workspace:3.9.1 + "@tsparticles/pjs": + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/pjs/dist - '@tsparticles/plugin-absorbers': - specifier: workspace:3.9.1 + "@tsparticles/plugin-absorbers": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/absorbers/dist - '@tsparticles/plugin-canvas-mask': - specifier: workspace:3.9.1 + "@tsparticles/plugin-background-mask": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/backgroundMask/dist + "@tsparticles/plugin-canvas-mask": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/canvasMask/dist - '@tsparticles/plugin-easing-back': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-back": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/back/dist - '@tsparticles/plugin-easing-circ': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-circ": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/circ/dist - '@tsparticles/plugin-easing-cubic': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-cubic": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/cubic/dist - '@tsparticles/plugin-easing-expo': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-expo": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/expo/dist - '@tsparticles/plugin-easing-linear': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-linear": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/linear/dist - '@tsparticles/plugin-easing-quad': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-quad": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/quad/dist - '@tsparticles/plugin-easing-quart': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-quart": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/quart/dist - '@tsparticles/plugin-easing-quint': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-quint": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/quint/dist - '@tsparticles/plugin-easing-sine': - specifier: workspace:3.9.1 + "@tsparticles/plugin-easing-sine": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/easings/sine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emitters/dist - '@tsparticles/plugin-emitters-shape-canvas': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-canvas": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/canvas/dist - '@tsparticles/plugin-emitters-shape-circle': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-circle": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/circle/dist - '@tsparticles/plugin-emitters-shape-path': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-path": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/path/dist - '@tsparticles/plugin-emitters-shape-polygon': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/polygon/dist - '@tsparticles/plugin-emitters-shape-square': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters-shape-square": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/emittersShapes/square/dist - '@tsparticles/plugin-export-image': - specifier: workspace:3.9.1 + "@tsparticles/plugin-export-image": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/exports/image/dist - '@tsparticles/plugin-export-json': - specifier: workspace:3.9.1 + "@tsparticles/plugin-export-json": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/exports/json/dist - '@tsparticles/plugin-export-video': - specifier: workspace:3.9.1 + "@tsparticles/plugin-export-video": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/exports/video/dist - '@tsparticles/plugin-hex-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hexColor/dist - '@tsparticles/plugin-hsl-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hslColor/dist - '@tsparticles/plugin-hsv-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hsvColor/dist - '@tsparticles/plugin-infection': - specifier: workspace:3.9.1 + "@tsparticles/plugin-hex-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hex/dist + "@tsparticles/plugin-hsl-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hsl/dist + "@tsparticles/plugin-hsv-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hsv/dist + "@tsparticles/plugin-hwb-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hwb/dist + "@tsparticles/plugin-infection": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/infection/dist - '@tsparticles/plugin-motion': - specifier: workspace:3.9.1 + "@tsparticles/plugin-lab-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/lab/dist + "@tsparticles/plugin-lch-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/lch/dist + "@tsparticles/plugin-motion": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/motion/dist - '@tsparticles/plugin-named-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/namedColor/dist - '@tsparticles/plugin-oklch-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/oklchColor/dist - '@tsparticles/plugin-poisson-disc': - specifier: workspace:3.9.1 + "@tsparticles/plugin-named-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/named/dist + "@tsparticles/plugin-oklab-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/oklab/dist + "@tsparticles/plugin-oklch-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/oklch/dist + "@tsparticles/plugin-poisson-disc": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/poisson/dist - '@tsparticles/plugin-polygon-mask': - specifier: workspace:3.9.1 + "@tsparticles/plugin-polygon-mask": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/polygonMask/dist - '@tsparticles/plugin-rgb-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/rgbColor/dist - '@tsparticles/plugin-sounds': - specifier: workspace:3.9.1 + "@tsparticles/plugin-rgb-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/rgb/dist + "@tsparticles/plugin-sounds": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/sounds/dist - '@tsparticles/shape-arrow': - specifier: workspace:3.9.1 + "@tsparticles/plugin-trail": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/trail/dist + "@tsparticles/shape-arrow": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/arrow/dist - '@tsparticles/shape-cards': - specifier: workspace:3.9.1 + "@tsparticles/shape-cards": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/cards/dist - '@tsparticles/shape-circle': - specifier: workspace:3.9.1 + "@tsparticles/shape-circle": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/circle/dist - '@tsparticles/shape-cog': - specifier: workspace:3.9.1 + "@tsparticles/shape-cog": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/cog/dist - '@tsparticles/shape-emoji': - specifier: workspace:3.9.1 + "@tsparticles/shape-emoji": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/emoji/dist - '@tsparticles/shape-heart': - specifier: workspace:3.9.1 + "@tsparticles/shape-heart": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/heart/dist - '@tsparticles/shape-image': - specifier: workspace:3.9.1 + "@tsparticles/shape-image": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/image/dist - '@tsparticles/shape-infinity': - specifier: workspace:3.9.1 + "@tsparticles/shape-infinity": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/infinity/dist - '@tsparticles/shape-line': - specifier: workspace:3.9.1 + "@tsparticles/shape-line": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/line/dist - '@tsparticles/shape-path': - specifier: workspace:3.9.1 + "@tsparticles/shape-path": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/path/dist - '@tsparticles/shape-polygon': - specifier: workspace:3.9.1 + "@tsparticles/shape-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/polygon/dist - '@tsparticles/shape-rounded-polygon': - specifier: workspace:3.9.1 + "@tsparticles/shape-rounded-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/rounded-polygon/dist - '@tsparticles/shape-rounded-rect': - specifier: workspace:3.9.1 + "@tsparticles/shape-rounded-rect": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/rounded-rect/dist - '@tsparticles/shape-spiral': - specifier: workspace:3.9.1 + "@tsparticles/shape-spiral": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/spiral/dist - '@tsparticles/shape-square': - specifier: workspace:3.9.1 + "@tsparticles/shape-square": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/square/dist - '@tsparticles/shape-star': - specifier: workspace:3.9.1 + "@tsparticles/shape-star": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/star/dist - '@tsparticles/shape-text': - specifier: workspace:3.9.1 + "@tsparticles/shape-text": + specifier: workspace:4.0.0-alpha.0 version: link:../../shapes/text/dist - '@tsparticles/simplex-noise': - specifier: workspace:3.9.1 + "@tsparticles/simplex-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/simplexNoise/dist - '@tsparticles/slim': - specifier: workspace:3.9.1 + "@tsparticles/slim": + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/slim/dist - '@tsparticles/smooth-value-noise': - specifier: workspace:3.9.1 + "@tsparticles/smooth-value-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/smoothValueNoise/dist - '@tsparticles/updater-color': - specifier: workspace:3.9.1 + "@tsparticles/updater-color": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/color/dist - '@tsparticles/updater-destroy': - specifier: workspace:3.9.1 + "@tsparticles/updater-destroy": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/destroy/dist - '@tsparticles/updater-gradient': - specifier: workspace:3.9.1 + "@tsparticles/updater-gradient": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/gradient/dist - '@tsparticles/updater-life': - specifier: workspace:3.9.1 + "@tsparticles/updater-life": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/life/dist - '@tsparticles/updater-opacity': - specifier: workspace:3.9.1 + "@tsparticles/updater-opacity": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/opacity/dist - '@tsparticles/updater-orbit': - specifier: workspace:3.9.1 + "@tsparticles/updater-orbit": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/orbit/dist - '@tsparticles/updater-out-modes': - specifier: workspace:3.9.1 + "@tsparticles/updater-out-modes": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/outModes/dist - '@tsparticles/updater-roll': - specifier: workspace:3.9.1 + "@tsparticles/updater-roll": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/roll/dist - '@tsparticles/updater-rotate': - specifier: workspace:3.9.1 + "@tsparticles/updater-rotate": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/rotate/dist - '@tsparticles/updater-size': - specifier: workspace:3.9.1 + "@tsparticles/updater-size": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/size/dist - '@tsparticles/updater-stroke-color': - specifier: workspace:3.9.1 + "@tsparticles/updater-stroke-color": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/strokeColor/dist - '@tsparticles/updater-tilt': - specifier: workspace:3.9.1 + "@tsparticles/updater-tilt": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/tilt/dist - '@tsparticles/updater-twinkle': - specifier: workspace:3.9.1 + "@tsparticles/updater-twinkle": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/twinkle/dist - '@tsparticles/updater-wobble': - specifier: workspace:3.9.1 + "@tsparticles/updater-wobble": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/wobble/dist tsparticles: - specifier: workspace:3.9.1 + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/full/dist devDependencies: - '@datalust/winston-seq': - specifier: ^2.0.0 - version: 2.0.0(encoding@0.1.13)(winston@3.11.0) - '@fortawesome/fontawesome-free': - specifier: ^6.4.2 - version: 6.4.2 - '@types/connect-livereload': + "@datalust/winston-seq": + specifier: ^3.0.1 + version: 3.0.1(encoding@0.1.13)(winston@3.19.0) + "@fortawesome/fontawesome-free": + specifier: ^7.1.0 + version: 7.1.0 + "@types/connect-livereload": specifier: ^0.6.3 version: 0.6.3 - '@types/express': - specifier: ^5.0.0 - version: 5.0.0 - '@types/livereload': + "@types/express": + specifier: ^5.0.6 + version: 5.0.6 + "@types/livereload": specifier: ^0.9.5 version: 0.9.5 - '@types/node': - specifier: ^22.0.0 - version: 22.7.5 - '@types/stylus': - specifier: ^0.48.41 - version: 0.48.41 + "@types/node": + specifier: ^25.0.3 + version: 25.0.3 + "@types/stylus": + specifier: ^0.48.43 + version: 0.48.43 ace-builds: - specifier: ^1.31.1 - version: 1.31.1 + specifier: ^1.43.5 + version: 1.43.5 bootstrap: - specifier: ^5.3.2 - version: 5.3.2(@popperjs/core@2.11.8) + specifier: ^5.3.8 + version: 5.3.8(@popperjs/core@2.11.8) concurrently: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^9.2.1 + version: 9.2.1 connect-livereload: specifier: ^0.6.1 version: 0.6.1 dotenv: - specifier: ^16.3.1 - version: 16.3.1 + specifier: ^17.2.3 + version: 17.2.3 express: - specifier: ^4.18.2 - version: 4.20.0 + specifier: ^5.2.1 + version: 5.2.1 express-rate-limit: - specifier: ^7.1.4 - version: 7.1.4(express@4.20.0) + specifier: ^8.2.1 + version: 8.2.1(express@5.2.1) helmet: - specifier: ^8.0.0 - version: 8.0.0 + specifier: ^8.1.0 + version: 8.1.0 jquery: specifier: ^3.7.1 version: 3.7.1 jsoneditor: - specifier: ^10.0.0 - version: 10.0.0 + specifier: ^10.4.2 + version: 10.4.2 livereload: - specifier: ^0.9.3 - version: 0.9.3 + specifier: ^0.10.3 + version: 0.10.3 lodash: specifier: ^4.17.21 version: 4.17.21 nodemon: - specifier: ^3.0.1 - version: 3.0.1 + specifier: ^3.1.11 + version: 3.1.11 pug: specifier: ^3.0.2 version: 3.0.3 @@ -984,88 +1028,95 @@ importers: specifier: ^0.64.0 version: 0.64.0 winston: - specifier: ^3.11.0 - version: 3.11.0 + specifier: ^3.19.0 + version: 3.19.0 demo/vanilla_new: dependencies: - '@tsparticles/configs': - specifier: workspace:3.9.1 + "@tsparticles/configs": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/configs/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/interaction-light': - specifier: workspace:3.9.1 + "@tsparticles/interaction-light": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/light/dist - '@tsparticles/interaction-particles-repulse': - specifier: workspace:3.9.1 + "@tsparticles/interaction-particles-repulse": + specifier: workspace:4.0.0-alpha.0 version: link:../../interactions/particles/repulse/dist - '@tsparticles/path-curves': - specifier: workspace:3.9.1 + "@tsparticles/path-curves": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/curves/dist - '@tsparticles/path-perlin-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-perlin-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/perlinNoise/dist - '@tsparticles/path-polygon': - specifier: workspace:3.9.1 + "@tsparticles/path-polygon": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/polygon/dist - '@tsparticles/path-simplex-noise': - specifier: workspace:3.9.1 + "@tsparticles/path-simplex-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../paths/simplexNoise/dist - '@tsparticles/plugin-infection': - specifier: workspace:3.9.1 + "@tsparticles/plugin-infection": + specifier: workspace:4.0.0-alpha.0 version: link:../../plugins/infection/dist - '@tsparticles/updater-gradient': - specifier: workspace:3.9.1 + "@tsparticles/updater-gradient": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/gradient/dist - '@tsparticles/updater-orbit': - specifier: workspace:3.9.1 + "@tsparticles/updater-orbit": + specifier: workspace:4.0.0-alpha.0 version: link:../../updaters/orbit/dist tsparticles: - specifier: workspace:3.9.1 + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/full/dist devDependencies: fs-extra: - specifier: ^11.1.1 - version: 11.1.1 + specifier: ^11.3.3 + version: 11.3.3 minify: - specifier: ^13.0.0 - version: 13.0.0 + specifier: ^15.0.0 + version: 15.0.0 sass: - specifier: ^1.69.5 - version: 1.69.5 + specifier: ^1.97.1 + version: 1.97.1 demo/vite: dependencies: - '@tsparticles/all': - specifier: workspace:3.9.1 + "@tsparticles/all": + specifier: workspace:4.0.0-alpha.0 version: link:../../bundles/all/dist - '@tsparticles/configs': - specifier: workspace:3.9.1 + "@tsparticles/configs": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/configs/dist - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist devDependencies: typescript: - specifier: ^5.3.3 - version: 5.3.3 + specifier: ^5.9.3 + version: 5.9.3 vite: - specifier: ^6.0.0 - version: 6.3.6(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(sass@1.69.5)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) + specifier: ^7.3.0 + version: 7.3.0(@types/node@25.0.3)(jiti@2.4.2)(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1) effects/bubble: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../engine/dist + publishDirectory: dist + + effects/shadow: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist effects/trail: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist @@ -1074,675 +1125,733 @@ importers: interactions/external/attract: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/bounce: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/bubble: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/connect: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/grab: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/particle: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/pause: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/pop: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/push: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/remove: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/repulse: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/slow: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/external/trail: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/light: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist interactions/particles/attract: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/particles/collisions: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/particles/links: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist interactions/particles/repulse: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist move/base: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist move/parallax: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist paths/curlNoise: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/simplex-noise': - specifier: workspace:3.9.1 + "@tsparticles/simplex-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/simplexNoise/dist publishDirectory: dist paths/curves: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist paths/fractalNoise: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/fractal-noise': - specifier: workspace:3.9.1 + "@tsparticles/fractal-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/fractalNoise/dist + "@tsparticles/noise-field": + specifier: workspace:4.0.0-alpha.0 + version: link:../../utils/noiseField/dist publishDirectory: dist paths/perlinNoise: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/perlin-noise': - specifier: workspace:3.9.1 + "@tsparticles/noise-field": + specifier: workspace:4.0.0-alpha.0 + version: link:../../utils/noiseField/dist + "@tsparticles/perlin-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/perlinNoise/dist publishDirectory: dist paths/polygon: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist paths/simplexNoise: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/simplex-noise': - specifier: workspace:3.9.1 + "@tsparticles/noise-field": + specifier: workspace:4.0.0-alpha.0 + version: link:../../utils/noiseField/dist + "@tsparticles/simplex-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../../utils/simplexNoise/dist publishDirectory: dist paths/svg: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist paths/zigzag: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist plugins/absorbers: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../engine/dist + publishDirectory: dist + + plugins/backgroundMask: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist plugins/canvasMask: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist - plugins/colors/hexColor: + plugins/colors/hex: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../../engine/dist + publishDirectory: dist + + plugins/colors/hsl: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../../engine/dist + publishDirectory: dist + + plugins/colors/hsv: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../../engine/dist + publishDirectory: dist + + plugins/colors/hwb: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../../engine/dist + publishDirectory: dist + + plugins/colors/lab: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist - plugins/colors/hslColor: + plugins/colors/lch: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist - plugins/colors/hsvColor: + plugins/colors/named: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist - plugins/colors/namedColor: + plugins/colors/oklab: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist - plugins/colors/oklchColor: + plugins/colors/oklch: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist - plugins/colors/rgbColor: + plugins/colors/rgb: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/back: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/circ: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/cubic: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/expo: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/linear: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/quad: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/quart: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/quint: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/easings/sine: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/emitters: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist plugins/emittersShapes/canvas: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../emitters/dist publishDirectory: dist plugins/emittersShapes/circle: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../emitters/dist publishDirectory: dist plugins/emittersShapes/path: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../emitters/dist publishDirectory: dist plugins/emittersShapes/polygon: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../emitters/dist publishDirectory: dist plugins/emittersShapes/square: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist - '@tsparticles/plugin-emitters': - specifier: workspace:3.9.1 + "@tsparticles/plugin-emitters": + specifier: workspace:4.0.0-alpha.0 version: link:../../emitters/dist publishDirectory: dist plugins/exports/image: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/exports/json: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/exports/video: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../../engine/dist publishDirectory: dist plugins/infection: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist plugins/motion: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist plugins/poisson: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist plugins/polygonMask: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist plugins/sounds: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../engine/dist + publishDirectory: dist + + plugins/trail: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/arrow: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/cards: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/circle: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/cog: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/emoji: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/heart: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/image: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/infinity: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/line: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/path: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/polygon: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/rounded-polygon: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/rounded-rect: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/spiral: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/square: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/star: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist shapes/text: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/color: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/destroy: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/gradient: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/life: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/opacity: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/orbit: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/outModes: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/roll: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/rotate: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/size: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/strokeColor: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/tilt: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/twinkle: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist updaters/wobble: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist utils/configs: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist publishDirectory: dist utils/fractalNoise: dependencies: - '@tsparticles/smooth-value-noise': - specifier: workspace:3.9.1 + "@tsparticles/smooth-value-noise": + specifier: workspace:4.0.0-alpha.0 version: link:../smoothValueNoise/dist publishDirectory: dist + utils/noiseField: + dependencies: + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 + version: link:../../engine/dist + publishDirectory: dist + utils/perlinNoise: publishDirectory: dist @@ -1754,2391 +1863,2953 @@ importers: utils/tests: dependencies: - '@tsparticles/engine': - specifier: workspace:3.9.1 + "@tsparticles/engine": + specifier: workspace:4.0.0-alpha.0 version: link:../../engine/dist - '@tsparticles/plugin-hex-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hexColor/dist - '@tsparticles/plugin-hsl-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hslColor/dist - '@tsparticles/plugin-hsv-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/hsvColor/dist - '@tsparticles/plugin-rgb-color': - specifier: workspace:3.9.1 - version: link:../../plugins/colors/rgbColor/dist + "@tsparticles/plugin-hex-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hex/dist + "@tsparticles/plugin-hsl-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hsl/dist + "@tsparticles/plugin-hsv-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/hsv/dist + "@tsparticles/plugin-rgb-color": + specifier: workspace:4.0.0-alpha.0 + version: link:../../plugins/colors/rgb/dist packages: - - '@aashutoshrathi/word-wrap@1.2.6': - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - - '@adobe/css-tools@4.3.3': - resolution: {integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==} - - '@ampproject/remapping@2.3.0': - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - - '@asamuzakjp/css-color@2.8.3': - resolution: {integrity: sha512-GIc76d9UI1hCvOATjZPyHFmE5qhRccp3/zGfMPapK3jBi+yocEzp6BBB0UnfRYP9NP4FANqUZYb0hnfs3TM3hw==} - - '@augment-vir/assert@31.17.1': - resolution: {integrity: sha512-iIb/+JE66sE8CyerlWjNXCh1cWo92f/g5sYCXwKPaosNFawe9vJvOB2sJJspf34xQAkRfWBogAGa2zy89Jbplg==} - engines: {node: '>=22'} - - '@augment-vir/assert@31.2.0': - resolution: {integrity: sha512-XkHv28mNA2bnQV66qzJMv2Wya7Ovd387DZHAjZ8N8J+nUdcMgbZVXK4W1nsmMFw5iS7fCQGmUYukwBcTXh8M4Q==} - engines: {node: '>=22'} - - '@augment-vir/common@23.4.0': - resolution: {integrity: sha512-QIrJ1doD00TNbOzeVrk9KgPTzRlIjayxERnhtbQjK/AFPj5yElcB03GbnGdQZPzws/R+5gfMM5cZiH7QyBP+Kg==} - - '@augment-vir/common@28.2.4': - resolution: {integrity: sha512-5Ib0OX7YlxAuFrG+MAoTsz6RlKMcbdMdoNGcEEKH/ezc/ZKMy/IHZ9Z/ZcCHYopZ4ocGXzVY4KUOiJ8+CXXvTA==} - - '@augment-vir/common@31.17.1': - resolution: {integrity: sha512-MO05g0D7OIh+sHkzfdl4D6jMddzJVSOmKfuvEY9PLF7N1buDIQf/9gayAi/7b/wUXj2SfCtBUvXM+EGErnC1NA==} - engines: {node: '>=22'} - - '@augment-vir/core@31.17.1': - resolution: {integrity: sha512-pN5gSudi1N6G5zLktWf6pAQnbwlBQoOTDwQV63t0WDX96NpA7PJ7vela/U0qc2duTHwJAOq62wEHmUhlnAjc9A==} - engines: {node: '>=22'} - - '@augment-vir/core@31.2.0': - resolution: {integrity: sha512-5ugzaqNGuubzHPjwI5P7S5COm9js8QSz4qUXGKDEsAqvCXr3agwMi/8ZKnVicIBOV2KqBp8vGwLdZD6talcP+w==} - engines: {node: '>=22'} - - '@babel/code-frame@7.27.1': - resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.24.1': - resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.27.2': - resolution: {integrity: sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.28.0': - resolution: {integrity: sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.27.1': - resolution: {integrity: sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.28.0': - resolution: {integrity: sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.22.5': - resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': - resolution: {integrity: sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.24.1': - resolution: {integrity: sha512-1yJa9dX9g//V6fDebXoEfEsxkZHk3Hcbm+zLhyu6qVgYFLvmTALTeV+jNU9e5RnYtioBrGEOdoI2joMSNQ/+aA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.22.15': - resolution: {integrity: sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==} - engines: {node: '>=6.9.0'} + "@aashutoshrathi/word-wrap@1.2.6": + resolution: + { integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== } + engines: { node: ">=0.10.0" } + + "@acemir/cssom@0.9.29": + resolution: + { integrity: sha512-G90x0VW+9nW4dFajtjCoT+NM0scAfH9Mb08IcjgFHYbfiL/lU04dTF9JuVOi3/OH+DJCQdcIseSXkdCB9Ky6JA== } + + "@adobe/css-tools@4.3.3": + resolution: + { integrity: sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== } + + "@asamuzakjp/css-color@4.1.1": + resolution: + { integrity: sha512-B0Hv6G3gWGMn0xKJ0txEi/jM5iFpT3MfDxmhZFb4W047GvytCf1DHQ1D69W3zHI4yWe2aTZAA0JnbMZ7Xc8DuQ== } + + "@asamuzakjp/dom-selector@6.7.6": + resolution: + { integrity: sha512-hBaJER6A9MpdG3WgdlOolHmbOYvSk46y7IQN/1+iqiCuUu6iWdQrs9DGKF8ocqsEqWujWf/V7b7vaDgiUmIvUg== } + + "@asamuzakjp/nwsapi@2.3.9": + resolution: + { integrity: sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q== } + + "@augment-vir/assert@31.54.4": + resolution: + { integrity: sha512-nUZZ2hYAFrBVWxcL0fSEY1jdKrXztwm2hswC5bGkGZz7vfhnYMiag19CApkSWjRB3RlZnlrjElWNjYOoy7gFYw== } + engines: { node: ">=22" } + + "@augment-vir/common@31.54.4": + resolution: + { integrity: sha512-+vRgNyZpZvbwoXe6boJA/etOKcZbPo1JgHzKMIpW/yXqym/6MLB5eVSOMYWympcj7oCE8Nz6ScqXEEKxsMKYzw== } + engines: { node: ">=22" } + + "@augment-vir/core@31.54.4": + resolution: + { integrity: sha512-QN2Cts8MoNYKTWQMPZDFaJavRCTisa054UxVGJAhjfXp3XuGo9uauIt5TAPUuDSy8zwSPVnCjO0wAnvmU8m1Yw== } + engines: { node: ">=22" } + + "@babel/code-frame@7.27.1": + resolution: + { integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg== } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.28.0": + resolution: + { integrity: sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== } + engines: { node: ">=6.9.0" } + + "@babel/compat-data@7.28.5": + resolution: + { integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA== } + engines: { node: ">=6.9.0" } + + "@babel/core@7.28.5": + resolution: + { integrity: sha512-e7jT4DxYvIDLk1ZHmU/m/mB19rex9sv0c2ftBtjSBv+kVM/902eh0fINUzD7UwLLNR+jU585GxUJ8/EBfAM5fw== } + engines: { node: ">=6.9.0" } + + "@babel/generator@7.28.5": + resolution: + { integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ== } + engines: { node: ">=6.9.0" } + + "@babel/helper-annotate-as-pure@7.27.3": + resolution: + { integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg== } + engines: { node: ">=6.9.0" } + + "@babel/helper-compilation-targets@7.27.2": + resolution: + { integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ== } + engines: { node: ">=6.9.0" } + + "@babel/helper-create-class-features-plugin@7.28.3": + resolution: + { integrity: sha512-V9f6ZFIYSLNEbuGA/92uOvYsGCJNsuA8ESZ4ldc09bWk/j8H8TKiPw8Mk1eG6olpnO0ALHJmYfZvF4MEE4gajg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/helper-define-polyfill-provider@0.6.1': - resolution: {integrity: sha512-o7SDgTJuvx5vLKD6SFvkydkSMBvahDKGiNJzG22IZYXhiqoe9efY7zocICBgzHV4IRg5wdgl2nEL/tulKIEIbA==} + "@babel/helper-create-regexp-features-plugin@7.27.1": + resolution: + { integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-environment-visitor@7.22.20': - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0 - '@babel/helper-function-name@7.23.0': - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-globals@7.28.0': - resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-hoist-variables@7.22.5': - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-member-expression-to-functions@7.23.0': - resolution: {integrity: sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.24.3': - resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.27.1': - resolution: {integrity: sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==} - engines: {node: '>=6.9.0'} + "@babel/helper-define-polyfill-provider@0.6.5": + resolution: + { integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg== } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-module-transforms@7.27.3': - resolution: {integrity: sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 + + "@babel/helper-globals@7.28.0": + resolution: + { integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== } + engines: { node: ">=6.9.0" } + + "@babel/helper-member-expression-to-functions@7.27.1": + resolution: + { integrity: sha512-E5chM8eWjTp/aNoVpcbfM7mLxu9XGLWYise2eBKGQomAk/Mb4XoxyqXTZbuTohbsl8EKqdlMhnDI2CCLfcs9wA== } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-imports@7.27.1": + resolution: + { integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w== } + engines: { node: ">=6.9.0" } + + "@babel/helper-module-transforms@7.28.3": + resolution: + { integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.22.5': - resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.24.0': - resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.22.20': - resolution: {integrity: sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==} - engines: {node: '>=6.9.0'} + "@babel/core": ^7.0.0 + + "@babel/helper-optimise-call-expression@7.27.1": + resolution: + { integrity: sha512-URMGH08NzYFhubNSGJrpUEphGKQwMQYBySzat5cAByY1/YgIRkULnIy3tAMeszlL/so2HbeilYloUmSpd7GdVw== } + engines: { node: ">=6.9.0" } + + "@babel/helper-plugin-utils@7.27.1": + resolution: + { integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw== } + engines: { node: ">=6.9.0" } + + "@babel/helper-remap-async-to-generator@7.27.1": + resolution: + { integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/helper-replace-supers@7.24.1': - resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} - engines: {node: '>=6.9.0'} + "@babel/helper-replace-supers@7.27.1": + resolution: + { integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-simple-access@7.22.5': - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': - resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} - engines: {node: '>=6.9.0'} - - '@babel/helper-split-export-declaration@7.22.6': - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.27.1': - resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.22.20': - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.27.1': - resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.23.5': - resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.27.1': - resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.22.20': - resolution: {integrity: sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.28.2': - resolution: {integrity: sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.27.2': - resolution: {integrity: sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==} - engines: {node: '>=6.0.0'} + "@babel/core": ^7.0.0 + + "@babel/helper-skip-transparent-expression-wrappers@7.27.1": + resolution: + { integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg== } + engines: { node: ">=6.9.0" } + + "@babel/helper-string-parser@7.27.1": + resolution: + { integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.27.1": + resolution: + { integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow== } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-identifier@7.28.5": + resolution: + { integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== } + engines: { node: ">=6.9.0" } + + "@babel/helper-validator-option@7.27.1": + resolution: + { integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== } + engines: { node: ">=6.9.0" } + + "@babel/helper-wrap-function@7.28.3": + resolution: + { integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g== } + engines: { node: ">=6.9.0" } + + "@babel/helpers@7.28.4": + resolution: + { integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== } + engines: { node: ">=6.9.0" } + + "@babel/parser@7.28.0": + resolution: + { integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g== } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/parser@7.28.0': - resolution: {integrity: sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==} - engines: {node: '>=6.0.0'} + "@babel/parser@7.28.3": + resolution: + { integrity: sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== } + engines: { node: ">=6.0.0" } hasBin: true - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1': - resolution: {integrity: sha512-y4HqEnkelJIOQGd+3g1bTeKsA5c6qM7eOn7VggGVbBc0y8MLSKHacwcIE2PplNlQSj0PqS9rrXL/nkPVK+kUNg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1': - resolution: {integrity: sha512-Hj791Ii4ci8HqnaKHAlLNs+zaLXb0EzSDhiAWp5VNlyvCNymYfacs64pxTxbH1znW/NcArSmwpmG9IKE/TUVVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1': - resolution: {integrity: sha512-m9m/fXsXLiHfwdgydIFnpk+7jlVbnvlK5B2EKiPdLUb6WX654ZaaEWJUjk8TftRbZpK0XibovlLWX4KIZhV6jw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-async-generators@7.8.4': - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-properties@7.12.13': - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-class-static-block@7.14.5': - resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-export-namespace-from@7.8.3': - resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.24.1': - resolution: {integrity: sha512-IuwnI5XnuF189t91XbxmXeCDz3qs6iDRO7GJ++wcfgeXNs/8FmIlKcpDSXNVyuLQxlwvskmI3Ct73wUODkJBlQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/parser@7.28.5": + resolution: + { integrity: sha512-KKBU1VGYR7ORr3At5HAtUQ+TV3SzRCXmA/8OdDZiLDBIZxVyzXuztPjfLd3BV1PRAQGCMWWSHYhL0F8d5uHBDQ== } + engines: { node: ">=6.0.0" } + hasBin: true - '@babel/plugin-syntax-import-attributes@7.24.1': - resolution: {integrity: sha512-zhQTMH0X2nVLnb04tz+s7AMuasX8U0FnpE+nHTOhSOINjWMnopoZTxtIKsd45n4GQ/HIZLyfIpoul8e2m0DnRA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5": + resolution: + { integrity: sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-syntax-import-meta@7.10.4': - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1": + resolution: + { integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-syntax-json-strings@7.8.3': - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1": + resolution: + { integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4': - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1": + resolution: + { integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.13.0 - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3": + resolution: + { integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-syntax-numeric-separator@7.10.4': - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + resolution: + { integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-object-rest-spread@7.8.3': - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + "@babel/plugin-syntax-import-assertions@7.27.1": + resolution: + { integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-optional-catch-binding@7.8.3': - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + "@babel/plugin-syntax-import-attributes@7.27.1": + resolution: + { integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-optional-chaining@7.8.3': - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + "@babel/plugin-syntax-unicode-sets-regex@7.18.6": + resolution: + { integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-syntax-private-property-in-object@7.14.5': - resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-arrow-functions@7.27.1": + resolution: + { integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-top-level-await@7.14.5': - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-async-generator-functions@7.28.0": + resolution: + { integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-async-to-generator@7.27.1": + resolution: + { integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-arrow-functions@7.24.1': - resolution: {integrity: sha512-ngT/3NkRhsaep9ck9uj2Xhv9+xB1zShY3tM3g6om4xxCELwCDN4g4Aq5dRn48+0hasAql7s2hdBOysCfNpr4fw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-block-scoped-functions@7.27.1": + resolution: + { integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-async-generator-functions@7.24.3': - resolution: {integrity: sha512-Qe26CMYVjpQxJ8zxM1340JFNjZaF+ISWpr1Kt/jGo+ZTUzKkfw/pphEWbRCb+lmSM6k/TOgfYLvmbHkUQ0asIg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-block-scoping@7.28.5": + resolution: + { integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-async-to-generator@7.24.1': - resolution: {integrity: sha512-AawPptitRXp1y0n4ilKcGbRYWfbbzFWz2NqNu7dacYDtFtz0CMjG64b3LQsb3KIgnf4/obcUL78hfaOS7iCUfw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-class-properties@7.27.1": + resolution: + { integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-block-scoped-functions@7.24.1': - resolution: {integrity: sha512-TWWC18OShZutrv9C6mye1xwtam+uNi2bnTOCBUd5sZxyHOiWbU6ztSROofIMrK84uweEZC219POICK/sTYwfgg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-class-static-block@7.28.3": + resolution: + { integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.12.0 - '@babel/plugin-transform-block-scoping@7.24.1': - resolution: {integrity: sha512-h71T2QQvDgM2SmT29UYU6ozjMlAt7s7CSs5Hvy8f8cf/GM/Z4a2zMfN+fjVGaieeCrXR3EdQl6C4gQG+OgmbKw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-classes@7.28.4": + resolution: + { integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.24.1': - resolution: {integrity: sha512-OMLCXi0NqvJfORTaPQBwqLXHhb93wkBKZ4aNwMl6WtehO7ar+cmp+89iPEQPqxAnxsOKTaMcs3POz3rKayJ72g==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-computed-properties@7.27.1": + resolution: + { integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-class-static-block@7.24.1': - resolution: {integrity: sha512-FUHlKCn6J3ERiu8Dv+4eoz7w8+kFLSyeVG4vDAikwADGjUCoHw/JHokyGtr8OR4UjpwPVivyF+h8Q5iv/JmrtA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-destructuring@7.28.5": + resolution: + { integrity: sha512-Kl9Bc6D0zTUcFUvkNuQh4eGXPKKNDOJQXVyyM4ZAQPMveniJdxi8XMJwLo+xSoW3MIq81bD33lcUe9kZpl0MCw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.12.0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-classes@7.24.1': - resolution: {integrity: sha512-ZTIe3W7UejJd3/3R4p7ScyyOoafetUShSf4kCqV0O7F/RiHxVj/wRaRnQlrGwflvcehNA8M42HkAiEDYZu2F1Q==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-dotall-regex@7.27.1": + resolution: + { integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.24.1': - resolution: {integrity: sha512-5pJGVIUfJpOS+pAqBQd+QMaTD2vCL/HcePooON6pDpHgRp4gNRmzyHTPIkXntwKsq3ayUFVfJaIKPw2pOkOcTw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-duplicate-keys@7.27.1": + resolution: + { integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-destructuring@7.24.1': - resolution: {integrity: sha512-ow8jciWqNxR3RYbSNVuF4U2Jx130nwnBnhRw6N6h1bOejNkABmcI5X5oz29K4alWX7vf1C+o6gtKXikzRKkVdw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1": + resolution: + { integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-transform-dotall-regex@7.24.1': - resolution: {integrity: sha512-p7uUxgSoZwZ2lPNMzUkqCts3xlp8n+o05ikjy7gbtFJSt9gdU88jAmtfmOxHM14noQXBxfgzf2yRWECiNVhTCw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-dynamic-import@7.27.1": + resolution: + { integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-duplicate-keys@7.24.1': - resolution: {integrity: sha512-msyzuUnvsjsaSaocV6L7ErfNsa5nDWL1XKNnDePLgmz+WdU4w/J8+AxBMrWfi9m4IxfL5sZQKUPQKDQeeAT6lA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-explicit-resource-management@7.28.0": + resolution: + { integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-dynamic-import@7.24.1': - resolution: {integrity: sha512-av2gdSTyXcJVdI+8aFZsCAtR29xJt0S5tas+Ef8NvBNmD1a+N/3ecMLeMBgfcK+xzsjdLDT6oHt+DFPyeqUbDA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-exponentiation-operator@7.28.5": + resolution: + { integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.24.1': - resolution: {integrity: sha512-U1yX13dVBSwS23DEAqU+Z/PkwE9/m7QQy8Y9/+Tdb8UWYaGNDYwTLi19wqIAiROr8sXVum9A/rtiH5H0boUcTw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-export-namespace-from@7.27.1": + resolution: + { integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-export-namespace-from@7.24.1': - resolution: {integrity: sha512-Ft38m/KFOyzKw2UaJFkWG9QnHPG/Q/2SkOrRk4pNBPg5IPZ+dOxcmkK5IyuBcxiNPyyYowPGUReyBvrvZs7IlQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-for-of@7.27.1": + resolution: + { integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-for-of@7.24.1': - resolution: {integrity: sha512-OxBdcnF04bpdQdR3i4giHZNZQn7cm8RQKcSwA17wAAqEELo1ZOwp5FFgeptWUQXFyT9kwHo10aqqauYkRZPCAg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-function-name@7.27.1": + resolution: + { integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-function-name@7.24.1': - resolution: {integrity: sha512-BXmDZpPlh7jwicKArQASrj8n22/w6iymRnvHYYd2zO30DbE277JO20/7yXJT3QxDPtiQiOxQBbZH4TpivNXIxA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-json-strings@7.27.1": + resolution: + { integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.24.1': - resolution: {integrity: sha512-U7RMFmRvoasscrIFy5xA4gIp8iWnWubnKkKuUGJjsuOH7GfbMkB+XZzeslx2kLdEGdOJDamEmCqOks6e8nv8DQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-literals@7.27.1": + resolution: + { integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-literals@7.24.1': - resolution: {integrity: sha512-zn9pwz8U7nCqOYIiBaOxoQOtYmMODXTJnkxG4AtX8fPmnCRYWBOHD0qcpwS9e2VDSp1zNJYpdnFMIKb8jmwu6g==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-logical-assignment-operators@7.28.5": + resolution: + { integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.24.1': - resolution: {integrity: sha512-OhN6J4Bpz+hIBqItTeWJujDOfNP+unqv/NJgyhlpSqgBTPm37KkMmZV6SYcOj+pnDbdcl1qRGV/ZiIjX9Iy34w==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-member-expression-literals@7.27.1": + resolution: + { integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-member-expression-literals@7.24.1': - resolution: {integrity: sha512-4ojai0KysTWXzHseJKa1XPNXKRbuUrhkOPY4rEGeR+7ChlJVKxFa3H3Bz+7tWaGKgJAXUWKOGmltN+u9B3+CVg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-amd@7.27.1": + resolution: + { integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-amd@7.24.1': - resolution: {integrity: sha512-lAxNHi4HVtjnHd5Rxg3D5t99Xm6H7b04hUS7EHIXcUl2EV4yl1gWdqZrNzXnSrHveL9qMdbODlLF55mvgjAfaQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-commonjs@7.27.1": + resolution: + { integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.24.1': - resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-systemjs@7.28.5": + resolution: + { integrity: sha512-vn5Jma98LCOeBy/KpeQhXcV2WZgaRUtjwQmjoBuLNlOmkg0fB5pdvYVeWRYI69wWKwK2cD1QbMiUQnoujWvrew== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-systemjs@7.24.1': - resolution: {integrity: sha512-mqQ3Zh9vFO1Tpmlt8QPnbwGHzNz3lpNEMxQb1kAemn/erstyqw1r9KeOlOfo3y6xAnFEcOv2tSyrXfmMk+/YZA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-modules-umd@7.27.1": + resolution: + { integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-modules-umd@7.24.1': - resolution: {integrity: sha512-tuA3lpPj+5ITfcCluy6nWonSL7RvaG0AOTeAuvXqEKS34lnLzXpDb0dcP6K8jD0zWZFNDVly90AGFJPnm4fOYg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-named-capturing-groups-regex@7.27.1": + resolution: + { integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5': - resolution: {integrity: sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-new-target@7.27.1": + resolution: + { integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-new-target@7.24.1': - resolution: {integrity: sha512-/rurytBM34hYy0HKZQyA0nHbQgQNFm4Q/BOc9Hflxi2X3twRof7NaE5W46j4kQitm7SvACVRXsa6N/tSZxvPug==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-nullish-coalescing-operator@7.27.1": + resolution: + { integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1': - resolution: {integrity: sha512-iQ+caew8wRrhCikO5DrUYx0mrmdhkaELgFa+7baMcVuhxIkN7oxt06CZ51D65ugIb1UWRQ8oQe+HXAVM6qHFjw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-numeric-separator@7.27.1": + resolution: + { integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.24.1': - resolution: {integrity: sha512-7GAsGlK4cNL2OExJH1DzmDeKnRv/LXq0eLUSvudrehVA5Rgg4bIrqEUW29FbKMBRT0ztSqisv7kjP+XIC4ZMNw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-object-rest-spread@7.28.4": + resolution: + { integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.24.1': - resolution: {integrity: sha512-XjD5f0YqOtebto4HGISLNfiNMTTs6tbkFf2TOqJlYKYmbo+mN9Dnpl4SRoofiziuOWMIyq3sZEUqLo3hLITFEA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-object-super@7.27.1": + resolution: + { integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-object-super@7.24.1': - resolution: {integrity: sha512-oKJqR3TeI5hSLRxudMjFQ9re9fBVUU0GICqM3J1mi8MqlhVr6hC/ZN4ttAyMuQR6EZZIY6h/exe5swqGNNIkWQ==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-optional-catch-binding@7.27.1": + resolution: + { integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.24.1': - resolution: {integrity: sha512-oBTH7oURV4Y+3EUrf6cWn1OHio3qG/PVwO5J03iSJmBg6m2EhKjkAu/xuaXaYwWW9miYtvbWv4LNf0AmR43LUA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-optional-chaining@7.28.5": + resolution: + { integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.24.1': - resolution: {integrity: sha512-n03wmDt+987qXwAgcBlnUUivrZBPZ8z1plL0YvgQalLm+ZE5BMhGm94jhxXtA1wzv1Cu2aaOv1BM9vbVttrzSg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-parameters@7.27.7": + resolution: + { integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-parameters@7.24.1': - resolution: {integrity: sha512-8Jl6V24g+Uw5OGPeWNKrKqXPDw2YDjLc53ojwfMcKwlEoETKU9rU0mHUtcg9JntWI/QYzGAXNWEcVHZ+fR+XXg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-private-methods@7.27.1": + resolution: + { integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.24.1': - resolution: {integrity: sha512-tGvisebwBO5em4PaYNqt4fkw56K2VALsAbAakY0FjTYqJp7gfdrgr7YX76Or8/cpik0W6+tj3rZ0uHU9Oil4tw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-private-property-in-object@7.27.1": + resolution: + { integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.24.1': - resolution: {integrity: sha512-pTHxDVa0BpUbvAgX3Gat+7cSciXqUcY9j2VZKTbSB6+VQGpNgNO9ailxTGHSXlqOnX1Hcx1Enme2+yv7VqP9bg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-property-literals@7.27.1": + resolution: + { integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-property-literals@7.24.1': - resolution: {integrity: sha512-LetvD7CrHmEx0G442gOomRr66d7q8HzzGGr4PMHGr+5YIm6++Yke+jxj246rpvsbyhJwCLxcTn6zW1P1BSenqA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-regenerator@7.28.4": + resolution: + { integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.24.1': - resolution: {integrity: sha512-sJwZBCzIBE4t+5Q4IGLaaun5ExVMRY0lYwos/jNecjMrVCygCdph3IKv0tkP5Fc87e/1+bebAmEAGBfnRD+cnw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-regexp-modifiers@7.27.1": + resolution: + { integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0 - '@babel/plugin-transform-reserved-words@7.24.1': - resolution: {integrity: sha512-JAclqStUfIwKN15HrsQADFgeZt+wexNQ0uLhuqvqAUFoqPMjEcFCYZBhq0LUdz6dZK/mD+rErhW71fbx8RYElg==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-reserved-words@7.27.1": + resolution: + { integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-shorthand-properties@7.24.1': - resolution: {integrity: sha512-LyjVB1nsJ6gTTUKRjRWx9C1s9hE7dLfP/knKdrfeH9UPtAGjYGgxIbFfx7xyLIEWs7Xe1Gnf8EWiUqfjLhInZA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-shorthand-properties@7.27.1": + resolution: + { integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-spread@7.24.1': - resolution: {integrity: sha512-KjmcIM+fxgY+KxPVbjelJC6hrH1CgtPmTvdXAfn3/a9CnWGSTY7nH4zm5+cjmWJybdcPSsD0++QssDsjcpe47g==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-spread@7.27.1": + resolution: + { integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-sticky-regex@7.24.1': - resolution: {integrity: sha512-9v0f1bRXgPVcPrngOQvLXeGNNVLc8UjMVfebo9ka0WF3/7+aVUHmaJVT3sa0XCzEFioPfPHZiOcYG9qOsH63cw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-sticky-regex@7.27.1": + resolution: + { integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-template-literals@7.24.1': - resolution: {integrity: sha512-WRkhROsNzriarqECASCNu/nojeXCDTE/F2HmRgOzi7NGvyfYGq1NEjKBK3ckLfRgGc6/lPAqP0vDOSw3YtG34g==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-template-literals@7.27.1": + resolution: + { integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-typeof-symbol@7.24.1': - resolution: {integrity: sha512-CBfU4l/A+KruSUoW+vTQthwcAdwuqbpRNB8HQKlZABwHRhsdHZ9fezp4Sn18PeAlYxTNiLMlx4xUBV3AWfg1BA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-typeof-symbol@7.27.1": + resolution: + { integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-escapes@7.24.1': - resolution: {integrity: sha512-RlkVIcWT4TLI96zM660S877E7beKlQw7Ig+wqkKBiWfj0zH5Q4h50q6er4wzZKRNSYpfo6ILJ+hrJAGSX2qcNw==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-escapes@7.27.1": + resolution: + { integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.24.1': - resolution: {integrity: sha512-Ss4VvlfYV5huWApFsF8/Sq0oXnGO+jB+rijFEFugTd3cwSObUSnUi88djgR5528Csl0uKlrI331kRqe56Ov2Ng==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-property-regex@7.27.1": + resolution: + { integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-regex@7.24.1': - resolution: {integrity: sha512-2A/94wgZgxfTsiLaQ2E36XAOdcZmGAaEEgVmxQWwZXWkGhvoHbaqXcKnU8zny4ycpu3vNqg0L/PcCiYtHtA13g==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-regex@7.27.1": + resolution: + { integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.24.1': - resolution: {integrity: sha512-fqj4WuzzS+ukpgerpAoOnMfQXwUHFxXUZUE84oL2Kao2N8uSlvcpnAidKASgsNgzZHBsHWvcm8s9FPWUhAb8fA==} - engines: {node: '>=6.9.0'} + "@babel/plugin-transform-unicode-sets-regex@7.27.1": + resolution: + { integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0 + "@babel/core": ^7.0.0 - '@babel/preset-env@7.24.3': - resolution: {integrity: sha512-fSk430k5c2ff8536JcPvPWK4tZDwehWLGlBp0wrsBUjZVdeQV6lePbwKWZaZfK2vnh/1kQX1PzAJWsnBmVgGJA==} - engines: {node: '>=6.9.0'} + "@babel/preset-env@7.28.5": + resolution: + { integrity: sha512-S36mOoi1Sb6Fz98fBfE+UZSpYw5mJm0NUHtIKrOuNcqeFauy1J6dIvXm2KRVKobOSaGq4t/hBXdN4HGU3wL9Wg== } + engines: { node: ">=6.9.0" } peerDependencies: - '@babel/core': ^7.0.0-0 + "@babel/core": ^7.0.0-0 - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + "@babel/preset-modules@0.1.6-no-external-plugins": + resolution: + { integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== } peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/regjsgen@0.8.0': - resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==} - - '@babel/runtime@7.21.5': - resolution: {integrity: sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.27.1': - resolution: {integrity: sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.28.0': - resolution: {integrity: sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.27.1': - resolution: {integrity: sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} - engines: {node: '>=6.9.0'} - - '@bcoe/v8-coverage@1.0.2': - resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} - engines: {node: '>=18'} - - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - - '@colors/colors@1.6.0': - resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==} - engines: {node: '>=0.1.90'} - - '@commitlint/cli@19.8.1': - resolution: {integrity: sha512-LXUdNIkspyxrlV6VDHWBmCZRtkEVRpBKxi2Gtw3J54cGWhLCTouVD/Q6ZSaSvd2YaDObWK8mDjrz3TIKtaQMAA==} - engines: {node: '>=v18'} + "@babel/core": ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + "@babel/template@7.27.2": + resolution: + { integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw== } + engines: { node: ">=6.9.0" } + + "@babel/traverse@7.28.5": + resolution: + { integrity: sha512-TCCj4t55U90khlYkVV/0TfkJkAkUg3jZFA3Neb7unZT8CPok7iiRfaX0F+WnqWqt7OxhOn0uBKXCw4lbL8W0aQ== } + engines: { node: ">=6.9.0" } + + "@babel/types@7.28.2": + resolution: + { integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== } + engines: { node: ">=6.9.0" } + + "@babel/types@7.28.5": + resolution: + { integrity: sha512-qQ5m48eI/MFLQ5PxQj4PFaprjyCTLI37ElWMmNs0K8Lk3dVeOdNpB3ks8jc7yM5CDmVC73eMVk/trk3fgmrUpA== } + engines: { node: ">=6.9.0" } + + "@bcoe/v8-coverage@1.0.2": + resolution: + { integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA== } + engines: { node: ">=18" } + + "@colors/colors@1.6.0": + resolution: + { integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== } + engines: { node: ">=0.1.90" } + + "@commitlint/cli@20.2.0": + resolution: + { integrity: sha512-l37HkrPZ2DZy26rKiTUvdq/LZtlMcxz+PeLv9dzK9NzoFGuJdOQyYU7IEkEQj0pO++uYue89wzOpZ0hcTtoqUA== } + engines: { node: ">=v18" } hasBin: true - '@commitlint/config-conventional@19.8.1': - resolution: {integrity: sha512-/AZHJL6F6B/G959CsMAzrPKKZjeEiAVifRyEwXxcT6qtqbPwGw+iQxmNS+Bu+i09OCtdNRW6pNpBvgPrtMr9EQ==} - engines: {node: '>=v18'} - - '@commitlint/config-validator@19.8.1': - resolution: {integrity: sha512-0jvJ4u+eqGPBIzzSdqKNX1rvdbSU1lPNYlfQQRIFnBgLy26BtC0cFnr7c/AyuzExMxWsMOte6MkTi9I3SQ3iGQ==} - engines: {node: '>=v18'} - - '@commitlint/ensure@19.8.1': - resolution: {integrity: sha512-mXDnlJdvDzSObafjYrOSvZBwkD01cqB4gbnnFuVyNpGUM5ijwU/r/6uqUmBXAAOKRfyEjpkGVZxaDsCVnHAgyw==} - engines: {node: '>=v18'} - - '@commitlint/execute-rule@19.8.1': - resolution: {integrity: sha512-YfJyIqIKWI64Mgvn/sE7FXvVMQER/Cd+s3hZke6cI1xgNT/f6ZAz5heND0QtffH+KbcqAwXDEE1/5niYayYaQA==} - engines: {node: '>=v18'} - - '@commitlint/format@19.8.1': - resolution: {integrity: sha512-kSJj34Rp10ItP+Eh9oCItiuN/HwGQMXBnIRk69jdOwEW9llW9FlyqcWYbHPSGofmjsqeoxa38UaEA5tsbm2JWw==} - engines: {node: '>=v18'} - - '@commitlint/is-ignored@19.8.1': - resolution: {integrity: sha512-AceOhEhekBUQ5dzrVhDDsbMaY5LqtN8s1mqSnT2Kz1ERvVZkNihrs3Sfk1Je/rxRNbXYFzKZSHaPsEJJDJV8dg==} - engines: {node: '>=v18'} - - '@commitlint/lint@19.8.1': - resolution: {integrity: sha512-52PFbsl+1EvMuokZXLRlOsdcLHf10isTPlWwoY1FQIidTsTvjKXVXYb7AvtpWkDzRO2ZsqIgPK7bI98x8LRUEw==} - engines: {node: '>=v18'} - - '@commitlint/load@19.8.1': - resolution: {integrity: sha512-9V99EKG3u7z+FEoe4ikgq7YGRCSukAcvmKQuTtUyiYPnOd9a2/H9Ak1J9nJA1HChRQp9OA/sIKPugGS+FK/k1A==} - engines: {node: '>=v18'} - - '@commitlint/message@19.8.1': - resolution: {integrity: sha512-+PMLQvjRXiU+Ae0Wc+p99EoGEutzSXFVwQfa3jRNUZLNW5odZAyseb92OSBTKCu+9gGZiJASt76Cj3dLTtcTdg==} - engines: {node: '>=v18'} - - '@commitlint/parse@19.8.1': - resolution: {integrity: sha512-mmAHYcMBmAgJDKWdkjIGq50X4yB0pSGpxyOODwYmoexxxiUCy5JJT99t1+PEMK7KtsCtzuWYIAXYAiKR+k+/Jw==} - engines: {node: '>=v18'} - - '@commitlint/read@19.8.1': - resolution: {integrity: sha512-03Jbjb1MqluaVXKHKRuGhcKWtSgh3Jizqy2lJCRbRrnWpcM06MYm8th59Xcns8EqBYvo0Xqb+2DoZFlga97uXQ==} - engines: {node: '>=v18'} - - '@commitlint/resolve-extends@19.8.1': - resolution: {integrity: sha512-GM0mAhFk49I+T/5UCYns5ayGStkTt4XFFrjjf0L4S26xoMTSkdCf9ZRO8en1kuopC4isDFuEm7ZOm/WRVeElVg==} - engines: {node: '>=v18'} - - '@commitlint/rules@19.8.1': - resolution: {integrity: sha512-Hnlhd9DyvGiGwjfjfToMi1dsnw1EXKGJNLTcsuGORHz6SS9swRgkBsou33MQ2n51/boIDrbsg4tIBbRpEWK2kw==} - engines: {node: '>=v18'} - - '@commitlint/to-lines@19.8.1': - resolution: {integrity: sha512-98Mm5inzbWTKuZQr2aW4SReY6WUukdWXuZhrqf1QdKPZBCCsXuG87c+iP0bwtD6DBnmVVQjgp4whoHRVixyPBg==} - engines: {node: '>=v18'} - - '@commitlint/top-level@19.8.1': - resolution: {integrity: sha512-Ph8IN1IOHPSDhURCSXBz44+CIu+60duFwRsg6HqaISFHQHbmBtxVw4ZrFNIYUzEP7WwrNPxa2/5qJ//NK1FGcw==} - engines: {node: '>=v18'} - - '@commitlint/types@19.8.1': - resolution: {integrity: sha512-/yCrWGCoA1SVKOks25EGadP9Pnj0oAIHGpl2wH2M2Y46dPM2ueb8wyCVOD7O3WCTkaJ0IkKvzhl1JY7+uCT2Dw==} - engines: {node: '>=v18'} - - '@cspotcode/source-map-support@0.8.1': - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - - '@csstools/color-helpers@5.0.1': - resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==} - engines: {node: '>=18'} - - '@csstools/css-calc@2.1.1': - resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 - - '@csstools/css-color-parser@3.0.7': - resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==} - engines: {node: '>=18'} + "@commitlint/config-conventional@20.2.0": + resolution: + { integrity: sha512-MsRac+yNIbTB4Q/psstKK4/ciVzACHicSwz+04Sxve+4DW+PiJeTjU0JnS4m/oOnulrXYN+yBPlKaBSGemRfgQ== } + engines: { node: ">=v18" } + + "@commitlint/config-validator@20.2.0": + resolution: + { integrity: sha512-SQCBGsL9MFk8utWNSthdxd9iOD1pIVZSHxGBwYIGfd67RTjxqzFOSAYeQVXOu3IxRC3YrTOH37ThnTLjUlyF2w== } + engines: { node: ">=v18" } + + "@commitlint/ensure@20.2.0": + resolution: + { integrity: sha512-+8TgIGv89rOWyt3eC6lcR1H7hqChAKkpawytlq9P1i/HYugFRVqgoKJ8dhd89fMnlrQTLjA5E97/4sF09QwdoA== } + engines: { node: ">=v18" } + + "@commitlint/execute-rule@20.0.0": + resolution: + { integrity: sha512-xyCoOShoPuPL44gVa+5EdZsBVao/pNzpQhkzq3RdtlFdKZtjWcLlUFQHSWBuhk5utKYykeJPSz2i8ABHQA+ZZw== } + engines: { node: ">=v18" } + + "@commitlint/format@20.2.0": + resolution: + { integrity: sha512-PhNoLNhxpfIBlW/i90uZ3yG3hwSSYx7n4d9Yc+2FAorAHS0D9btYRK4ZZXX+Gm3W5tDtu911ow/eWRfcRVgNWg== } + engines: { node: ">=v18" } + + "@commitlint/is-ignored@20.2.0": + resolution: + { integrity: sha512-Lz0OGeZCo/QHUDLx5LmZc0EocwanneYJUM8z0bfWexArk62HKMLfLIodwXuKTO5y0s6ddXaTexrYHs7v96EOmw== } + engines: { node: ">=v18" } + + "@commitlint/lint@20.2.0": + resolution: + { integrity: sha512-cQEEB+jlmyQbyiji/kmh8pUJSDeUmPiWq23kFV0EtW3eM+uAaMLMuoTMajbrtWYWQpPzOMDjYltQ8jxHeHgITg== } + engines: { node: ">=v18" } + + "@commitlint/load@20.2.0": + resolution: + { integrity: sha512-iAK2GaBM8sPFTSwtagI67HrLKHIUxQc2BgpgNc/UMNme6LfmtHpIxQoN1TbP+X1iz58jq32HL1GbrFTCzcMi6g== } + engines: { node: ">=v18" } + + "@commitlint/message@20.0.0": + resolution: + { integrity: sha512-gLX4YmKnZqSwkmSB9OckQUrI5VyXEYiv3J5JKZRxIp8jOQsWjZgHSG/OgEfMQBK9ibdclEdAyIPYggwXoFGXjQ== } + engines: { node: ">=v18" } + + "@commitlint/parse@20.2.0": + resolution: + { integrity: sha512-LXStagGU1ivh07X7sM+hnEr4BvzFYn1iBJ6DRg2QsIN8lBfSzyvkUcVCDwok9Ia4PWiEgei5HQjju6xfJ1YaSQ== } + engines: { node: ">=v18" } + + "@commitlint/read@20.2.0": + resolution: + { integrity: sha512-+SjF9mxm5JCbe+8grOpXCXMMRzAnE0WWijhhtasdrpJoAFJYd5UgRTj/oCq5W3HJTwbvTOsijEJ0SUGImECD7Q== } + engines: { node: ">=v18" } + + "@commitlint/resolve-extends@20.2.0": + resolution: + { integrity: sha512-KVoLDi9BEuqeq+G0wRABn4azLRiCC22/YHR2aCquwx6bzCHAIN8hMt3Nuf1VFxq/c8ai6s8qBxE8+ZD4HeFTlQ== } + engines: { node: ">=v18" } + + "@commitlint/rules@20.2.0": + resolution: + { integrity: sha512-27rHGpeAjnYl/A+qUUiYDa7Yn1WIjof/dFJjYW4gA1Ug+LUGa1P0AexzGZ5NBxTbAlmDgaxSZkLLxtLVqtg8PQ== } + engines: { node: ">=v18" } + + "@commitlint/to-lines@20.0.0": + resolution: + { integrity: sha512-2l9gmwiCRqZNWgV+pX1X7z4yP0b3ex/86UmUFgoRt672Ez6cAM2lOQeHFRUTuE6sPpi8XBCGnd8Kh3bMoyHwJw== } + engines: { node: ">=v18" } + + "@commitlint/top-level@20.0.0": + resolution: + { integrity: sha512-drXaPSP2EcopukrUXvUXmsQMu3Ey/FuJDc/5oiW4heoCfoE5BdLQyuc7veGeE3aoQaTVqZnh4D5WTWe2vefYKg== } + engines: { node: ">=v18" } + + "@commitlint/types@20.2.0": + resolution: + { integrity: sha512-KTy0OqRDLR5y/zZMnizyx09z/rPlPC/zKhYgH8o/q6PuAjoQAKlRfY4zzv0M64yybQ//6//4H1n14pxaLZfUnA== } + engines: { node: ">=v18" } + + "@cspotcode/source-map-support@0.8.1": + resolution: + { integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== } + engines: { node: ">=12" } + + "@csstools/color-helpers@5.1.0": + resolution: + { integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA== } + engines: { node: ">=18" } + + "@csstools/css-calc@2.1.4": + resolution: + { integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ== } + engines: { node: ">=18" } peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.4 - '@csstools/css-tokenizer': ^3.0.3 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 - '@csstools/css-parser-algorithms@3.0.4': - resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==} - engines: {node: '>=18'} + "@csstools/css-color-parser@3.1.0": + resolution: + { integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA== } + engines: { node: ">=18" } peerDependencies: - '@csstools/css-tokenizer': ^3.0.3 + "@csstools/css-parser-algorithms": ^3.0.5 + "@csstools/css-tokenizer": ^3.0.4 - '@csstools/css-tokenizer@3.0.3': - resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} - engines: {node: '>=18'} - - '@dabh/diagnostics@2.0.3': - resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} - - '@datalust/winston-seq@2.0.0': - resolution: {integrity: sha512-+2jseaj02d0uKWEfrYDVoAqJ89u33jd/KYItE/kbAsH21HlULm9ZN//S0C7+MUKsGStM0JnclByvvdyk5YmxjA==} + "@csstools/css-parser-algorithms@3.0.5": + resolution: + { integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ== } + engines: { node: ">=18" } peerDependencies: - winston: ^3.0.0 - - '@date-vir/duration@7.1.1': - resolution: {integrity: sha512-eiSgx5uQbSlBWFyPEp8ED5AwG4c2htNVl4KVSX01iAwiBN1669LLVvKdaftPhZNCbLV6oKrAW9Vy0d+GeZiodA==} - engines: {node: '>=22'} - - '@date-vir/duration@7.3.1': - resolution: {integrity: sha512-MRXg2dz021QdOYx4TRcDFJ1PhiNIr8HsZ73uFot5+yMbE0oMdqEDpetzm3PAYvSrYrC3L/qxr8+cnh6FUr+cRw==} - engines: {node: '>=22'} - - '@dependents/detective-less@3.0.2': - resolution: {integrity: sha512-1YUvQ+e0eeTWAHoN8Uz2x2U37jZs6IGutiIE5LXId7cxfUGhtZjzxE06FdUiuiRrW+UE0vNCdSNPH2lY4dQCOQ==} - engines: {node: '>=12'} - - '@dependents/detective-less@5.0.0': - resolution: {integrity: sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ==} - engines: {node: '>=18'} - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@discoveryjs/json-ext@0.6.3': - resolution: {integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ==} - engines: {node: '>=14.17.0'} + "@csstools/css-tokenizer": ^3.0.4 - '@electron/get@2.0.2': - resolution: {integrity: sha512-eFZVFoRXb3GFGd7Ak7W4+6jBl9wBtiZ4AaYOse97ej6mKj5tkyO0dUnUChs1IhJZtx1BENo4/p4WUTXpi6vT+g==} - engines: {node: '>=12'} + "@csstools/css-syntax-patches-for-csstree@1.0.21": + resolution: + { integrity: sha512-plP8N8zKfEZ26figX4Nvajx8DuzfuRpLTqglQ5d0chfnt35Qt3X+m6ASZ+rG0D0kxe/upDVNwSIVJP5n4FuNfw== } + engines: { node: ">=18" } - '@emnapi/core@1.2.0': - resolution: {integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w==} + "@csstools/css-tokenizer@3.0.4": + resolution: + { integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw== } + engines: { node: ">=18" } - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + "@dabh/diagnostics@2.0.8": + resolution: + { integrity: sha512-R4MSXTVnuMzGD7bzHdW2ZhhdPC/igELENcq5IjEverBvq5hn1SXCWcsi6eSsdWP0/Ur+SItRRjAktmdoX/8R/Q== } - '@emnapi/wasi-threads@1.0.1': - resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} - - '@epic-web/invariant@1.0.0': - resolution: {integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA==} - - '@es-joy/jsdoccomment@0.43.1': - resolution: {integrity: sha512-I238eDtOolvCuvtxrnqtlBaw0BwdQuYqK7eA6XIonicMdOOOb75mqdIzkGDUbS04+1Di007rgm9snFRNeVrOog==} - engines: {node: '>=16'} - - '@es-joy/jsdoccomment@0.49.0': - resolution: {integrity: sha512-xjZTSFgECpb9Ohuk5yMX5RhUEbfeQcuOp8IF60e+wyzWEF0M5xeSgqsfLtvPEX8BIyOX9saZqzuGPmZ8oWc+5Q==} - engines: {node: '>=16'} - - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} - engines: {node: '>=18'} + "@datalust/winston-seq@3.0.1": + resolution: + { integrity: sha512-jWJd5PKcj/nM5f1T65KJgKaxPJRADWe+GEWtj1yEji1H0ub4RWhBEDLYzIFdwUy365lxtc5njsakenp4Evmv+g== } + peerDependencies: + winston: ^3.17.0 + + "@date-vir/duration@8.1.0": + resolution: + { integrity: sha512-PwvII5Lo3dzZKpTIYHvPnrKQg6UlOY6V/z/ahPiSGt1HeAMlC96PPfuPZ9ZmzcrKQuAZgO9NzX67sXWRI3T62Q== } + engines: { node: ">=22" } + + "@dependents/detective-less@5.0.0": + resolution: + { integrity: sha512-D/9dozteKcutI5OdxJd8rU+fL6XgaaRg60sPPJWkT33OCiRfkCu5wO5B/yXTaaL2e6EB0lcCBGe5E0XscZCvvQ== } + engines: { node: ">=18" } + + "@discoveryjs/json-ext@0.5.7": + resolution: + { integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== } + engines: { node: ">=10.0.0" } + + "@discoveryjs/json-ext@0.6.3": + resolution: + { integrity: sha512-4B4OijXeVNOPZlYA2oEwWOTkzyltLao+xbotHQeqN++Rv27Y6s818+n2Qkp8q+Fxhn0t/5lA5X1Mxktud8eayQ== } + engines: { node: ">=14.17.0" } + + "@electron/get@2.0.3": + resolution: + { integrity: sha512-Qkzpg2s9GnVV2I2BjRksUi43U5e6+zaQMcjoJy0C+C5oxaKl+fmckGDQFtRpZpZV0NQekuZZ+tGz7EA9TVnQtQ== } + engines: { node: ">=12" } + + "@emnapi/core@1.2.0": + resolution: + { integrity: sha512-E7Vgw78I93we4ZWdYCb4DGAwRROGkMIXk7/y87UmANR+J6qsWusmC3gLt0H+O0KOt5e6O38U8oJamgbudrES/w== } + + "@emnapi/runtime@1.2.0": + resolution: + { integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ== } + + "@emnapi/wasi-threads@1.0.1": + resolution: + { integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw== } + + "@epic-web/invariant@1.0.0": + resolution: + { integrity: sha512-lrTPqgvfFQtR/eY/qkIzp98OGdNJu0m5ji3q/nJI8v3SXkRKEnWiOxMmbvcSoAIzv/cGiuvRy57k4suKQSAdwA== } + + "@es-joy/jsdoccomment@0.76.0": + resolution: + { integrity: sha512-g+RihtzFgGTx2WYCuTHbdOXJeAlGnROws0TeALx9ow/ZmOROOZkVg5wp/B44n0WJgI4SQFP1eWM2iRPlU2Y14w== } + engines: { node: ">=20.11.0" } + + "@es-joy/resolve.exports@1.2.0": + resolution: + { integrity: sha512-Q9hjxWI5xBM+qW2enxfe8wDKdFWMfd0Z29k5ZJnuBqD/CasY5Zryj09aCA6owbGATWz+39p5uIdaHXpopOcG8g== } + engines: { node: ">=10" } + + "@esbuild/aix-ppc64@0.25.9": + resolution: + { integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA== } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.9': - resolution: {integrity: sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==} - engines: {node: '>=18'} + "@esbuild/aix-ppc64@0.27.2": + resolution: + { integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw== } + engines: { node: ">=18" } cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.25.9": + resolution: + { integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg== } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.9': - resolution: {integrity: sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==} - engines: {node: '>=18'} + "@esbuild/android-arm64@0.27.2": + resolution: + { integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA== } + engines: { node: ">=18" } cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.25.9": + resolution: + { integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ== } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.9': - resolution: {integrity: sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==} - engines: {node: '>=18'} + "@esbuild/android-arm@0.27.2": + resolution: + { integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA== } + engines: { node: ">=18" } cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.25.9": + resolution: + { integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw== } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.9': - resolution: {integrity: sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==} - engines: {node: '>=18'} + "@esbuild/android-x64@0.27.2": + resolution: + { integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A== } + engines: { node: ">=18" } cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.25.9": + resolution: + { integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg== } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.9': - resolution: {integrity: sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==} - engines: {node: '>=18'} + "@esbuild/darwin-arm64@0.27.2": + resolution: + { integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg== } + engines: { node: ">=18" } cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.25.9": + resolution: + { integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ== } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.9': - resolution: {integrity: sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==} - engines: {node: '>=18'} + "@esbuild/darwin-x64@0.27.2": + resolution: + { integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA== } + engines: { node: ">=18" } cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.25.9": + resolution: + { integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q== } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.9': - resolution: {integrity: sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==} - engines: {node: '>=18'} + "@esbuild/freebsd-arm64@0.27.2": + resolution: + { integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g== } + engines: { node: ">=18" } cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.25.9": + resolution: + { integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg== } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.9': - resolution: {integrity: sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==} - engines: {node: '>=18'} + "@esbuild/freebsd-x64@0.27.2": + resolution: + { integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA== } + engines: { node: ">=18" } cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.25.9": + resolution: + { integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw== } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.9': - resolution: {integrity: sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==} - engines: {node: '>=18'} + "@esbuild/linux-arm64@0.27.2": + resolution: + { integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw== } + engines: { node: ">=18" } cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.25.9": + resolution: + { integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw== } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.9': - resolution: {integrity: sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==} - engines: {node: '>=18'} + "@esbuild/linux-arm@0.27.2": + resolution: + { integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw== } + engines: { node: ">=18" } cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.25.9": + resolution: + { integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A== } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.9': - resolution: {integrity: sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==} - engines: {node: '>=18'} + "@esbuild/linux-ia32@0.27.2": + resolution: + { integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w== } + engines: { node: ">=18" } cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.25.9": + resolution: + { integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ== } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.9': - resolution: {integrity: sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==} - engines: {node: '>=18'} + "@esbuild/linux-loong64@0.27.2": + resolution: + { integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg== } + engines: { node: ">=18" } cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.25.9": + resolution: + { integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA== } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.9': - resolution: {integrity: sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==} - engines: {node: '>=18'} + "@esbuild/linux-mips64el@0.27.2": + resolution: + { integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw== } + engines: { node: ">=18" } cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.25.9": + resolution: + { integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w== } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.9': - resolution: {integrity: sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==} - engines: {node: '>=18'} + "@esbuild/linux-ppc64@0.27.2": + resolution: + { integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ== } + engines: { node: ">=18" } cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.25.9": + resolution: + { integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg== } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.9': - resolution: {integrity: sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==} - engines: {node: '>=18'} + "@esbuild/linux-riscv64@0.27.2": + resolution: + { integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA== } + engines: { node: ">=18" } cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.25.9": + resolution: + { integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA== } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.9': - resolution: {integrity: sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==} - engines: {node: '>=18'} + "@esbuild/linux-s390x@0.27.2": + resolution: + { integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w== } + engines: { node: ">=18" } cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.25.9": + resolution: + { integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg== } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.9': - resolution: {integrity: sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==} - engines: {node: '>=18'} + "@esbuild/linux-x64@0.27.2": + resolution: + { integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA== } + engines: { node: ">=18" } cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.25.9": + resolution: + { integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q== } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.9': - resolution: {integrity: sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==} - engines: {node: '>=18'} + "@esbuild/netbsd-arm64@0.27.2": + resolution: + { integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw== } + engines: { node: ">=18" } cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.25.9": + resolution: + { integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g== } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.9': - resolution: {integrity: sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==} - engines: {node: '>=18'} + "@esbuild/netbsd-x64@0.27.2": + resolution: + { integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA== } + engines: { node: ">=18" } cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.25.9": + resolution: + { integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ== } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.9': - resolution: {integrity: sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==} - engines: {node: '>=18'} + "@esbuild/openbsd-arm64@0.27.2": + resolution: + { integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA== } + engines: { node: ">=18" } cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.25.9": + resolution: + { integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA== } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.9': - resolution: {integrity: sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==} - engines: {node: '>=18'} + "@esbuild/openbsd-x64@0.27.2": + resolution: + { integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg== } + engines: { node: ">=18" } cpu: [x64] os: [openbsd] - '@esbuild/openharmony-arm64@0.25.9': - resolution: {integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==} - engines: {node: '>=18'} + "@esbuild/openharmony-arm64@0.25.9": + resolution: + { integrity: sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg== } + engines: { node: ">=18" } + cpu: [arm64] + os: [openharmony] + + "@esbuild/openharmony-arm64@0.27.2": + resolution: + { integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag== } + engines: { node: ">=18" } cpu: [arm64] os: [openharmony] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.25.9": + resolution: + { integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw== } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.9': - resolution: {integrity: sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==} - engines: {node: '>=18'} + "@esbuild/sunos-x64@0.27.2": + resolution: + { integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg== } + engines: { node: ">=18" } cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.25.9": + resolution: + { integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ== } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.9': - resolution: {integrity: sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==} - engines: {node: '>=18'} + "@esbuild/win32-arm64@0.27.2": + resolution: + { integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg== } + engines: { node: ">=18" } cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.25.9": + resolution: + { integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww== } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.9': - resolution: {integrity: sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==} - engines: {node: '>=18'} + "@esbuild/win32-ia32@0.27.2": + resolution: + { integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ== } + engines: { node: ">=18" } cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.25.9": + resolution: + { integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ== } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.9': - resolution: {integrity: sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==} - engines: {node: '>=18'} + "@esbuild/win32-x64@0.27.2": + resolution: + { integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ== } + engines: { node: ">=18" } cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + "@eslint-community/eslint-utils@4.7.0": + resolution: + { integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.10.0': - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@fortawesome/fontawesome-free@6.4.2': - resolution: {integrity: sha512-m5cPn3e2+FDCOgi1mz0RexTUvvQibBebOUlUlW0+YrMjDTPkiJ6VTKukA1GRsvRw+12KyJndNjj0O4AgTxm2Pg==} - engines: {node: '>=6'} - - '@gerrit0/mini-shiki@3.9.1': - resolution: {integrity: sha512-quvtbDhNf528BkMHQQd8xGJMpmA5taDZuex/JDF8ETEjS2iypXzr1hnEUVh+lTUyffFJ0JCxysUsiuUoEGIz/Q==} - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@hutson/parse-repository-url@3.0.2': - resolution: {integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q==} - engines: {node: '>=6.9.0'} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@isaacs/string-locale-compare@1.1.0': - resolution: {integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ==} - - '@istanbuljs/schema@0.1.3': - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.12': - resolution: {integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} + "@eslint-community/eslint-utils@4.9.0": + resolution: + { integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + "@eslint-community/regexpp@4.12.1": + resolution: + { integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ== } + engines: { node: ^12.0.0 || ^14.0.0 || >=16.0.0 } + + "@eslint/config-array@0.21.1": + resolution: + { integrity: sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/config-helpers@0.4.2": + resolution: + { integrity: sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/core@0.17.0": + resolution: + { integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/eslintrc@3.3.1": + resolution: + { integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/js@9.39.2": + resolution: + { integrity: sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/object-schema@2.1.7": + resolution: + { integrity: sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@eslint/plugin-kit@0.4.1": + resolution: + { integrity: sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@exodus/bytes@1.6.0": + resolution: + { integrity: sha512-y32mI9627q5LR/L8fLc4YyDRJQOi+jK0D9okzLilAdiU3F9we3zC7Y7CFrR/8vAvUyv7FgBAYcNHtvbmhKCFcw== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + peerDependencies: + "@exodus/crypto": ^1.0.0-rc.4 + peerDependenciesMeta: + "@exodus/crypto": + optional: true - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + "@fortawesome/fontawesome-free@7.1.0": + resolution: + { integrity: sha512-+WxNld5ZCJHvPQCr/GnzCTVREyStrAJjisUPtUxG5ngDA8TMlPnKp6dddlTpai4+1GNmltAeuk1hJEkBohwZYA== } + engines: { node: ">=6" } + + "@gerrit0/mini-shiki@3.20.0": + resolution: + { integrity: sha512-Wa57i+bMpK6PGJZ1f2myxo3iO+K/kZikcyvH8NIqNNZhQUbDav7V9LQmWOXhf946mz5c1NZ19WMsGYiDKTryzQ== } + + "@humanfs/core@0.19.1": + resolution: + { integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== } + engines: { node: ">=18.18.0" } + + "@humanfs/node@0.16.6": + resolution: + { integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw== } + engines: { node: ">=18.18.0" } + + "@humanwhocodes/module-importer@1.0.1": + resolution: + { integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== } + engines: { node: ">=12.22" } + + "@humanwhocodes/retry@0.3.1": + resolution: + { integrity: sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== } + engines: { node: ">=18.18" } + + "@humanwhocodes/retry@0.4.3": + resolution: + { integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== } + engines: { node: ">=18.18" } + + "@hutson/parse-repository-url@3.0.2": + resolution: + { integrity: sha512-H9XAx3hc0BQHY6l+IFSWHDySypcXsvsuLhgYLUGywmJ5pswRVQJUHpOsobnLYp2ZUaUlKiKDrgWWhosOwAEM8Q== } + engines: { node: ">=6.9.0" } + + "@inquirer/ansi@1.0.2": + resolution: + { integrity: sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ== } + engines: { node: ">=18" } + + "@inquirer/checkbox@4.3.2": + resolution: + { integrity: sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + "@inquirer/confirm@5.1.21": + resolution: + { integrity: sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + "@inquirer/core@10.3.2": + resolution: + { integrity: sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@jridgewell/trace-mapping@0.3.29': - resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + "@inquirer/editor@4.2.23": + resolution: + { integrity: sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@jridgewell/trace-mapping@0.3.9': - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + "@inquirer/expand@4.0.23": + resolution: + { integrity: sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@lerna/create@8.2.3': - resolution: {integrity: sha512-f+68+iojcQ0tZRMfCgQyJdsdz+YPu3/d+0Zo1RJz92bgBxTCiEU+dHACVq1n3sEjm/YWPnFGdag8U5EYYmP3WA==} - engines: {node: '>=18.0.0'} + "@inquirer/external-editor@1.0.3": + resolution: + { integrity: sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@microsoft/tsdoc-config@0.16.2': - resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + "@inquirer/figures@1.0.15": + resolution: + { integrity: sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g== } + engines: { node: ">=18" } - '@microsoft/tsdoc-config@0.17.1': - resolution: {integrity: sha512-UtjIFe0C6oYgTnad4q1QP4qXwLhe6tIpNTRStJ2RZEPIkqQPREAwE5spzVxsdn9UaEMUqhh0AqSx3X4nWAKXWw==} + "@inquirer/input@4.3.1": + resolution: + { integrity: sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@microsoft/tsdoc@0.14.2': - resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + "@inquirer/number@3.0.23": + resolution: + { integrity: sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@microsoft/tsdoc@0.15.1': - resolution: {integrity: sha512-4aErSrCR/On/e5G2hDP0wjooqDdauzEbIq8hIkIe5pXV0rtWJZvdCEKL0ykZxex+IxIwBp0eGeV48hQN07dXtw==} + "@inquirer/password@4.0.23": + resolution: + { integrity: sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@napi-rs/wasm-runtime@0.2.4': - resolution: {integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ==} + "@inquirer/prompts@7.10.1": + resolution: + { integrity: sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} + "@inquirer/rawlist@4.1.11": + resolution: + { integrity: sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} + "@inquirer/search@3.2.2": + resolution: + { integrity: sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} + "@inquirer/select@4.4.2": + resolution: + { integrity: sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@npmcli/agent@2.2.0': - resolution: {integrity: sha512-2yThA1Es98orMkpSLVqlDZAMPK3jHJhifP2gnNUdk1754uZ8yI5c+ulCoVG+WlntQA6MzhrURMXjSd9Z7dJ2/Q==} - engines: {node: ^16.14.0 || >=18.0.0} + "@inquirer/type@3.0.10": + resolution: + { integrity: sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - '@npmcli/arborist@7.5.4': - resolution: {integrity: sha512-nWtIc6QwwoUORCRNzKx4ypHqCk3drI+5aeYdMTQQiRCcn4lOOgfQh7WyZobGYTxXPSq1VwV53lkpN/BRlRk08g==} - engines: {node: ^16.14.0 || >=18.0.0} + "@isaacs/balanced-match@4.0.1": + resolution: + { integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== } + engines: { node: 20 || >=22 } + + "@isaacs/brace-expansion@5.0.0": + resolution: + { integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== } + engines: { node: 20 || >=22 } + + "@isaacs/cliui@8.0.2": + resolution: + { integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== } + engines: { node: ">=12" } + + "@isaacs/fs-minipass@4.0.1": + resolution: + { integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w== } + engines: { node: ">=18.0.0" } + + "@isaacs/string-locale-compare@1.1.0": + resolution: + { integrity: sha512-SQ7Kzhh9+D+ZW9MA0zkYv3VXhIDNx+LzM6EJ+/65I3QY+enU6Itte7E5XX7EWrqLW2FN4n06GWzBnPoC3th2aQ== } + + "@jest/diff-sequences@30.0.1": + resolution: + { integrity: sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/get-type@30.1.0": + resolution: + { integrity: sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jest/schemas@30.0.5": + resolution: + { integrity: sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } + + "@jridgewell/gen-mapping@0.3.12": + resolution: + { integrity: sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg== } + + "@jridgewell/gen-mapping@0.3.5": + resolution: + { integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== } + engines: { node: ">=6.0.0" } + + "@jridgewell/remapping@2.3.5": + resolution: + { integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== } + + "@jridgewell/resolve-uri@3.1.1": + resolution: + { integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== } + engines: { node: ">=6.0.0" } + + "@jridgewell/set-array@1.2.1": + resolution: + { integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== } + engines: { node: ">=6.0.0" } + + "@jridgewell/source-map@0.3.5": + resolution: + { integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== } + + "@jridgewell/sourcemap-codec@1.4.15": + resolution: + { integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== } + + "@jridgewell/sourcemap-codec@1.5.0": + resolution: + { integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== } + + "@jridgewell/sourcemap-codec@1.5.5": + resolution: + { integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== } + + "@jridgewell/trace-mapping@0.3.25": + resolution: + { integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== } + + "@jridgewell/trace-mapping@0.3.29": + resolution: + { integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ== } + + "@jridgewell/trace-mapping@0.3.31": + resolution: + { integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== } + + "@jridgewell/trace-mapping@0.3.9": + resolution: + { integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== } + + "@lerna/create@9.0.3": + resolution: + { integrity: sha512-hUTEWrR8zH+/Z3bp/R1aLm6DW8vB/BB7KH7Yeg4fMfrvSwxegiLVW9uJFAzWkK4mzEagmj/Dti85Yg9MN13t0g== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + + "@microsoft/tsdoc-config@0.18.0": + resolution: + { integrity: sha512-8N/vClYyfOH+l4fLkkr9+myAoR6M7akc8ntBJ4DJdWH2b09uVfr71+LTMpNyG19fNqWDg8KEDZhx5wxuqHyGjw== } + + "@microsoft/tsdoc@0.16.0": + resolution: + { integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA== } + + "@napi-rs/wasm-runtime@0.2.4": + resolution: + { integrity: sha512-9zESzOO5aDByvhIAsOy9TbpZ0Ur2AJbUI7UT73kcUTS2mxAMHOBaa1st/jAymNoCtvrit99kkzT1FZuXVcgfIQ== } + + "@nodelib/fs.scandir@2.1.5": + resolution: + { integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== } + engines: { node: ">= 8" } + + "@nodelib/fs.stat@2.0.5": + resolution: + { integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== } + engines: { node: ">= 8" } + + "@nodelib/fs.walk@1.2.8": + resolution: + { integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== } + engines: { node: ">= 8" } + + "@npmcli/agent@3.0.0": + resolution: + { integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/agent@4.0.0": + resolution: + { integrity: sha512-kAQTcEN9E8ERLVg5AsGwLNoFb+oEG6engbqAU2P43gD4JEIkNGMHdVQ096FsOAAYpZPB0RSt0zgInKIAS1l5QA== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/arborist@9.1.6": + resolution: + { integrity: sha512-c5Pr3EG8UP5ollkJy2x+UdEQC5sEHe3H9whYn6hb2HJimAKS4zmoJkx5acCiR/g4P38RnCSMlsYQyyHnKYeLvQ== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true - '@npmcli/fs@3.1.1': - resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/git@5.0.3': - resolution: {integrity: sha512-UZp9NwK+AynTrKvHn5k3KviW/hA5eENmFsu3iAPe7sWRt0lFUdsY/wXIYjpDFe7cdSNwOIzbObfwgt6eL5/2zw==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@npmcli/installed-package-contents@2.1.0': - resolution: {integrity: sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + "@npmcli/fs@4.0.0": + resolution: + { integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/fs@5.0.0": + resolution: + { integrity: sha512-7OsC1gNORBEawOa5+j2pXN9vsicaIOH5cPXxoR6fJOmH6/EXpJB2CajXOu1fPRFun2m1lktEFX11+P89hqO/og== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/git@6.0.3": + resolution: + { integrity: sha512-GUYESQlxZRAdhs3UhbB6pVRNUELQOHXwK9ruDkwmCv2aZ5y0SApQzUJCg02p3A7Ue2J5hxvlk1YI53c00NmRyQ== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/git@7.0.1": + resolution: + { integrity: sha512-+XTFxK2jJF/EJJ5SoAzXk3qwIDfvFc5/g+bD274LZ7uY7LE8sTfG6Z8rOanPl2ZEvZWqNvmEdtXC25cE54VcoA== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/installed-package-contents@3.0.0": + resolution: + { integrity: sha512-fkxoPuFGvxyrH+OQzyTkX2LUEamrF4jZSmxjAtPPHHGO0dqsQ8tTKjnIS8SAnPHdk2I03BDtSMR5K/4loKg79Q== } + engines: { node: ^18.17.0 || >=20.5.0 } hasBin: true - '@npmcli/map-workspaces@3.0.6': - resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - '@npmcli/metavuln-calculator@7.1.1': - resolution: {integrity: sha512-Nkxf96V0lAx3HCpVda7Vw4P23RILgdi/5K1fmj2tZkWIYLpXAN8k2UVVOsW16TsS5F8Ws2I7Cm+PU1/rsVF47g==} - engines: {node: ^16.14.0 || >=18.0.0} + "@npmcli/installed-package-contents@4.0.0": + resolution: + { integrity: sha512-yNyAdkBxB72gtZ4GrwXCM0ZUedo9nIbOMKfGjt6Cu6DXf0p8y1PViZAKDC8q8kv/fufx0WTjRBdSlyrvnP7hmA== } + engines: { node: ^20.17.0 || >=22.9.0 } + hasBin: true - '@npmcli/name-from-folder@2.0.0': - resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + "@npmcli/map-workspaces@5.0.3": + resolution: + { integrity: sha512-o2grssXo1e774E5OtEwwrgoszYRh0lqkJH+Pb9r78UcqdGJRDRfhpM8DvZPjzNLLNYeD/rNbjOKM3Ss5UABROw== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/metavuln-calculator@9.0.3": + resolution: + { integrity: sha512-94GLSYhLXF2t2LAC7pDwLaM4uCARzxShyAQKsirmlNcpidH89VA4/+K1LbJmRMgz5gy65E/QBBWQdUvGLe2Frg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/name-from-folder@3.0.0": + resolution: + { integrity: sha512-61cDL8LUc9y80fXn+lir+iVt8IS0xHqEKwPu/5jCjxQTVoSCmkXvw4vbMrzAMtmghz3/AkiBjhHkDKUH+kf7kA== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/name-from-folder@4.0.0": + resolution: + { integrity: sha512-qfrhVlOSqmKM8i6rkNdZzABj8MKEITGFAY+4teqBziksCQAOLutiAxM1wY2BKEd8KjUSpWmWCYxvXr0y4VTlPg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/node-gyp@4.0.0": + resolution: + { integrity: sha512-+t5DZ6mO/QFh78PByMq1fGSAub/agLJZDRfJRMeOSNCt8s9YVlTjmGpIPwPhvXTGUIJk+WszlT0rQa1W33yzNA== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/node-gyp@5.0.0": + resolution: + { integrity: sha512-uuG5HZFXLfyFKqg8QypsmgLQW7smiRjVc45bqD/ofZZcR/uxEjgQU8qDPv0s9TEeMUiAAU/GC5bR6++UdTirIQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/package-json@7.0.2": + resolution: + { integrity: sha512-0ylN3U5htO1SJTmy2YI78PZZjLkKUGg7EKgukb2CRi0kzyoDr0cfjHAzi7kozVhj2V3SxN1oyKqZ2NSo40z00g== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/promise-spawn@8.0.3": + resolution: + { integrity: sha512-Yb00SWaL4F8w+K8YGhQ55+xE4RUNdMHV43WZGsiTM92gS+lC0mGsn7I4hLug7pbao035S6bj3Y3w0cUNGLfmkg== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/promise-spawn@9.0.1": + resolution: + { integrity: sha512-OLUaoqBuyxeTqUvjA3FZFiXUfYC1alp3Sa99gW3EUDz3tZ3CbXDdcZ7qWKBzicrJleIgucoWamWH1saAmH/l2Q== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@npmcli/query@4.0.1": + resolution: + { integrity: sha512-4OIPFb4weUUwkDXJf4Hh1inAn8neBGq3xsH4ZsAaN6FK3ldrFkH7jSpCc7N9xesi0Sp+EBXJ9eGMDrEww2Ztqw== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/redact@3.2.2": + resolution: + { integrity: sha512-7VmYAmk4csGv08QzrDKScdzn11jHPFGyqJW39FyPgPuAp3zIaUmuCo1yxw9aGs+NEJuTGQ9Gwqpt93vtJubucg== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@npmcli/run-script@10.0.2": + resolution: + { integrity: sha512-9lCTqxaoa9c9cdkzSSx+q/qaYrCrUPEwTWzLkVYg1/T8ESH3BG9vmb1zRc6ODsBVB0+gnGRSqSr01pxTS1yX3A== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@nrwl/nx-cloud@19.1.0": + resolution: + { integrity: sha512-krngXVPfX0Zf6+zJDtcI59/Pt3JfcMPMZ9C/+/x6rvz4WGgyv1s0MI4crEUM0Lx5ZpS4QI0WNDCFVQSfGEBXUg== } + + "@nx/devkit@22.3.3": + resolution: + { integrity: sha512-/hxcdhE+QDalsWEbJurHtZh9aY27taHeImbCVJnogwv85H3RbAE+0YuKXGInutfLszAs7phwzli71yq+d2P45Q== } + peerDependencies: + nx: ">= 21 <= 23 || ^22.0.0-0" - '@npmcli/node-gyp@3.0.0': - resolution: {integrity: sha512-gp8pRXC2oOxu0DUE1/M3bYtb1b3/DbJ5aM113+XJBgfXdussRAsX0YOrOhdd8WvnAR6auDBvJomGAkLKA5ydxA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + "@nx/nx-darwin-arm64@22.3.3": + resolution: + { integrity: sha512-zBAGFGLal09CxhQkdMpOVwcwa9Y01aFm88jTTn35s/DdIWsfngmPzz0t4mG7u2D05q7TJfGQ31pIf5GkNUjo6g== } + cpu: [arm64] + os: [darwin] - '@npmcli/package-json@5.2.0': - resolution: {integrity: sha512-qe/kiqqkW0AGtvBjL8TJKZk/eBBSpnJkUWvHdQ9jM2lKHXRYYJuyNpJPlJw3c8QjC2ow6NZYiLExhUaeJelbxQ==} - engines: {node: ^16.14.0 || >=18.0.0} + "@nx/nx-darwin-x64@22.3.3": + resolution: + { integrity: sha512-6ZQ6rMqH8NY4Jz+Gc89D5bIH2NxZb5S/vaA4yJ9RrqAfl4QWchNFD5na+aRivSd+UdsYLPKKl6qohet5SE6vOg== } + cpu: [x64] + os: [darwin] - '@npmcli/promise-spawn@7.0.0': - resolution: {integrity: sha512-wBqcGsMELZna0jDblGd7UXgOby45TQaMWmbFwWX+SEotk4HV6zG2t6rT9siyLhPk4P6YYqgfL1UO8nMWDBVJXQ==} - engines: {node: ^16.14.0 || >=18.0.0} + "@nx/nx-freebsd-x64@22.3.3": + resolution: + { integrity: sha512-J/PP5pIOQtR7ZzrFwP6d6h0yfY7r9EravG2m940GsgzGbtZGYIDqnh5Wdt+4uBWPH8VpdNOwFqH0afELtJA3MA== } + cpu: [x64] + os: [freebsd] - '@npmcli/query@3.1.0': - resolution: {integrity: sha512-C/iR0tk7KSKGldibYIB9x8GtO/0Bd0I2mhOaDb8ucQL/bQVTmGoeREaFj64Z5+iCBRf3dQfed0CjJL7I8iTkiQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + "@nx/nx-linux-arm-gnueabihf@22.3.3": + resolution: + { integrity: sha512-/zn0altzM15S7qAgXMaB41vHkEn18HyTVUvRrjmmwaVqk9WfmDmqOQlGWoJ6XCbpvKQ8bh14RyhR9LGw1JJkNA== } + cpu: [arm] + os: [linux] - '@npmcli/redact@2.0.1': - resolution: {integrity: sha512-YgsR5jCQZhVmTJvjduTOIHph0L73pK8xwMVaDY0PatySqVM9AZj93jpoXYSJqfHFxFkN9dmqTw6OiqExsS3LPw==} - engines: {node: ^16.14.0 || >=18.0.0} + "@nx/nx-linux-arm64-gnu@22.3.3": + resolution: + { integrity: sha512-NmPeCexWIZHW9RM3lDdFENN9C3WtlQ5L4RSNFESIjreS921rgePhulsszYdGnHdcnKPYlBBJnX/NxVsfioBbnQ== } + cpu: [arm64] + os: [linux] - '@npmcli/run-script@8.1.0': - resolution: {integrity: sha512-y7efHHwghQfk28G2z3tlZ67pLG0XdfYbcVG26r7YIXALRsrVQcTq4/tdenSmdOrEsNahIYA/eh8aEVROWGFUDg==} - engines: {node: ^16.14.0 || >=18.0.0} + "@nx/nx-linux-arm64-musl@22.3.3": + resolution: + { integrity: sha512-K02U88Q0dpvCfmSXXvY7KbYQSa1m+mkYeqDBRHp11yHk1GoIqaHp8oEWda7FV4gsriNExPSS5tX1/QGVoLZrCw== } + cpu: [arm64] + os: [linux] - '@nrwl/devkit@19.8.4': - resolution: {integrity: sha512-OoIqDjj2mWzLs3aSF6w5OiC2xywYi/jBxHc7t7Lyi56Vc4dQq8vJMELa9WtG6qH0k05fF7N+jAoKlfvLgbbEFA==} + "@nx/nx-linux-x64-gnu@22.3.3": + resolution: + { integrity: sha512-04TEbvgwRaB9ifr39YwJmWh3RuXb4Ry4m84SOJyjNXAfPrepcWgfIQn1VL2ul1Ybq+P023dLO9ME8uqFh6j1YQ== } + cpu: [x64] + os: [linux] - '@nrwl/nx-cloud@19.1.0': - resolution: {integrity: sha512-krngXVPfX0Zf6+zJDtcI59/Pt3JfcMPMZ9C/+/x6rvz4WGgyv1s0MI4crEUM0Lx5ZpS4QI0WNDCFVQSfGEBXUg==} + "@nx/nx-linux-x64-musl@22.3.3": + resolution: + { integrity: sha512-uxBXx5q+S5OGatbYDxnamsKXRKlYn+Eq1nrCAHaf8rIfRoHlDiRV2PqtWuF+O2pxR5FWKpvr+/sZtt9rAf7KMw== } + cpu: [x64] + os: [linux] - '@nrwl/tao@19.8.14': - resolution: {integrity: sha512-zBeYzzwg43T/Z8ZtLblv0fcKuqJULttqYDekSLILThXp3UOMSerEvruhUgwddCY1jUssfLscz8vacMKISv5X4w==} - hasBin: true + "@nx/nx-win32-arm64-msvc@22.3.3": + resolution: + { integrity: sha512-aOwlfD6ZA1K6hjZtbhBSp7s1yi3sHbMpLCa4stXzfhCCpKUv46HU/EdiWdE1N8AsyNFemPZFq81k1VTowcACdg== } + cpu: [arm64] + os: [win32] - '@nrwl/tao@19.8.4': - resolution: {integrity: sha512-03/+QZ4/6HmKbEmvzCutLI1XIclBspNYtiVHmGPRWuwhnZViqYfnyl8J7RWVdFEoKKA5fhJqpg7e28aGuoMBvQ==} - hasBin: true + "@nx/nx-win32-x64-msvc@22.3.3": + resolution: + { integrity: sha512-EDR8BtqeDvVNQ+kPwnfeSfmerYetitU3tDkxOMIybjKJDh69U2JwTB8n9ARwNaZQbNk7sCGNRUSZFTbAAUKvuQ== } + cpu: [x64] + os: [win32] - '@nrwl/workspace@19.8.4': - resolution: {integrity: sha512-ZdzVMuVDkD5nYRXkvBIZe6yUTcbllYanoIh38a7l3MfPqw+2cFY2Cr9uPNfH3LXpzZYgKcr4vffYWwLXeIwbjw==} + "@nx/workspace@22.3.3": + resolution: + { integrity: sha512-A7Qd1Yi/hp/VPvig6tV+JmlYVSA4WhckNkP1giYZoESpGLxRlpwINpd5ii3oafOlglUdEZ8AiS3X+RUg9QmCAQ== } + + "@octokit/auth-token@4.0.0": + resolution: + { integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA== } + engines: { node: ">= 18" } + + "@octokit/core@5.2.1": + resolution: + { integrity: sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ== } + engines: { node: ">= 18" } + + "@octokit/endpoint@9.0.6": + resolution: + { integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw== } + engines: { node: ">= 18" } + + "@octokit/graphql@7.1.1": + resolution: + { integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g== } + engines: { node: ">= 18" } + + "@octokit/openapi-types@24.2.0": + resolution: + { integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg== } + + "@octokit/plugin-enterprise-rest@6.0.1": + resolution: + { integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw== } + + "@octokit/plugin-paginate-rest@11.4.4-cjs.2": + resolution: + { integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw== } + engines: { node: ">= 18" } + peerDependencies: + "@octokit/core": "5" - '@nx/devkit@19.8.4': - resolution: {integrity: sha512-FPFT8gVDFRSEmU0n7nRkT4Rnqy7OMznfPXLfDZtVuzEi5Cl6ftG3UBUvCgJcJFCYJVAZAUuv6vRSRarHd51XFQ==} + "@octokit/plugin-request-log@4.0.1": + resolution: + { integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA== } + engines: { node: ">= 18" } peerDependencies: - nx: '>= 17 <= 20' + "@octokit/core": "5" - '@nx/nx-darwin-arm64@19.8.14': - resolution: {integrity: sha512-bZUFf23gAzuwVw71dR8rngye5aCR8Z/ouIo+KayjqB0LWWoi3WzO73s4S69ljftYt4n6z9wvD+Trbb1BKm2fPg==} - engines: {node: '>= 10'} + "@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1": + resolution: + { integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ== } + engines: { node: ">= 18" } + peerDependencies: + "@octokit/core": ^5 + + "@octokit/request-error@5.1.1": + resolution: + { integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g== } + engines: { node: ">= 18" } + + "@octokit/request@8.4.1": + resolution: + { integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw== } + engines: { node: ">= 18" } + + "@octokit/rest@20.1.2": + resolution: + { integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA== } + engines: { node: ">= 18" } + + "@octokit/types@13.10.0": + resolution: + { integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA== } + + "@parcel/watcher-android-arm64@2.5.1": + resolution: + { integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== } + engines: { node: ">= 10.0.0" } cpu: [arm64] - os: [darwin] + os: [android] - '@nx/nx-darwin-arm64@19.8.4': - resolution: {integrity: sha512-mbSGt63hYcVCSQ54kpHl0lFqr5CsbkGJ4L3liWE30Da7vXZJwUBr9f+b9DnQ64IZzlu6vAhNcaiYQXa9lAk0yQ==} - engines: {node: '>= 10'} + "@parcel/watcher-darwin-arm64@2.5.1": + resolution: + { integrity: sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@19.8.14': - resolution: {integrity: sha512-UXXVea8icFG/3rFwpbLYsD6O4wlyJ1STQfOdhGK1Hyuga70AUUdrjVm7HzigAQP/Sb2Nzd7155YXHzfpRPDFYA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@nx/nx-darwin-x64@19.8.4': - resolution: {integrity: sha512-lTcXUCXNvqHdLmrNCOyDF+u6pDx209Ew7nSR47sQPvkycIHYi0gvgk0yndFn1Swah0lP4OxWg7rzAfmOlZd6ew==} - engines: {node: '>= 10'} + "@parcel/watcher-darwin-x64@2.5.1": + resolution: + { integrity: sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@19.8.14': - resolution: {integrity: sha512-TK2xuXn+BI6hxGaRK1HRUPWeF/nOtezKSqM+6rbippfCzjES/crmp9l5nbI764MMthtUmykCyWvhEfkDca6kbA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [freebsd] - - '@nx/nx-freebsd-x64@19.8.4': - resolution: {integrity: sha512-4BUplOxPZeUwlUNfzHHMmebNVgDFW/jNX6TWRS+jINwOHnpWLkLFAXu27G80/S3OaniVCzEQklXO9b+1UsdgXw==} - engines: {node: '>= 10'} + "@parcel/watcher-freebsd-x64@2.5.1": + resolution: + { integrity: sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@19.8.14': - resolution: {integrity: sha512-33rptyRraqaeQ2Kq6pcZKQqgnYY/7zcGH8fHXgKK7XzKk+7QuPViq+jMEUZP5E3UzZPkIYhsfmZcZqhNRvepJQ==} - engines: {node: '>= 10'} + "@parcel/watcher-linux-arm-glibc@2.5.1": + resolution: + { integrity: sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] - '@nx/nx-linux-arm-gnueabihf@19.8.4': - resolution: {integrity: sha512-Wahul8oz9huEm/Jv3wud5IGWdZxkGG4tdJm9i5TV5wxfUMAWbKU9v2nzZZins452UYESWvwvDkiuBPZqSto3qw==} - engines: {node: '>= 10'} + "@parcel/watcher-linux-arm-musl@2.5.1": + resolution: + { integrity: sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== } + engines: { node: ">= 10.0.0" } cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@19.8.14': - resolution: {integrity: sha512-2E70qMKOhh7Fp4JGcRbRLvFKq0+ANVdAgSzH47plxOLygIeVAfIXRSuQbCI0EUFa5Sy6hImLaoRSB2GdgKihAw==} - engines: {node: '>= 10'} + "@parcel/watcher-linux-arm64-glibc@2.5.1": + resolution: + { integrity: sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-gnu@19.8.4': - resolution: {integrity: sha512-L0RVCZkNAtZDplLT7uJV7M9cXxq2Fxw+8ex3eb9XSp7eyLeFO21T0R6vTouJ42E/PEvGApCAcyGqtnyPNMZFfw==} - engines: {node: '>= 10'} + "@parcel/watcher-linux-arm64-musl@2.5.1": + resolution: + { integrity: sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@19.8.14': - resolution: {integrity: sha512-ltty/PDWqkYgu/6Ye65d7v5nh3D6e0n3SacoKRs2Vtfz5oHYRUkSKizKIhEVfRNuHn3d9j8ve1fdcCN4SDPUBQ==} - engines: {node: '>= 10'} - cpu: [arm64] + "@parcel/watcher-linux-x64-glibc@2.5.1": + resolution: + { integrity: sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== } + engines: { node: ">= 10.0.0" } + cpu: [x64] os: [linux] - '@nx/nx-linux-arm64-musl@19.8.4': - resolution: {integrity: sha512-0q8r8I8WCsY3xowDI2j109SCUSkFns/BJ40aCfRh9hhrtaIIc5qXUw2YFTjxUZNcRJXx9j9+hTe9jBkUSIGvCw==} - engines: {node: '>= 10'} - cpu: [arm64] + "@parcel/watcher-linux-x64-musl@2.5.1": + resolution: + { integrity: sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== } + engines: { node: ">= 10.0.0" } + cpu: [x64] os: [linux] - '@nx/nx-linux-x64-gnu@19.8.14': - resolution: {integrity: sha512-JzE3BuO9RCBVdgai18CCze6KUzG0AozE0TtYFxRokfSC05NU3nUhd/o62UsOl7s6Bqt/9nwrW7JC8pNDiCi9OQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-linux-x64-gnu@19.8.4': - resolution: {integrity: sha512-XcRBNe0ws7KB0PMcUlpQqzzjjxMP8VdqirBz7CfB2XQ8xKmP3370p0cDvqs/4oKDHK4PCkmvVFX60tzakutylA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-linux-x64-musl@19.8.14': - resolution: {integrity: sha512-2rPvDOQLb7Wd6YiU88FMBiLtYco0dVXF99IJBRGAWv+WTI7MNr47OyK2ze+JOsbYY1d8aOGUvckUvCCZvZKEfg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-linux-x64-musl@19.8.4': - resolution: {integrity: sha512-JB4tAuZBCF0yqSnKF3pHXa0b7LA3ebi3Bw08QmMr//ON4aU+eXURGBuj9XvULD2prY+gpBrvf+MsG1XJAHL6Zg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@nx/nx-win32-arm64-msvc@19.8.14': - resolution: {integrity: sha512-JxW+YPS+EjhUsLw9C6wtk9pQTG3psyFwxhab8y/dgk2s4AOTLyIm0XxgcCJVvB6i4uv+s1g0QXRwp6+q3IR6hg==} - engines: {node: '>= 10'} + "@parcel/watcher-win32-arm64@2.5.1": + resolution: + { integrity: sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== } + engines: { node: ">= 10.0.0" } cpu: [arm64] os: [win32] - '@nx/nx-win32-arm64-msvc@19.8.4': - resolution: {integrity: sha512-WvQag/pN9ofRWRDvOZxj3jvJoTetlvV1uyirnDrhupRgi+Fj67OlGGt2zVUHaXFGEa1MfCEG6Vhk6152m4KyaQ==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@nx/nx-win32-x64-msvc@19.8.14': - resolution: {integrity: sha512-RxiPlBWPcGSf9TzIIy62iKRdRhokXMDUsPub9DL2VdVyTMXPZQR25aY/PJeasJN1EQU74hg097LK2wSHi+vzOQ==} - engines: {node: '>= 10'} - cpu: [x64] + "@parcel/watcher-win32-ia32@2.5.1": + resolution: + { integrity: sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== } + engines: { node: ">= 10.0.0" } + cpu: [ia32] os: [win32] - '@nx/nx-win32-x64-msvc@19.8.4': - resolution: {integrity: sha512-//JntLrN3L7WL/WgP3D0FE34caYTPcG/GIMBguC9w7YDyTlEikLgLbobjdCPz+2f9OWGvIZbJgGmtHNjnETM/g==} - engines: {node: '>= 10'} + "@parcel/watcher-win32-x64@2.5.1": + resolution: + { integrity: sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== } + engines: { node: ">= 10.0.0" } cpu: [x64] os: [win32] - '@nx/workspace@19.8.4': - resolution: {integrity: sha512-ub4nD2klOj00onF1KrNXIlLB9hXN9ybHs7XSP9YW+52qz79KaJWJm46ebTqeLnDZApYbAcB0vSCp2+kaEV24Ew==} - - '@octokit/auth-token@4.0.0': - resolution: {integrity: sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==} - engines: {node: '>= 18'} - - '@octokit/core@5.2.1': - resolution: {integrity: sha512-dKYCMuPO1bmrpuogcjQ8z7ICCH3FP6WmxpwC03yjzGfZhj9fTJg6+bS1+UAplekbN2C+M61UNllGOOoAfGCrdQ==} - engines: {node: '>= 18'} - - '@octokit/endpoint@9.0.6': - resolution: {integrity: sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==} - engines: {node: '>= 18'} - - '@octokit/graphql@7.1.1': - resolution: {integrity: sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==} - engines: {node: '>= 18'} - - '@octokit/openapi-types@24.2.0': - resolution: {integrity: sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==} - - '@octokit/plugin-enterprise-rest@6.0.1': - resolution: {integrity: sha512-93uGjlhUD+iNg1iWhUENAtJata6w5nE+V4urXOAlIXdco6xNZtUSfYY8dzp3Udy74aqO/B5UZL80x/YMa5PKRw==} - - '@octokit/plugin-paginate-rest@11.4.4-cjs.2': - resolution: {integrity: sha512-2dK6z8fhs8lla5PaOTgqfCGBxgAv/le+EhPs27KklPhm1bKObpu6lXzwfUEQ16ajXzqNrKMujsFyo9K2eaoISw==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - - '@octokit/plugin-request-log@4.0.1': - resolution: {integrity: sha512-GihNqNpGHorUrO7Qa9JbAl0dbLnqJVrV8OXe2Zm5/Y4wFkZQDfTreBzVmiRfJVfE4mClXdihHnbpyyO9FSX4HA==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': '5' - - '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1': - resolution: {integrity: sha512-VUjIjOOvF2oELQmiFpWA1aOPdawpyaCUqcEBc/UOUnj3Xp6DJGrJ1+bjUIIDzdHjnFNO6q57ODMfdEZnoBkCwQ==} - engines: {node: '>= 18'} - peerDependencies: - '@octokit/core': ^5 - - '@octokit/request-error@5.1.1': - resolution: {integrity: sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==} - engines: {node: '>= 18'} - - '@octokit/request@8.4.1': - resolution: {integrity: sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==} - engines: {node: '>= 18'} - - '@octokit/rest@20.1.2': - resolution: {integrity: sha512-GmYiltypkHHtihFwPRxlaorG5R9VAHuk/vbszVoRTGXnAsY60wYLkh/E2XiFmdZmqrisw+9FaazS1i5SbdWYgA==} - engines: {node: '>= 18'} - - '@octokit/types@13.10.0': - resolution: {integrity: sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pkgr/core@0.1.1': - resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@pkgr/core@0.2.4': - resolution: {integrity: sha512-ROFF39F6ZrnzSUEmQQZUar0Jt4xVoP9WnDRdWwF4NNcXs3xBTLgBUDoOwW141y1jP+S8nahIbdxbFC7IShw9Iw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - - '@polka/url@1.0.0-next.21': - resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - - '@polka/url@1.0.0-next.25': - resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} - - '@popperjs/core@2.11.8': - resolution: {integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==} - - '@putout/minify@4.7.2': - resolution: {integrity: sha512-9W1a5BIbnJoCgoZ9sRywj2IkakHTzLwHZRKm2hnV1JdcIwQQaF4ZT9jxFr5LSC/SsI0k18q6gBS7UrpTLLzQtA==} - engines: {node: '>=18'} - - '@rollup/rollup-android-arm-eabi@4.50.1': - resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} + "@parcel/watcher@2.5.1": + resolution: + { integrity: sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg== } + engines: { node: ">= 10.0.0" } + + "@pkgjs/parseargs@0.11.0": + resolution: + { integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== } + engines: { node: ">=14" } + + "@pkgr/core@0.2.9": + resolution: + { integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== } + engines: { node: ^12.20.0 || ^14.18.0 || >=16.0.0 } + + "@polka/url@1.0.0-next.25": + resolution: + { integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ== } + + "@popperjs/core@2.11.8": + resolution: + { integrity: sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== } + + "@putout/minify@6.0.0": + resolution: + { integrity: sha512-v/nzJzgUyh9TzRfy+5pTjj1z8Yhhg83TC4TQ/Mrrn2UwJnWWS/mVcpOWwHuFy7KsLnazE0ChHK/anM7GncrbHg== } + engines: { node: ">=22" } + + "@rollup/rollup-android-arm-eabi@4.50.1": + resolution: + { integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag== } cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.50.1': - resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} + "@rollup/rollup-android-arm64@4.50.1": + resolution: + { integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw== } cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.50.1': - resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} + "@rollup/rollup-darwin-arm64@4.50.1": + resolution: + { integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw== } cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.50.1': - resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} + "@rollup/rollup-darwin-x64@4.50.1": + resolution: + { integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw== } cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.50.1': - resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} + "@rollup/rollup-freebsd-arm64@4.50.1": + resolution: + { integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA== } cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.1': - resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} + "@rollup/rollup-freebsd-x64@4.50.1": + resolution: + { integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ== } cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': - resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} + "@rollup/rollup-linux-arm-gnueabihf@4.50.1": + resolution: + { integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg== } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.1': - resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} + "@rollup/rollup-linux-arm-musleabihf@4.50.1": + resolution: + { integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw== } cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.1': - resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} + "@rollup/rollup-linux-arm64-gnu@4.50.1": + resolution: + { integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw== } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.1': - resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} + "@rollup/rollup-linux-arm64-musl@4.50.1": + resolution: + { integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w== } cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': - resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} + "@rollup/rollup-linux-loongarch64-gnu@4.50.1": + resolution: + { integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q== } cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.1': - resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} + "@rollup/rollup-linux-ppc64-gnu@4.50.1": + resolution: + { integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q== } cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.1': - resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} + "@rollup/rollup-linux-riscv64-gnu@4.50.1": + resolution: + { integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ== } cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.1': - resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} + "@rollup/rollup-linux-riscv64-musl@4.50.1": + resolution: + { integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg== } cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.1': - resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} + "@rollup/rollup-linux-s390x-gnu@4.50.1": + resolution: + { integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg== } cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.1': - resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} + "@rollup/rollup-linux-x64-gnu@4.50.1": + resolution: + { integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA== } cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.1': - resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} + "@rollup/rollup-linux-x64-musl@4.50.1": + resolution: + { integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg== } cpu: [x64] os: [linux] - '@rollup/rollup-openharmony-arm64@4.50.1': - resolution: {integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==} + "@rollup/rollup-openharmony-arm64@4.50.1": + resolution: + { integrity: sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA== } cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.50.1': - resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} + "@rollup/rollup-win32-arm64-msvc@4.50.1": + resolution: + { integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ== } cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.1': - resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} + "@rollup/rollup-win32-ia32-msvc@4.50.1": + resolution: + { integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A== } cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.1': - resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} + "@rollup/rollup-win32-x64-msvc@4.50.1": + resolution: + { integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA== } cpu: [x64] os: [win32] - '@shikijs/engine-oniguruma@3.9.1': - resolution: {integrity: sha512-WPlL/xqviwS3te4unSGGGfflKsuHLMI6tPdNYvgz/IygcBT6UiwDFSzjBKyebwi5GGSlXsjjdoJLIBnAplmEZw==} - - '@shikijs/langs@3.9.1': - resolution: {integrity: sha512-Vyy2Yv9PP3Veh3VSsIvNncOR+O93wFsNYgN2B6cCCJlS7H9SKFYc55edsqernsg8WT/zam1cfB6llJsQWLnVhA==} - - '@shikijs/themes@3.9.1': - resolution: {integrity: sha512-zAykkGECNICCMXpKeVvq04yqwaSuAIvrf8MjsU5bzskfg4XreU+O0B5wdNCYRixoB9snd3YlZ373WV5E/g5T9A==} - - '@shikijs/types@3.9.1': - resolution: {integrity: sha512-rqM3T7a0iM1oPKz9iaH/cVgNX9Vz1HERcUcXJ94/fulgVdwqfnhXzGxO4bLrAnh/o5CPLy3IcYedogfV+Ns0Qg==} - - '@shikijs/vscode-textmate@10.0.2': - resolution: {integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==} - - '@sigstore/bundle@2.3.2': - resolution: {integrity: sha512-wueKWDk70QixNLB363yHc2D2ItTgYiMTdPwK8D9dKQMR3ZQ0c35IxP5xnwQ8cNLoCgCRcHf14kE+CLIvNX1zmA==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/core@1.1.0': - resolution: {integrity: sha512-JzBqdVIyqm2FRQCulY6nbQzMpJJpSiJ8XXWMhtOX9eKgaXXpfNOF53lzQEjIydlStnd/eFtuC1dW4VYdD93oRg==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/protobuf-specs@0.3.2': - resolution: {integrity: sha512-c6B0ehIWxMI8wiS/bj6rHMPqeFvngFV7cDU/MY+B16P9Z3Mp9k8L93eYZ7BYzSickzuqAQqAq0V956b3Ju6mLw==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/sign@2.3.2': - resolution: {integrity: sha512-5Vz5dPVuunIIvC5vBb0APwo7qKA4G9yM48kPWJT+OEERs40md5GoUR1yedwpekWZ4m0Hhw44m6zU+ObsON+iDA==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/tuf@2.3.4': - resolution: {integrity: sha512-44vtsveTPUpqhm9NCrbU8CWLe3Vck2HO1PNLw7RIajbB7xhtn5RBPm1VNSCMwqGYHhDsBJG8gDF0q4lgydsJvw==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sigstore/verify@1.2.1': - resolution: {integrity: sha512-8iKx79/F73DKbGfRf7+t4dqrc0bRr0thdPrxAtCKWRm/F0tG71i6O1rvlnScncJLLBZHn3h8M3c1BSUAb9yu8g==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - '@sphinxxxx/color-conversion@2.2.2': - resolution: {integrity: sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==} - - '@stylistic/eslint-plugin-js@1.7.0': - resolution: {integrity: sha512-PN6On/+or63FGnhhMKSQfYcWutRlzOiYlVdLM6yN7lquoBTqUJHYnl4TA4MHwiAt46X5gRxDr1+xPZ1lOLcL+Q==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin-jsx@1.7.0': - resolution: {integrity: sha512-BACdBwXakQvjYIST5N2WWhRbvhRsIxa/F59BiZol+0IH4FSmDXhie7v/yaxDIIA9CbfElzOmIA5nWNYTVXcnwQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin-plus@1.7.0': - resolution: {integrity: sha512-AabDw8sXsc70Ydx3qnbeTlRHZnIwY6UKEenBPURPhY3bfYWX+/pDpZH40HkOu94v8D0DUrocPkeeEUxl4e0JDg==} - peerDependencies: - eslint: '*' - - '@stylistic/eslint-plugin-ts@1.7.0': - resolution: {integrity: sha512-QsHv98mmW1xaucVYQTyLDgEpybPJ/6jPPxVBrIchntWWwj74xCWKUiw79hu+TpYj/Pbhd9rkqJYLNq3pQGYuyA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: '>=8.40.0' - - '@stylistic/eslint-plugin@1.7.0': - resolution: {integrity: sha512-ThMUjGIi/jeWYNvOdjZkoLw1EOVs0tEuKXDgWvTn8uWaEz55HuPlajKxjKLpv19C+qRDbKczJfzUODfCdME53A==} - engines: {node: ^16.0.0 || >=18.0.0} + "@rtsao/scc@1.1.0": + resolution: + { integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== } + + "@shikijs/engine-oniguruma@3.20.0": + resolution: + { integrity: sha512-Yx3gy7xLzM0ZOjqoxciHjA7dAt5tyzJE3L4uQoM83agahy+PlW244XJSrmJRSBvGYELDhYXPacD4R/cauV5bzQ== } + + "@shikijs/langs@3.20.0": + resolution: + { integrity: sha512-le+bssCxcSHrygCWuOrYJHvjus6zhQ2K7q/0mgjiffRbkhM4o1EWu2m+29l0yEsHDbWaWPNnDUTRVVBvBBeKaA== } + + "@shikijs/themes@3.20.0": + resolution: + { integrity: sha512-U1NSU7Sl26Q7ErRvJUouArxfM2euWqq1xaSrbqMu2iqa+tSp0D1Yah8216sDYbdDHw4C8b75UpE65eWorm2erQ== } + + "@shikijs/types@3.20.0": + resolution: + { integrity: sha512-lhYAATn10nkZcBQ0BlzSbJA3wcmL5MXUUF8d2Zzon6saZDlToKaiRX60n2+ZaHJCmXEcZRWNzn+k9vplr8Jhsw== } + + "@shikijs/vscode-textmate@10.0.2": + resolution: + { integrity: sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== } + + "@sigstore/bundle@4.0.0": + resolution: + { integrity: sha512-NwCl5Y0V6Di0NexvkTqdoVfmjTaQwoLM236r89KEojGmq/jMls8S+zb7yOwAPdXvbwfKDlP+lmXgAL4vKSQT+A== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/core@3.1.0": + resolution: + { integrity: sha512-o5cw1QYhNQ9IroioJxpzexmPjfCe7gzafd2RY3qnMpxr4ZEja+Jad/U8sgFpaue6bOaF+z7RVkyKVV44FN+N8A== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/protobuf-specs@0.5.0": + resolution: + { integrity: sha512-MM8XIwUjN2bwvCg1QvrMtbBmpcSHrkhFSCu1D11NyPvDQ25HEc4oG5/OcQfd/Tlf/OxmKWERDj0zGE23jQaMwA== } + engines: { node: ^18.17.0 || >=20.5.0 } + + "@sigstore/sign@4.1.0": + resolution: + { integrity: sha512-Vx1RmLxLGnSUqx/o5/VsCjkuN5L7y+vxEEwawvc7u+6WtX2W4GNa7b9HEjmcRWohw/d6BpATXmvOwc78m+Swdg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/tuf@4.0.1": + resolution: + { integrity: sha512-OPZBg8y5Vc9yZjmWCHrlWPMBqW5yd8+wFNl+thMdtcWz3vjVSoJQutF8YkrzI0SLGnkuFof4HSsWUhXrf219Lw== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sigstore/verify@3.1.0": + resolution: + { integrity: sha512-mNe0Iigql08YupSOGv197YdHpPPr+EzDZmfCgMc7RPNaZTw5aLN01nBl6CHJOh3BGtnMIj83EeN4butBchc8Ag== } + engines: { node: ^20.17.0 || >=22.9.0 } + + "@sinclair/typebox@0.34.41": + resolution: + { integrity: sha512-6gS8pZzSXdyRHTIqoqSVknxolr1kzfy4/CeDnrzsVz8TTIWUbOBr6gnzOmTYJ3eXQNh4IYHIGi5aIL7sOZ2G/g== } + + "@sindresorhus/base62@1.0.0": + resolution: + { integrity: sha512-TeheYy0ILzBEI/CO55CP6zJCSdSWeRtGnHy8U8dWSUH4I68iqTsy7HkMktR4xakThc9jotkPQUXT4ITdbV7cHA== } + engines: { node: ">=18" } + + "@sindresorhus/is@4.6.0": + resolution: + { integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw== } + engines: { node: ">=10" } + + "@so-ric/colorspace@1.1.6": + resolution: + { integrity: sha512-/KiKkpHNOBgkFJwu9sh48LkHSMYGyuTcSFK/qMBdnOAlrRJzRSXAOFB5qwzaVQuDl8wAvHVMkaASQDReTahxuw== } + + "@sphinxxxx/color-conversion@2.2.2": + resolution: + { integrity: sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw== } + + "@standard-schema/spec@1.1.0": + resolution: + { integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w== } + + "@stylistic/eslint-plugin@5.6.1": + resolution: + { integrity: sha512-JCs+MqoXfXrRPGbGmho/zGS/jMcn3ieKl/A8YImqib76C8kjgZwq5uUFzc30lJkMvcchuRn6/v8IApLxli3Jyw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: '>=8.40.0' + eslint: ">=9.0.0" - '@swc/core-darwin-arm64@1.9.2': - resolution: {integrity: sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A==} - engines: {node: '>=10'} + "@swc/core-darwin-arm64@1.9.2": + resolution: + { integrity: sha512-nETmsCoY29krTF2PtspEgicb3tqw7Ci5sInTI03EU5zpqYbPjoPH99BVTjj0OsF53jP5MxwnLI5Hm21lUn1d6A== } + engines: { node: ">=10" } cpu: [arm64] os: [darwin] - '@swc/core-darwin-x64@1.9.2': - resolution: {integrity: sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ==} - engines: {node: '>=10'} + "@swc/core-darwin-x64@1.9.2": + resolution: + { integrity: sha512-9gD+bwBz8ZByjP6nZTXe/hzd0tySIAjpDHgkFiUrc+5zGF+rdTwhcNrzxNHJmy6mw+PW38jqII4uspFHUqqxuQ== } + engines: { node: ">=10" } cpu: [x64] os: [darwin] - '@swc/core-linux-arm-gnueabihf@1.9.2': - resolution: {integrity: sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg==} - engines: {node: '>=10'} + "@swc/core-linux-arm-gnueabihf@1.9.2": + resolution: + { integrity: sha512-kYq8ief1Qrn+WmsTWAYo4r+Coul4dXN6cLFjiPZ29Cv5pyU+GFvSPAB4bEdMzwy99rCR0u2P10UExaeCjurjvg== } + engines: { node: ">=10" } cpu: [arm] os: [linux] - '@swc/core-linux-arm64-gnu@1.9.2': - resolution: {integrity: sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA==} - engines: {node: '>=10'} + "@swc/core-linux-arm64-gnu@1.9.2": + resolution: + { integrity: sha512-n0W4XiXlmEIVqxt+rD3ZpkogsEWUk1jJ+i5bQNgB+1JuWh0fBE8c/blDgTQXa0GB5lTPVDZQussgdNOCnAZwiA== } + engines: { node: ">=10" } cpu: [arm64] os: [linux] - '@swc/core-linux-arm64-musl@1.9.2': - resolution: {integrity: sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA==} - engines: {node: '>=10'} + "@swc/core-linux-arm64-musl@1.9.2": + resolution: + { integrity: sha512-8xzrOmsyCC1zrx2Wzx/h8dVsdewO1oMCwBTLc1gSJ/YllZYTb04pNm6NsVbzUX2tKddJVRgSJXV10j/NECLwpA== } + engines: { node: ">=10" } cpu: [arm64] os: [linux] - '@swc/core-linux-x64-gnu@1.9.2': - resolution: {integrity: sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg==} - engines: {node: '>=10'} + "@swc/core-linux-x64-gnu@1.9.2": + resolution: + { integrity: sha512-kZrNz/PjRQKcchWF6W292jk3K44EoVu1ad5w+zbS4jekIAxsM8WwQ1kd+yjUlN9jFcF8XBat5NKIs9WphJCVXg== } + engines: { node: ">=10" } cpu: [x64] os: [linux] - '@swc/core-linux-x64-musl@1.9.2': - resolution: {integrity: sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg==} - engines: {node: '>=10'} + "@swc/core-linux-x64-musl@1.9.2": + resolution: + { integrity: sha512-TTIpR4rjMkhX1lnFR+PSXpaL83TrQzp9znRdp2TzYrODlUd/R20zOwSo9vFLCyH6ZoD47bccY7QeGZDYT3nlRg== } + engines: { node: ">=10" } cpu: [x64] os: [linux] - '@swc/core-win32-arm64-msvc@1.9.2': - resolution: {integrity: sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw==} - engines: {node: '>=10'} + "@swc/core-win32-arm64-msvc@1.9.2": + resolution: + { integrity: sha512-+Eg2d4icItKC0PMjZxH7cSYFLWk0aIp94LNmOw6tPq0e69ax6oh10upeq0D1fjWsKLmOJAWEvnXlayZcijEXDw== } + engines: { node: ">=10" } cpu: [arm64] os: [win32] - '@swc/core-win32-ia32-msvc@1.9.2': - resolution: {integrity: sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ==} - engines: {node: '>=10'} + "@swc/core-win32-ia32-msvc@1.9.2": + resolution: + { integrity: sha512-nLWBi4vZDdM/LkiQmPCakof8Dh1/t5EM7eudue04V1lIcqx9YHVRS3KMwEaCoHLGg0c312Wm4YgrWQd9vwZ5zQ== } + engines: { node: ">=10" } cpu: [ia32] os: [win32] - '@swc/core-win32-x64-msvc@1.9.2': - resolution: {integrity: sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw==} - engines: {node: '>=10'} + "@swc/core-win32-x64-msvc@1.9.2": + resolution: + { integrity: sha512-ik/k+JjRJBFkXARukdU82tSVx0CbExFQoQ78qTO682esbYXzjdB5eLVkoUbwen299pnfr88Kn4kyIqFPTje8Xw== } + engines: { node: ">=10" } cpu: [x64] os: [win32] - '@swc/core@1.9.2': - resolution: {integrity: sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg==} - engines: {node: '>=10'} + "@swc/core@1.9.2": + resolution: + { integrity: sha512-dYyEkO6mRYtZFpnOsnYzv9rY69fHAHoawYOjGOEcxk9WYtaJhowMdP/w6NcOKnz2G7GlZaenjkzkMa6ZeQeMsg== } + engines: { node: ">=10" } peerDependencies: - '@swc/helpers': '*' + "@swc/helpers": "*" peerDependenciesMeta: - '@swc/helpers': + "@swc/helpers": optional: true - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/types@0.1.15': - resolution: {integrity: sha512-XKaZ+dzDIQ9Ot9o89oJQ/aluI17+VvUnIpYJTcZtvv1iYX6MzHh3Ik2CSR7MdPKpPwfZXHBeCingb2b4PoDVdw==} - - '@szmarczak/http-timer@4.0.6': - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - - '@ts-graphviz/adapter@2.0.3': - resolution: {integrity: sha512-wHSN23UdLz4vuYUBZCzq2/tfLicwStSo3cUWnzvMNxG2ngcuYauQCQInv4CI5IObq+PFol28RVrG9Ffa9BuIRA==} - engines: {node: '>=18'} - - '@ts-graphviz/ast@2.0.3': - resolution: {integrity: sha512-NhOgJdOHGSn5h5ydsFreLIKFBwQ59drzZ6y0B98+KeEMqduv5hXxcQoDabw8yzeNe9B92AfR5OpUYthcdAsYgw==} - engines: {node: '>=18'} - - '@ts-graphviz/common@2.1.2': - resolution: {integrity: sha512-Wyh5fOZNYyNP1mymbcHg/9atWR33NhHWIDrNa4hfbel3v340YQ+q+LMwAuIPuPt1qXINvOEhkowO5dvJWqfnPA==} - engines: {node: '>=18'} - - '@ts-graphviz/core@2.0.3': - resolution: {integrity: sha512-EZ+XlSwjdLtscoBOnA/Ba6QBrmoxAR73tJFjnWxaJQsZxWBQv6bLUrDgZUdXkXRAOSkRHn0uXY6Wq/3SsV2WtQ==} - engines: {node: '>=18'} - - '@tsconfig/node10@1.0.9': - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - - '@tsconfig/node12@1.0.11': - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - - '@tsconfig/node14@1.0.3': - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - - '@tsconfig/node16@1.0.4': - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - - '@tsparticles/cli@2.3.3': - resolution: {integrity: sha512-4tEBZ1Pw+DlruM5O7I8WM/8H+E7yUlkvGXM5GhDzNaYOxQs2ZMjfruuaeQ3eWZKuorfrk6pbCDD1FXR0Qsj5pA==} + "@swc/counter@0.1.3": + resolution: + { integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ== } + + "@swc/types@0.1.15": + resolution: + { integrity: sha512-XKaZ+dzDIQ9Ot9o89oJQ/aluI17+VvUnIpYJTcZtvv1iYX6MzHh3Ik2CSR7MdPKpPwfZXHBeCingb2b4PoDVdw== } + + "@szmarczak/http-timer@4.0.6": + resolution: + { integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w== } + engines: { node: ">=10" } + + "@ts-graphviz/adapter@2.0.3": + resolution: + { integrity: sha512-wHSN23UdLz4vuYUBZCzq2/tfLicwStSo3cUWnzvMNxG2ngcuYauQCQInv4CI5IObq+PFol28RVrG9Ffa9BuIRA== } + engines: { node: ">=18" } + + "@ts-graphviz/ast@2.0.3": + resolution: + { integrity: sha512-NhOgJdOHGSn5h5ydsFreLIKFBwQ59drzZ6y0B98+KeEMqduv5hXxcQoDabw8yzeNe9B92AfR5OpUYthcdAsYgw== } + engines: { node: ">=18" } + + "@ts-graphviz/common@2.1.2": + resolution: + { integrity: sha512-Wyh5fOZNYyNP1mymbcHg/9atWR33NhHWIDrNa4hfbel3v340YQ+q+LMwAuIPuPt1qXINvOEhkowO5dvJWqfnPA== } + engines: { node: ">=18" } + + "@ts-graphviz/core@2.0.3": + resolution: + { integrity: sha512-EZ+XlSwjdLtscoBOnA/Ba6QBrmoxAR73tJFjnWxaJQsZxWBQv6bLUrDgZUdXkXRAOSkRHn0uXY6Wq/3SsV2WtQ== } + engines: { node: ">=18" } + + "@tsconfig/node10@1.0.9": + resolution: + { integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== } + + "@tsconfig/node12@1.0.11": + resolution: + { integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== } + + "@tsconfig/node14@1.0.3": + resolution: + { integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== } + + "@tsconfig/node16@1.0.4": + resolution: + { integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== } + + "@tsparticles/cli@3.0.14": + resolution: + { integrity: sha512-QaX3vuCVNj6rAJ/Zbu0i3gFx4rdpkt9FHmO7kPFChcOWI5wjR6Z/BlMA8xcWVl9ir+g37OYHfVnXkVhPXRnv4w== } hasBin: true - '@tsparticles/eslint-config@2.3.0': - resolution: {integrity: sha512-pIvds4gm+wG7MT/U5u/q/rvzqpy50YymohL6qPTPkVLrP98RIMMrMxtfLLz9jXTJa3m1/DOZsv5m4ZlmYTcNTw==} - - '@tsparticles/prettier-config@2.1.6': - resolution: {integrity: sha512-KaiIN2QB9KVpsI+irHGpOdVEoAhlrTRGdjF+MhCawdMINlChgZfxXvvREzt1gSYxusqmEv/mF1u/fp0tBhGPqg==} - - '@tsparticles/tsconfig@2.3.0': - resolution: {integrity: sha512-XBtRoIQcBzC+R7/tcoYu4+JB9DbVrSbn09IJ+QMyATLZK0P4Expj3Z/hPpJzejWOvepMSYBZlCodnjFQyk17YA==} - - '@tsparticles/webpack-plugin@2.3.0': - resolution: {integrity: sha512-+SSh+I6dn/w+7C1APP5pPcD9jl9qrzkT7T00NGzk4+tII2dWURfrRF5DgyuInzFZA/AuR3K+QNCBTuo5INOD5Q==} - - '@tufjs/canonical-json@2.0.0': - resolution: {integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@tufjs/models@2.0.1': - resolution: {integrity: sha512-92F7/SFyufn4DXsha9+QfKnN03JGqtMFMXgSHbZOo8JG59WkTni7UzAouNQDf7AuP9OAMxVOPQcqG3sB7w+kkg==} - engines: {node: ^16.14.0 || >=18.0.0} - - '@tybys/wasm-util@0.9.0': - resolution: {integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==} - - '@types/body-parser@1.19.2': - resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} - - '@types/cacheable-request@6.0.3': - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - - '@types/chai@5.2.2': - resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + "@tsparticles/eslint-config@3.0.9": + resolution: + { integrity: sha512-Mm6vqanJbV1pkHpl0DzDGHgPThYiUtdcVDOR2i9lY0cosNRX3tC1pV0WpoKXDK+gMaa3CseOWYRbaS6mVMO3sw== } + peerDependencies: + eslint: ^9.0.0 - '@types/connect-livereload@0.6.3': - resolution: {integrity: sha512-CaWami/rQdycHKnOR+UIfBNxNeqLC5f1KqMdclbsf+TsiLgXwYm2/+KlAefcR3ODom7Fuz4bvWazDMsmfaV5gw==} + "@tsparticles/prettier-config@3.0.7": + resolution: + { integrity: sha512-JtNv1fL0sHqRw5iBGf1UP1A1VppwYWy55uN+an73kPbz+Mqhe8wgI5fJCVQJ4qCucL14Kv1ZNJZmS2hTLxcuRA== } - '@types/connect@3.4.35': - resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + "@tsparticles/tsconfig@3.0.9": + resolution: + { integrity: sha512-Ghn7tZXGONb1VtCkcpBo7xJW7VxSGZJmqWy3mIDte7t5WnErfQNZui/JRFOVE5Sq1vPv6/dR7n1WTP4o+TafyA== } - '@types/conventional-commits-parser@5.0.0': - resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==} + "@tsparticles/webpack-plugin@3.0.9": + resolution: + { integrity: sha512-zQa1rpG42KiK1qSJt+cAEl8Gb9B7OYn6UOtNEeDY8C13vLrnyuK6mvde2gruLG6qJVMxF+ybLJnk1ipFQpAJjA== } - '@types/deep-eql@4.0.2': - resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + "@tufjs/canonical-json@2.0.0": + resolution: + { integrity: sha512-yVtV8zsdo8qFHe+/3kw81dSLyF7D576A5cCFCi4X7B39tWT7SekaEFUnvnWJHz+9qO7qJTah1JbrDjWKqFtdWA== } + engines: { node: ^16.14.0 || >=18.0.0 } - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + "@tufjs/models@4.1.0": + resolution: + { integrity: sha512-Y8cK9aggNRsqJVaKUlEYs4s7CvQ1b1ta2DVPyAimb0I2qhzjNk+A+mxvll/klL0RlfuIUei8BF7YWiua4kQqww== } + engines: { node: ^20.17.0 || >=22.9.0 } - '@types/eslint@8.56.6': - resolution: {integrity: sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A==} + "@tybys/wasm-util@0.9.0": + resolution: + { integrity: sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw== } - '@types/estree@1.0.8': - resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + "@types/body-parser@1.19.2": + resolution: + { integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== } - '@types/express-serve-static-core@5.0.0': - resolution: {integrity: sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw==} + "@types/cacheable-request@6.0.3": + resolution: + { integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw== } - '@types/express@5.0.0': - resolution: {integrity: sha512-DvZriSMehGHL1ZNLzi6MidnsDhUZM/x2pRdDIKdwbUNqqwHxMlRdkxtn6/EPKyqKpHqTl/4nRZsRNLpZxZRpPQ==} + "@types/chai@5.2.2": + resolution: + { integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg== } - '@types/hast@3.0.4': - resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + "@types/connect-livereload@0.6.3": + resolution: + { integrity: sha512-CaWami/rQdycHKnOR+UIfBNxNeqLC5f1KqMdclbsf+TsiLgXwYm2/+KlAefcR3ODom7Fuz4bvWazDMsmfaV5gw== } - '@types/http-cache-semantics@4.0.1': - resolution: {integrity: sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==} + "@types/connect@3.4.35": + resolution: + { integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== } - '@types/jsdom@21.1.7': - resolution: {integrity: sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==} + "@types/conventional-commits-parser@5.0.0": + resolution: + { integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ== } - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + "@types/deep-eql@4.0.2": + resolution: + { integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw== } - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + "@types/eslint-scope@3.7.7": + resolution: + { integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== } - '@types/keyv@3.1.4': - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + "@types/eslint@8.56.6": + resolution: + { integrity: sha512-ymwc+qb1XkjT/gfoQwxIeHZ6ixH23A+tCT2ADSA/DPVKzAjwYkTXBMCQ/f6fe4wEa85Lhp26VPeUxI7wMhAi7A== } - '@types/livereload@0.9.5': - resolution: {integrity: sha512-2RXcRKdivPmn67pwjytvHoRv46AeXaLYVUWA0zkel1XSAOH5i71G0KfUdE5u3g80T155gR3Fo3ilVaqparLsVA==} + "@types/estree@1.0.8": + resolution: + { integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== } - '@types/luxon@3.4.2': - resolution: {integrity: sha512-TifLZlFudklWlMBfhubvgqTXRzLDI5pCbGa4P8a3wPyUQSW+1xQ5eDsreP9DWHX3tjq1ke96uYG/nwundroWcA==} + "@types/express-serve-static-core@5.0.0": + resolution: + { integrity: sha512-AbXMTZGt40T+KON9/Fdxx0B2WK5hsgxcfXJLr5bFpZ7b4JCex2WyQPTEKdXqfHiY5nKKBScZ7yCoO6Pvgxfvnw== } - '@types/mime@1.3.2': - resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==} + "@types/express@5.0.6": + resolution: + { integrity: sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA== } - '@types/mime@3.0.1': - resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + "@types/hast@3.0.4": + resolution: + { integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== } - '@types/minimatch@3.0.5': - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} + "@types/http-cache-semantics@4.0.4": + resolution: + { integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== } - '@types/minimist@1.2.2': - resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} + "@types/http-errors@2.0.5": + resolution: + { integrity: sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg== } - '@types/node@18.19.45': - resolution: {integrity: sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA==} + "@types/jsdom@27.0.0": + resolution: + { integrity: sha512-NZyFl/PViwKzdEkQg96gtnB8wm+1ljhdDay9ahn4hgb+SfVtPCbm3TlmDUFXTA+MGN3CijicnMhG18SI5H3rFw== } - '@types/node@20.14.9': - resolution: {integrity: sha512-06OCtnTXtWOZBJlRApleWndH4JsRVs1pDCc8dLSQp+7PpUpX3ePdHyeNSFTeSe7FtKyQkrlPvHwJOW3SLd8Oyg==} + "@types/json-schema@7.0.15": + resolution: + { integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== } - '@types/node@22.13.9': - resolution: {integrity: sha512-acBjXdRJ3A6Pb3tqnw9HZmyR3Fiol3aGxRCK1x3d+6CDAMjl7I649wpSd+yNURCjbOUGu9tqtLKnTGxmK6CyGw==} + "@types/json5@0.0.29": + resolution: + { integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== } + + "@types/keyv@3.1.4": + resolution: + { integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg== } + + "@types/livereload@0.9.5": + resolution: + { integrity: sha512-2RXcRKdivPmn67pwjytvHoRv46AeXaLYVUWA0zkel1XSAOH5i71G0KfUdE5u3g80T155gR3Fo3ilVaqparLsVA== } + + "@types/luxon@3.7.1": + resolution: + { integrity: sha512-H3iskjFIAn5SlJU7OuxUmTEpebK6TKB8rxZShDslBMZJ5u9S//KM1sbdAisiSrqwLQncVjnpi2OK2J51h+4lsg== } + + "@types/mime@1.3.2": + resolution: + { integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== } + + "@types/minimatch@3.0.5": + resolution: + { integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ== } + + "@types/minimist@1.2.2": + resolution: + { integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== } - '@types/node@22.15.14': - resolution: {integrity: sha512-BL1eyu/XWsFGTtDWOYULQEs4KR0qdtYfCxYAUYRoB7JP7h9ETYLgQTww6kH8Sj2C0pFGgrpM0XKv6/kbIzYJ1g==} + "@types/node@18.19.45": + resolution: + { integrity: sha512-VZxPKNNhjKmaC1SUYowuXSRSMGyQGmQjvvA1xE4QZ0xce2kLtEhPDS+kqpCPBZYgqblCLQ2DAjSzmgCM5auvhA== } - '@types/node@22.7.5': - resolution: {integrity: sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==} + "@types/node@22.19.3": + resolution: + { integrity: sha512-1N9SBnWYOJTrNZCdh/yJE+t910Y128BoyY+zBLWhL3r0TYzlTmFdXrPwHL9DyFZmlEXNQQolTZh3KHV31QDhyA== } - '@types/node@24.1.0': - resolution: {integrity: sha512-ut5FthK5moxFKH2T1CUOC6ctR67rQRvvHdFLCD2Ql6KXmMuCrjsSsRI9UsLCm9M18BMwClv4pn327UvB7eeO1w==} + "@types/node@25.0.3": + resolution: + { integrity: sha512-W609buLVRVmeW693xKfzHeIV6nJGGz98uCPfeXI1ELMLXVeKYZ9m15fAMSaUPBHYLGFsVRcMmSCksQOrZV9BYA== } - '@types/normalize-package-data@2.4.1': - resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==} + "@types/normalize-package-data@2.4.1": + resolution: + { integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== } - '@types/qs@6.9.7': - resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + "@types/qs@6.9.7": + resolution: + { integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== } - '@types/range-parser@1.2.4': - resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + "@types/range-parser@1.2.4": + resolution: + { integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== } - '@types/responselike@1.0.0': - resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==} + "@types/relateurl@0.2.33": + resolution: + { integrity: sha512-bTQCKsVbIdzLqZhLkF5fcJQreE4y1ro4DIyVrlDNSCJRRwHhB8Z+4zXXa8jN6eDvc2HbRsEYgbvrnGvi54EpSw== } - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + "@types/responselike@1.0.3": + resolution: + { integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw== } - '@types/send@0.17.1': - resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==} + "@types/send@0.17.1": + resolution: + { integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== } - '@types/serve-static@1.15.1': - resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + "@types/serve-static@2.2.0": + resolution: + { integrity: sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ== } - '@types/stylus@0.48.41': - resolution: {integrity: sha512-u0BzfnIgn/0I1YpAJGhkj9lUTLeiuiDXYOagXwe2aAsX8OKDFEWP6vqMMPxy4leQeX45LNDdCEjDJkuRxPCv7A==} + "@types/stylus@0.48.43": + resolution: + { integrity: sha512-72dv/zdhuyXWVHUXG2VTPEQdOG+oen95/DNFx2aMFFaY6LoITI6PwEqf5x31JF49kp2w9hvUzkNfTGBIeg61LQ== } - '@types/tough-cookie@4.0.2': - resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==} + "@types/tough-cookie@4.0.2": + resolution: + { integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== } - '@types/triple-beam@1.3.2': - resolution: {integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==} + "@types/triple-beam@1.3.2": + resolution: + { integrity: sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g== } - '@types/unist@3.0.3': - resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + "@types/unist@3.0.3": + resolution: + { integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== } - '@types/webpack-bundle-analyzer@4.7.0': - resolution: {integrity: sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg==} + "@types/webpack-bundle-analyzer@4.7.0": + resolution: + { integrity: sha512-c5i2ThslSNSG8W891BRvOd/RoCjI2zwph8maD22b1adtSns20j+0azDDMCK06DiVrzTgnwiDl5Ntmu1YRJw8Sg== } - '@types/webpack-env@1.18.8': - resolution: {integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A==} + "@types/webpack-env@1.18.8": + resolution: + { integrity: sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A== } - '@types/ws@8.5.4': - resolution: {integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==} + "@types/ws@8.5.4": + resolution: + { integrity: sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg== } - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + "@types/yauzl@2.10.3": + resolution: + { integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== } - '@typescript-eslint/eslint-plugin@7.18.0': - resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/eslint-plugin@8.51.0": + resolution: + { integrity: sha512-XtssGWJvypyM2ytBnSnKtHYOGT+4ZwTnBVl36TA4nRO2f4PRNGz5/1OszHzcZCvcBMh+qb7I06uoCmLTRdR9og== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.18.0': - resolution: {integrity: sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/parser": ^8.51.0 + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/parser@8.51.0": + resolution: + { integrity: sha512-3xP4XzzDNQOIqBMWogftkwxhg5oMKApqY0BAflmLZiFYHqyhSOxv/cd/zPQLTcCXr4AkaKb25joocY0BD1WC6A== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@6.21.0': - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" - '@typescript-eslint/scope-manager@7.18.0': - resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/type-utils@7.18.0': - resolution: {integrity: sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/project-service@8.46.4": + resolution: + { integrity: sha512-nPiRSKuvtTN+no/2N1kt2tUh/HoFzeEgOm9fQ6XQk4/ApGqjx0zFIIaLJ6wooR1HIoozvj2j6vTi/1fgAz7UYQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: ">=4.8.4 <6.0.0" - '@typescript-eslint/types@4.33.0': - resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - - '@typescript-eslint/types@5.62.0': - resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/types@6.21.0': - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/types@7.14.1': - resolution: {integrity: sha512-mL7zNEOQybo5R3AavY+Am7KLv8BorIv7HCYS5rKoNZKQD9tsfGUpO4KdAn3sSUvTiS4PQkr2+K0KJbxj8H9NDg==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/types@7.18.0': - resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/typescript-estree@4.33.0': - resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==} - engines: {node: ^10.12.0 || >=12.0.0} + "@typescript-eslint/project-service@8.51.0": + resolution: + { integrity: sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/typescript-estree@5.62.0': - resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/scope-manager@8.46.4": + resolution: + { integrity: sha512-tMDbLGXb1wC+McN1M6QeDx7P7c0UWO5z9CXqp7J8E+xGcJuUuevWKxuG8j41FoweS3+L41SkyKKkia16jpX7CA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/scope-manager@8.51.0": + resolution: + { integrity: sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/tsconfig-utils@8.46.4": + resolution: + { integrity: sha512-+/XqaZPIAk6Cjg7NWgSGe27X4zMGqrFqZ8atJsX3CWxH/jACqWnrWI68h7nHQld0y+k9eTTjb9r+KU4twLoo9A== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: ">=4.8.4 <6.0.0" - '@typescript-eslint/typescript-estree@6.21.0': - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} + "@typescript-eslint/tsconfig-utils@8.50.1": + resolution: + { integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: ">=4.8.4 <6.0.0" - '@typescript-eslint/typescript-estree@7.14.1': - resolution: {integrity: sha512-k5d0VuxViE2ulIO6FbxxSZaxqDVUyMbXcidC8rHvii0I56XZPv8cq+EhMns+d/EVIL41sMXqRbK3D10Oza1bbA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/tsconfig-utils@8.51.0": + resolution: + { integrity: sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: ">=4.8.4 <6.0.0" - '@typescript-eslint/typescript-estree@7.18.0': - resolution: {integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/type-utils@8.51.0": + resolution: + { integrity: sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - typescript: '*' + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/types@7.18.0": + resolution: + { integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/types@8.46.4": + resolution: + { integrity: sha512-USjyxm3gQEePdUwJBFjjGNG18xY9A2grDVGuk7/9AkjIF1L+ZrVnwR5VAU5JXtUnBL/Nwt3H31KlRDaksnM7/w== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/types@8.50.0": + resolution: + { integrity: sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/types@8.50.1": + resolution: + { integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/types@8.51.0": + resolution: + { integrity: sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/typescript-estree@7.18.0": + resolution: + { integrity: sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA== } + engines: { node: ^18.18.0 || >=20.0.0 } + peerDependencies: + typescript: "*" peerDependenciesMeta: typescript: optional: true - '@typescript-eslint/utils@6.21.0': - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} + "@typescript-eslint/typescript-estree@8.46.4": + resolution: + { integrity: sha512-7oV2qEOr1d4NWNmpXLR35LvCfOkTNymY9oyW+lUHkmCno7aOmIf/hMaydnJBUTBMRCOGZh8YjkFOc8dadEoNGA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^7.0.0 || ^8.0.0 + typescript: ">=4.8.4 <6.0.0" - '@typescript-eslint/utils@7.18.0': - resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==} - engines: {node: ^18.18.0 || >=20.0.0} + "@typescript-eslint/typescript-estree@8.51.0": + resolution: + { integrity: sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@4.33.0': - resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==} - engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1} - - '@typescript-eslint/visitor-keys@5.62.0': - resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@typescript-eslint/visitor-keys@6.21.0': - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/visitor-keys@7.14.1': - resolution: {integrity: sha512-Crb+F75U1JAEtBeQGxSKwI60hZmmzaqA3z9sYsVm8X7W5cwLEm5bRe0/uXS6+MR/y8CVpKSR/ontIAIEPFcEkA==} - engines: {node: ^18.18.0 || >=20.0.0} - - '@typescript-eslint/visitor-keys@7.18.0': - resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==} - engines: {node: ^18.18.0 || >=20.0.0} + typescript: ">=4.8.4 <6.0.0" - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + "@typescript-eslint/utils@8.46.4": + resolution: + { integrity: sha512-AbSv11fklGXV6T28dp2Me04Uw90R2iJ30g2bgLz529Koehrmkbs1r7paFqr1vPCZi7hHwYxYtxfyQMRC8QaVSg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" - '@vitest/coverage-v8@3.2.4': - resolution: {integrity: sha512-EyF9SXU6kS5Ku/U82E259WSnvg6c8KTjppUncuNdm5QHpe17mwREHnjDzozC8x9MZ0xfBUFSaLkRv4TMA75ALQ==} + "@typescript-eslint/utils@8.51.0": + resolution: + { integrity: sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" + + "@typescript-eslint/visitor-keys@7.18.0": + resolution: + { integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg== } + engines: { node: ^18.18.0 || >=20.0.0 } + + "@typescript-eslint/visitor-keys@8.46.4": + resolution: + { integrity: sha512-/++5CYLQqsO9HFGLI7APrxBJYo+5OCMpViuhV8q5/Qa3o5mMrF//eQHks+PXcsAVaLdn817fMuS7zqoXNNZGaw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@typescript-eslint/visitor-keys@8.51.0": + resolution: + { integrity: sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + "@vitest/coverage-v8@4.0.16": + resolution: + { integrity: sha512-2rNdjEIsPRzsdu6/9Eq0AYAzYdpP6Bx9cje9tL3FE5XzXRQF1fNU9pe/1yE8fCrS0HD+fBtt6gLPh6LI57tX7A== } peerDependencies: - '@vitest/browser': 3.2.4 - vitest: 3.2.4 + "@vitest/browser": 4.0.16 + vitest: 4.0.16 peerDependenciesMeta: - '@vitest/browser': + "@vitest/browser": optional: true - '@vitest/expect@3.2.4': - resolution: {integrity: sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig==} + "@vitest/expect@4.0.16": + resolution: + { integrity: sha512-eshqULT2It7McaJkQGLkPjPjNph+uevROGuIMJdG3V+0BSR2w9u6J9Lwu+E8cK5TETlfou8GRijhafIMhXsimA== } - '@vitest/mocker@3.2.4': - resolution: {integrity: sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ==} + "@vitest/mocker@4.0.16": + resolution: + { integrity: sha512-yb6k4AZxJTB+q9ycAvsoxGn+j/po0UaPgajllBgt1PzoMAAmJGYFdDk0uCcRcxb3BrME34I6u8gHZTQlkqSZpg== } peerDependencies: msw: ^2.4.9 - vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + vite: ^6.0.0 || ^7.0.0-0 peerDependenciesMeta: msw: optional: true vite: optional: true - '@vitest/pretty-format@3.2.4': - resolution: {integrity: sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA==} + "@vitest/pretty-format@4.0.16": + resolution: + { integrity: sha512-eNCYNsSty9xJKi/UdVD8Ou16alu7AYiS2fCPRs0b1OdhJiV89buAXQLpTbe+X8V9L6qrs9CqyvU7OaAopJYPsA== } - '@vitest/runner@3.2.4': - resolution: {integrity: sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ==} + "@vitest/runner@4.0.16": + resolution: + { integrity: sha512-VWEDm5Wv9xEo80ctjORcTQRJ539EGPB3Pb9ApvVRAY1U/WkHXmmYISqU5E79uCwcW7xYUV38gwZD+RV755fu3Q== } - '@vitest/snapshot@3.2.4': - resolution: {integrity: sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ==} + "@vitest/snapshot@4.0.16": + resolution: + { integrity: sha512-sf6NcrYhYBsSYefxnry+DR8n3UV4xWZwWxYbCJUt2YdvtqzSPR7VfGrY0zsv090DAbjFZsi7ZaMi1KnSRyK1XA== } - '@vitest/spy@3.2.4': - resolution: {integrity: sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw==} + "@vitest/spy@4.0.16": + resolution: + { integrity: sha512-4jIOWjKP0ZUaEmJm00E0cOBLU+5WE0BpeNr3XN6TEF05ltro6NJqHWxXD0kA8/Zc8Nh23AT8WQxwNG+WeROupw== } - '@vitest/ui@3.2.4': - resolution: {integrity: sha512-hGISOaP18plkzbWEcP/QvtRW1xDXF2+96HbEX6byqQhAUbiS5oH6/9JwW+QsQCIYON2bI6QZBF+2PvOmrRZ9wA==} + "@vitest/ui@4.0.16": + resolution: + { integrity: sha512-rkoPH+RqWopVxDnCBE/ysIdfQ2A7j1eDmW8tCxxrR9nnFBa9jKf86VgsSAzxBd1x+ny0GC4JgiD3SNfRHv3pOg== } peerDependencies: - vitest: 3.2.4 + vitest: 4.0.16 - '@vitest/utils@3.2.4': - resolution: {integrity: sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA==} + "@vitest/utils@4.0.16": + resolution: + { integrity: sha512-h8z9yYhV3e1LEfaQ3zdypIrnAg/9hguReGZoS7Gl0aBG5xgA410zBqECqmaF/+RkTggRsfnzc1XaAHA6bmUufA== } - '@vue/compiler-core@3.4.35': - resolution: {integrity: sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==} + "@vue/compiler-core@3.4.35": + resolution: + { integrity: sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg== } - '@vue/compiler-dom@3.4.35': - resolution: {integrity: sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ==} + "@vue/compiler-dom@3.4.35": + resolution: + { integrity: sha512-pWIZRL76/oE/VMhdv/ovZfmuooEni6JPG1BFe7oLk5DZRo/ImydXijoZl/4kh2406boRQ7lxTYzbZEEXEhj9NQ== } - '@vue/compiler-sfc@3.4.35': - resolution: {integrity: sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA==} + "@vue/compiler-sfc@3.4.35": + resolution: + { integrity: sha512-xacnRS/h/FCsjsMfxBkzjoNxyxEyKyZfBch/P4vkLRvYJwe5ChXmZZrj8Dsed/752H2Q3JE8kYu9Uyha9J6PgA== } - '@vue/compiler-ssr@3.4.35': - resolution: {integrity: sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==} + "@vue/compiler-ssr@3.4.35": + resolution: + { integrity: sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A== } - '@vue/shared@3.4.35': - resolution: {integrity: sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ==} + "@vue/shared@3.4.35": + resolution: + { integrity: sha512-hvuhBYYDe+b1G8KHxsQ0diDqDMA8D9laxWZhNAjE83VZb5UDaXl9Xnz7cGdDSyiHM90qqI/CyGMcpBpiDy6VVQ== } - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + "@webassemblyjs/ast@1.14.1": + resolution: + { integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== } - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + "@webassemblyjs/floating-point-hex-parser@1.13.2": + resolution: + { integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== } - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + "@webassemblyjs/helper-api-error@1.13.2": + resolution: + { integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== } - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + "@webassemblyjs/helper-buffer@1.14.1": + resolution: + { integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== } - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + "@webassemblyjs/helper-numbers@1.13.2": + resolution: + { integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== } - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + "@webassemblyjs/helper-wasm-bytecode@1.13.2": + resolution: + { integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== } - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + "@webassemblyjs/helper-wasm-section@1.14.1": + resolution: + { integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== } - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + "@webassemblyjs/ieee754@1.13.2": + resolution: + { integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== } - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + "@webassemblyjs/leb128@1.13.2": + resolution: + { integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== } - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + "@webassemblyjs/utf8@1.13.2": + resolution: + { integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== } - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + "@webassemblyjs/wasm-edit@1.14.1": + resolution: + { integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== } - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + "@webassemblyjs/wasm-gen@1.14.1": + resolution: + { integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== } - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + "@webassemblyjs/wasm-opt@1.14.1": + resolution: + { integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== } - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + "@webassemblyjs/wasm-parser@1.14.1": + resolution: + { integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== } - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@webpack-cli/configtest@2.1.1': - resolution: {integrity: sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x + "@webassemblyjs/wast-printer@1.14.1": + resolution: + { integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== } - '@webpack-cli/configtest@3.0.1': - resolution: {integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA==} - engines: {node: '>=18.12.0'} + "@webpack-cli/configtest@3.0.1": + resolution: + { integrity: sha512-u8d0pJ5YFgneF/GuvEiDA61Tf1VDomHHYMjv/wc9XzYj7nopltpG96nXN5dJRstxZhcNpV1g+nT6CydO7pHbjA== } + engines: { node: ">=18.12.0" } peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x - '@webpack-cli/info@2.0.2': - resolution: {integrity: sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - - '@webpack-cli/info@3.0.1': - resolution: {integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ==} - engines: {node: '>=18.12.0'} + "@webpack-cli/info@3.0.1": + resolution: + { integrity: sha512-coEmDzc2u/ffMvuW9aCjoRzNSPDl/XLuhPdlFRpT9tZHmJ/039az33CE7uH+8s0uL1j5ZNtfdv0HkfaKRBGJsQ== } + engines: { node: ">=18.12.0" } peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x - '@webpack-cli/serve@2.0.5': - resolution: {integrity: sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==} - engines: {node: '>=14.15.0'} - peerDependencies: - webpack: 5.x.x - webpack-cli: 5.x.x - webpack-dev-server: '*' - peerDependenciesMeta: - webpack-dev-server: - optional: true - - '@webpack-cli/serve@3.0.1': - resolution: {integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg==} - engines: {node: '>=18.12.0'} + "@webpack-cli/serve@3.0.1": + resolution: + { integrity: sha512-sbgw03xQaCLiT6gcY/6u3qBDn01CWw/nbaXl3gTdTFuJJ75Gffv3E3DBpgvY2fkkrdS1fpjaXNOmJlnbtKauKg== } + engines: { node: ">=18.12.0" } peerDependencies: webpack: ^5.82.0 webpack-cli: 6.x.x - webpack-dev-server: '*' + webpack-dev-server: "*" peerDependenciesMeta: webpack-dev-server: optional: true - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + "@xtuc/ieee754@1.2.0": + resolution: + { integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== } - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + "@xtuc/long@4.2.2": + resolution: + { integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== } - '@yarnpkg/lockfile@1.1.0': - resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} + "@yarnpkg/lockfile@1.1.0": + resolution: + { integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== } - '@yarnpkg/parsers@3.0.0-rc.46': - resolution: {integrity: sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==} - engines: {node: '>=14.15.0'} + "@yarnpkg/parsers@3.0.2": + resolution: + { integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA== } + engines: { node: ">=18.12.0" } - '@zkochan/js-yaml@0.0.7': - resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} + "@zkochan/js-yaml@0.0.7": + resolution: + { integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ== } hasBin: true JSONStream@1.3.5: - resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==} + resolution: + { integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== } hasBin: true abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + resolution: + { integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== } - abbrev@2.0.0: - resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + abbrev@3.0.1: + resolution: + { integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg== } + engines: { node: ^18.17.0 || >=20.5.0 } abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== } + engines: { node: ">=6.5" } - ace-builds@1.31.1: - resolution: {integrity: sha512-3DnE5bZF6Ji+l4F5acoLk+rV7mxrUt1C4r61Xy9owp5rVM4lj5NL8GJfoX6Jnnbhx6kKV7Vdpb+Tco+0ORTvhg==} + accepts@2.0.0: + resolution: + { integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng== } + engines: { node: ">= 0.6" } - ace-builds@1.32.2: - resolution: {integrity: sha512-mnJAc803p+7eeDt07r6XI7ufV7VdkpPq4gJZT8Jb3QsowkaBTVy4tdBgPrVT0WbXLm0toyEQXURKSVNj/7dfJQ==} + ace-builds@1.43.5: + resolution: + { integrity: sha512-iH5FLBKdB7SVn9GR37UgA/tpQS8OTWIxWAuq3Ofaw+Qbc69FfPXsXd9jeW7KRG2xKpKMqBDnu0tHBrCWY5QI7A== } acorn-import-phases@1.0.4: - resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ== } + engines: { node: ">=10.13.0" } peerDependencies: acorn: ^8.14.0 acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + resolution: + { integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== } peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== } + engines: { node: ">=0.4.0" } + + acorn-walk@8.3.4: + resolution: + { integrity: sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g== } + engines: { node: ">=0.4.0" } acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== } + engines: { node: ">=0.4.0" } hasBin: true acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== } + engines: { node: ">=0.4.0" } hasBin: true acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== } + engines: { node: ">=0.4.0" } hasBin: true acorn@8.15.0: - resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== } + engines: { node: ">=0.4.0" } hasBin: true add-stream@1.0.0: - resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} + resolution: + { integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== } agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== } + engines: { node: ">= 14" } aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== } + engines: { node: ">=8" } ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + resolution: + { integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== } peerDependencies: ajv: ^8.0.0 peerDependenciesMeta: @@ -4146,715 +4817,903 @@ packages: optional: true ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + resolution: + { integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== } peerDependencies: ajv: ^8.8.2 ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + resolution: + { integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== } ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} + resolution: + { integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== } ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw== } + engines: { node: ">=6" } ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== } + engines: { node: ">=8" } ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== } + engines: { node: ">=12" } ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== } + engines: { node: ">=8" } ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== } + engines: { node: ">=10" } ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== } + engines: { node: ">=12" } + + ansi-styles@6.2.3: + resolution: + { integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== } + engines: { node: ">=12" } any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + resolution: + { integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== } anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== } + engines: { node: ">= 8" } app-module-path@2.2.0: - resolution: {integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==} + resolution: + { integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ== } aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + resolution: + { integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ== } are-docs-informative@0.0.2: - resolution: {integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig== } + engines: { node: ">=14" } arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + resolution: + { integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== } argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + resolution: + { integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== } argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + resolution: + { integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== } - array-buffer-byte-length@1.0.0: - resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + array-buffer-byte-length@1.0.2: + resolution: + { integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw== } + engines: { node: ">= 0.4" } array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + resolution: + { integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg== } + engines: { node: ">=8" } array-ify@1.0.0: - resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==} + resolution: + { integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== } - array-includes@3.1.7: - resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} - engines: {node: '>= 0.4'} + array-includes@3.1.9: + resolution: + { integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ== } + engines: { node: ">= 0.4" } array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlastindex@1.2.3: - resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.2: - resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== } + engines: { node: ">=8" } + + array.prototype.findlastindex@1.2.6: + resolution: + { integrity: sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== } + engines: { node: ">= 0.4" } + + array.prototype.flat@1.3.3: + resolution: + { integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== } + engines: { node: ">= 0.4" } + + array.prototype.flatmap@1.3.3: + resolution: + { integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== } + engines: { node: ">= 0.4" } + + arraybuffer.prototype.slice@1.0.4: + resolution: + { integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ== } + engines: { node: ">= 0.4" } arrify@1.0.1: - resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== } + engines: { node: ">=0.10.0" } arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug== } + engines: { node: ">=8" } asap@2.0.6: - resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + resolution: + { integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== } assert-never@1.3.0: - resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} - - assertion-error@2.0.1: - resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} - engines: {node: '>=12'} - - ast-module-types@2.7.1: - resolution: {integrity: sha512-Rnnx/4Dus6fn7fTqdeLEAn5vUll5w7/vts0RN608yFa6si/rDOUonlIIiwugHBFWjylHjxm9owoSZn71KwG4gw==} - - ast-module-types@3.0.0: - resolution: {integrity: sha512-CMxMCOCS+4D+DkOQfuZf+vLrSEmY/7xtORwdxs4wtcC1wVgvk2MqFFTwQCFhvWsI4KPU9lcWXPI8DgRiz+xetQ==} - engines: {node: '>=6.0'} - - ast-module-types@4.0.0: - resolution: {integrity: sha512-Kd0o8r6CDazJGCRzs8Ivpn0xj19oNKrULhoJFzhGjRsLpekF2zyZs9Ukz+JvZhWD6smszfepakTFhAaYpsI12g==} - engines: {node: '>=12.0'} + resolution: + { integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ== } ast-module-types@6.0.0: - resolution: {integrity: sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-LFRg7178Fw5R4FAEwZxVqiRI8IxSM+Ay2UBrHoCerXNme+kMMMfz7T3xDGV/c2fer87hcrtgJGsnSOfUrPK6ng== } + engines: { node: ">=18" } - ast-v8-to-istanbul@0.3.3: - resolution: {integrity: sha512-MuXMrSLVVoA6sYN/6Hke18vMzrT4TZNbZIj/hvh0fnYFpO+/kFXcLIaiPwXXWaQUPg4yJD8fj+lfJ7/1EBconw==} + ast-v8-to-istanbul@0.3.9: + resolution: + { integrity: sha512-dSC6tJeOJxbZrPzPbv5mMd6CMiQ1ugaVXXPRad2fXUSsy1kstFn9XQWemV9VW7Y7kpxgQ/4WMoZfwdH8XSU48w== } + + async-function@1.0.0: + resolution: + { integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== } + engines: { node: ">= 0.4" } async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + resolution: + { integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== } asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + resolution: + { integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== } + + available-typed-arrays@1.0.7: + resolution: + { integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ== } + engines: { node: ">= 0.4" } - available-typed-arrays@1.0.5: - resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} - engines: {node: '>= 0.4'} + axios@1.13.2: + resolution: + { integrity: sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA== } axios@1.7.4: - resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==} + resolution: + { integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw== } babel-loader@10.0.0: - resolution: {integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA==} - engines: {node: ^18.20.0 || ^20.10.0 || >=22.0.0} + resolution: + { integrity: sha512-z8jt+EdS61AMw22nSfoNJAZ0vrtmhPRVi6ghL3rCeRZI8cdNYFiV5xeV3HbE7rlZZNmGH8BVccwWt8/ED0QOHA== } + engines: { node: ^18.20.0 || ^20.10.0 || >=22.0.0 } peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5.61.0' + "@babel/core": ^7.12.0 + webpack: ">=5.61.0" - babel-loader@9.2.1: - resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} - engines: {node: '>= 14.15.0'} + babel-plugin-polyfill-corejs2@0.4.14: + resolution: + { integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg== } peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs2@0.4.10: - resolution: {integrity: sha512-rpIuu//y5OX6jVU+a5BCn1R5RSZYWAl2Nar76iwaOdycqb6JPxediskWFMMl7stfwNJR4b7eiQvh5fB5TEQJTQ==} + babel-plugin-polyfill-corejs3@0.13.0: + resolution: + { integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A== } peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 - babel-plugin-polyfill-corejs3@0.10.4: - resolution: {integrity: sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==} + babel-plugin-polyfill-regenerator@0.6.5: + resolution: + { integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg== } peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.1: - resolution: {integrity: sha512-JfTApdE++cgcTWjsiCQlLyFBMbTUft9ja17saCc93lgV33h4tuCVj7tlvu//qpLwaG+3yEz7/KhahGrUMkVq9g==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + "@babel/core": ^7.4.0 || ^8.0.0-0 <8.0.0 babel-walk@3.0.0-canary-5: - resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} - engines: {node: '>= 10.0.0'} + resolution: + { integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw== } + engines: { node: ">= 10.0.0" } balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + resolution: + { integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== } base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + resolution: + { integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== } + + baseline-browser-mapping@2.9.11: + resolution: + { integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ== } + hasBin: true before-after-hook@2.2.3: - resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + resolution: + { integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== } - bin-links@4.0.4: - resolution: {integrity: sha512-cMtq4W5ZsEwcutJrVId+a/tjt8GSbS+h0oNkdl6+6rBuEv8Ot33Bevj5KPm40t309zuhVic8NjpuL42QCiJWWA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + bidi-js@1.0.3: + resolution: + { integrity: sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw== } + + bin-links@5.0.0: + resolution: + { integrity: sha512-sdleLVfCjBtgO5cNjA2HVRvWBJAHs4zwenaCPMNJAJU0yNxpzj80IpjOIimkpkr+mhlA+how5poQtt53PygbHA== } + engines: { node: ^18.17.0 || >=20.5.0 } binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== } + engines: { node: ">=8" } bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + resolution: + { integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== } - body-parser@1.20.3: - resolution: {integrity: sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + body-parser@2.2.1: + resolution: + { integrity: sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw== } + engines: { node: ">=18" } boolean@3.2.0: - resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} + resolution: + { integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw== } deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - bootstrap@5.3.2: - resolution: {integrity: sha512-D32nmNWiQHo94BKHLmOrdjlL05q1c8oxbtBphQFb9Z5to6eGRDCm0QgeaZ4zFBHzfg2++rqa2JkqCcxDy0sH0g==} + bootstrap@5.3.8: + resolution: + { integrity: sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg== } peerDependencies: - '@popperjs/core': ^2.11.8 + "@popperjs/core": ^2.11.8 brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + resolution: + { integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== } brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + resolution: + { integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== } braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browser-or-node@2.1.1: - resolution: {integrity: sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==} + resolution: + { integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== } + engines: { node: ">=8" } browser-or-node@3.0.0: - resolution: {integrity: sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ==} + resolution: + { integrity: sha512-iczIdVJzGEYhP5DqQxYM9Hh7Ztpqqi+CXZpSmX8ALFs9ecXkQIeqRyM6TfxEfMVpwhl3dSuDvxdzzo9sUOIVBQ== } - browserslist@4.25.1: - resolution: {integrity: sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + browserslist@4.28.1: + resolution: + { integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== } + engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + resolution: + { integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== } buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + resolution: + { integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== } buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + resolution: + { integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== } byte-size@8.1.1: - resolution: {integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg==} - engines: {node: '>=12.17'} + resolution: + { integrity: sha512-tUkzZWK0M/qdoLEqikxBWe4kumyuwjl3HO6zHTr4yEI23EojPtLYXdG1+AQY7MN0cGyNDvEaJ8wiYQm6P2bPxg== } + engines: { node: ">=12.17" } bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== } + engines: { node: ">= 0.8" } - cac@6.7.14: - resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} - engines: {node: '>=8'} + cacache@19.0.1: + resolution: + { integrity: sha512-hdsUxulXCi5STId78vRVYEtDAjq99ICAUktLTeTYsLoTE6Z8dS0c8pWNCxwdrk9YfJeobDZc2Y186hD/5ZQgFQ== } + engines: { node: ^18.17.0 || >=20.5.0 } - cacache@18.0.3: - resolution: {integrity: sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==} - engines: {node: ^16.14.0 || >=18.0.0} + cacache@20.0.3: + resolution: + { integrity: sha512-3pUp4e8hv07k1QlijZu6Kn7c9+ZpWWk4j3F8N3xPuCExULobqJydKYOTj1FTq58srkJsXvO7LbGAH4C0ZU3WGw== } + engines: { node: ^20.17.0 || >=22.9.0 } cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} + resolution: + { integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA== } + engines: { node: ">=10.6.0" } - cacheable-request@7.0.2: - resolution: {integrity: sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==} - engines: {node: '>=8'} + cacheable-request@7.0.4: + resolution: + { integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg== } + engines: { node: ">=8" } + + call-bind-apply-helpers@1.0.2: + resolution: + { integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ== } + engines: { node: ">= 0.4" } call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w== } + engines: { node: ">= 0.4" } + + call-bind@1.0.8: + resolution: + { integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww== } + engines: { node: ">= 0.4" } + + call-bound@1.0.4: + resolution: + { integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg== } + engines: { node: ">= 0.4" } callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== } + engines: { node: ">=6" } camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + resolution: + { integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== } camelcase-keys@6.2.2: - resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== } + engines: { node: ">=8" } camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== } + engines: { node: ">=6" } + + caniuse-lite@1.0.30001761: + resolution: + { integrity: sha512-JF9ptu1vP2coz98+5051jZ4PwQgd2ni8A+gYSN7EA7dPKIMf0pDlSUxhdmVOaV3/fYK5uWBkgSXJaRLr4+3A6g== } - caniuse-lite@1.0.30001731: - resolution: {integrity: sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==} + canvas@3.2.0: + resolution: + { integrity: sha512-jk0GxrLtUEmW/TmFsk2WghvgHe8B0pxGilqCL21y8lHkPUGa6FTsnCNtHPOzT8O3y+N+m3espawV80bbBlgfTA== } + engines: { node: ^18.12.0 || >= 20.9.0 } - canvas@3.1.2: - resolution: {integrity: sha512-Z/tzFAcBzoCvJlOSlCnoekh1Gu8YMn0J51+UAuXJAbW1Z6I9l2mZgdD7738MepoeeIcUdDtbMnOg6cC7GJxy/g==} - engines: {node: ^18.12.0 || >= 20.9.0} + capital-case@1.0.4: + resolution: + { integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== } - chai@5.2.0: - resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} - engines: {node: '>=12'} + chai@6.2.1: + resolution: + { integrity: sha512-p4Z49OGG5W/WBCPSS/dH3jQ73kD6tiMmUM+bckNK6Jr5JHMG3k9bg/BvKR8lKmtVBKmOiuVaV2ws8s9oSbwysg== } + engines: { node: ">=18" } chalk@4.1.0: - resolution: {integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== } + engines: { node: ">=10" } chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== } + engines: { node: ">=10" } chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + resolution: + { integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== } + engines: { node: ^12.17.0 || ^14.13 || >=16.0.0 } - character-parser@2.2.0: - resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + change-case@4.1.2: + resolution: + { integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== } - chardet@0.7.0: - resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + character-parser@2.2.0: + resolution: + { integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw== } - check-error@2.1.1: - resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} - engines: {node: '>= 16'} + chardet@2.1.1: + resolution: + { integrity: sha512-PsezH1rqdV9VvyNhxxOW32/d75r01NY7TQCmOqomRo15ZSOKbpTFVsfjghxo6JloQUCGnH4k1LGu0R4yCLlWQQ== } chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} + resolution: + { integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== } + engines: { node: ">= 8.10.0" } + + chokidar@4.0.3: + resolution: + { integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== } + engines: { node: ">= 14.16.0" } chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + resolution: + { integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== } chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== } + engines: { node: ">=10" } + + chownr@3.0.0: + resolution: + { integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g== } + engines: { node: ">=18" } chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== } + engines: { node: ">=6.0" } ci-info@3.8.0: - resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== } + engines: { node: ">=8" } ci-info@4.0.0: - resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg== } + engines: { node: ">=8" } - clean-css@5.3.2: - resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==} - engines: {node: '>= 10.0'} + clean-css@5.3.3: + resolution: + { integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg== } + engines: { node: ">= 10.0" } clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== } + engines: { node: ">=6" } cli-cursor@3.1.0: - resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== } + engines: { node: ">=8" } cli-spinners@2.6.1: - resolution: {integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g== } + engines: { node: ">=6" } cli-spinners@2.9.0: - resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== } + engines: { node: ">=6" } - cli-width@3.0.0: - resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} - engines: {node: '>= 10'} + cli-width@4.1.0: + resolution: + { integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== } + engines: { node: ">= 12" } cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + resolution: + { integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== } cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== } + engines: { node: ">=12" } cliui@9.0.1: - resolution: {integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w==} - engines: {node: '>=20'} + resolution: + { integrity: sha512-k7ndgKhwoQveBL+/1tqGJYNz097I7WOvwbmmU2AR5+magtbjPWQTS1C5vzGkBC8Ym8UWRzfKUzUUqFLypY4Q+w== } + engines: { node: ">=20" } clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== } + engines: { node: ">=6" } clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + resolution: + { integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== } clone@1.0.4: - resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} - engines: {node: '>=0.8'} + resolution: + { integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg== } + engines: { node: ">=0.8" } cmd-shim@6.0.3: - resolution: {integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-FMabTRlc5t5zjdenF6mS0MBeFZm0XqHqeOkcskKFb/LYCcRQ5fVgLOHVc4Lq9CqABd9zhjwPjMBCJvMCziSVtA== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + cmd-shim@7.0.0: + resolution: + { integrity: sha512-rtpaCbr164TPPh+zFdkWpCyZuKkjpAzODfaZCf/SVJZzJN+4bHQb/LP3Jzq5/+84um3XXY8r548XiWKSborwVw== } + engines: { node: ^18.17.0 || >=20.5.0 } color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} + resolution: + { integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== } + engines: { node: ">=7.0.0" } - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + color-convert@3.1.3: + resolution: + { integrity: sha512-fasDH2ont2GqF5HpyO4w0+BcewlhHEZOFn9c1ckZdHpJ56Qb7MHhH/IcJZbBGgvdtwdwNbLvxiBEdg336iA9Sg== } + engines: { node: ">=14.6" } color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: + { integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== } - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + color-name@2.1.0: + resolution: + { integrity: sha512-1bPaDNFm0axzE4MEAzKPuqKWeRaT43U/hyxKPBdqTfmPF+d6n7FSoTFxLVULUJOmiLp01KjhIPPH+HrXZJN4Rg== } + engines: { node: ">=12.20" } + + color-string@2.1.4: + resolution: + { integrity: sha512-Bb6Cq8oq0IjDOe8wJmi4JeNn763Xs9cfrBcaylK1tPypWzyoy2G3l90v9k64kjphl/ZJjPIShFztenRomi8WTg== } + engines: { node: ">=18" } color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + resolution: + { integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== } hasBin: true - color@3.2.1: - resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + color@5.0.3: + resolution: + { integrity: sha512-ezmVcLR3xAVp8kYOm4GS45ZLLgIE6SPAFoduLr6hTDajwb3KZ2F46gulK3XpcwRFb5KKGCSezCBAY4Dw4HsyXA== } + engines: { node: ">=18" } colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - colorspace@1.1.4: - resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + resolution: + { integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== } columnify@1.6.0: - resolution: {integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==} - engines: {node: '>=8.0.0'} + resolution: + { integrity: sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q== } + engines: { node: ">=8.0.0" } combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== } + engines: { node: ">= 0.8" } commander@12.0.0: - resolution: {integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== } + engines: { node: ">=18" } commander@12.1.0: - resolution: {integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA== } + engines: { node: ">=18" } commander@13.1.0: - resolution: {integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== } + engines: { node: ">=18" } + + commander@14.0.2: + resolution: + { integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ== } + engines: { node: ">=20" } commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + resolution: + { integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== } commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@9.5.0: - resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} - engines: {node: ^12.20.0 || >=14} + resolution: + { integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== } + engines: { node: ">= 10" } comment-parser@1.4.1: - resolution: {integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg== } + engines: { node: ">= 12.0.0" } common-ancestor-path@1.0.1: - resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} - - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} + resolution: + { integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w== } commondir@1.0.1: - resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} + resolution: + { integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== } compare-func@2.0.0: - resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==} + resolution: + { integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA== } concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: + { integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== } concat-stream@2.0.0: - resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} - engines: {'0': node >= 6.0} - - concurrently@9.0.0: - resolution: {integrity: sha512-iAxbsDeUkn8E/4+QalT7T3WvlyTfmsoez+19lbbcsxZdOEMfBukd8LA30KYez2UR5xkKFzbcqXIZy5RisCbaxw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A== } + engines: { "0": node >= 6.0 } + + concurrently@9.2.1: + resolution: + { integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng== } + engines: { node: ">=18" } hasBin: true connect-livereload@0.6.1: - resolution: {integrity: sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g==} + resolution: + { integrity: sha512-3R0kMOdL7CjJpU66fzAkCe6HNtd3AavCS4m+uW4KtJjrdGPT0SQEZieAYd+cm+lJoBznNQ4lqipYWkhBMgk00g== } console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + resolution: + { integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== } + + constant-case@3.0.4: + resolution: + { integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== } constantinople@4.0.1: - resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + resolution: + { integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw== } - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} + content-disposition@1.0.1: + resolution: + { integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q== } + engines: { node: ">=18" } content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== } + engines: { node: ">= 0.6" } conventional-changelog-angular@7.0.0: - resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ== } + engines: { node: ">=16" } conventional-changelog-conventionalcommits@7.0.2: - resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w== } + engines: { node: ">=16" } conventional-changelog-core@5.0.1: - resolution: {integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-Rvi5pH+LvgsqGwZPZ3Cq/tz4ty7mjijhr3qR4m9IBXNbxGGYgTVVO+duXzz9aArmHxFtwZ+LRkrNIMDQzgoY4A== } + engines: { node: ">=14" } conventional-changelog-preset-loader@3.0.0: - resolution: {integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-qy9XbdSLmVnwnvzEisjxdDiLA4OmV3o8db+Zdg4WiFw14fP3B6XNz98X0swPPpkTd/pc1K7+adKgEDM1JCUMiA== } + engines: { node: ">=14" } conventional-changelog-writer@6.0.0: - resolution: {integrity: sha512-8PyWTnn7zBIt9l4hj4UusFs1TyG+9Ulu1zlOAc72L7Sdv9Hsc8E86ot7htY3HXCVhXHB/NO0pVGvZpwsyJvFfw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-8PyWTnn7zBIt9l4hj4UusFs1TyG+9Ulu1zlOAc72L7Sdv9Hsc8E86ot7htY3HXCVhXHB/NO0pVGvZpwsyJvFfw== } + engines: { node: ">=14" } hasBin: true conventional-commits-filter@3.0.0: - resolution: {integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-1ymej8b5LouPx9Ox0Dw/qAO2dVdfpRFq28e5Y0jJEU8ZrLdy0vOSkkIInwmxErFGhg6SALro60ZrwYFVTUDo4Q== } + engines: { node: ">=14" } conventional-commits-parser@4.0.0: - resolution: {integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== } + engines: { node: ">=14" } hasBin: true conventional-commits-parser@5.0.0: - resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA== } + engines: { node: ">=16" } hasBin: true conventional-recommended-bump@7.0.1: - resolution: {integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-Ft79FF4SlOFvX4PkwFDRnaNiIVX7YbmqGU0RwccUaiGvgp3S0a8ipR2/Qxk31vclDNM+GSdJOVs2KrsUCjblVA== } + engines: { node: ">=14" } hasBin: true convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + resolution: + { integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== } - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + cookie-signature@1.2.2: + resolution: + { integrity: sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg== } + engines: { node: ">=6.6.0" } - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: + { integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w== } + engines: { node: ">= 0.6" } copyfiles@2.4.1: - resolution: {integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg==} + resolution: + { integrity: sha512-fereAvAvxDrQDOXybk3Qu3dPbOoKoysFMWtkY3mv5BsL8//OSZVL5DCLYqgRfY5cWirgRzlC+WSrxp6Bo3eNZg== } hasBin: true - core-js-compat@3.35.1: - resolution: {integrity: sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==} - - core-js-compat@3.36.1: - resolution: {integrity: sha512-Dk997v9ZCt3X/npqzyGdTlq6t7lDBhZwGvV94PKzDArjp7BTRm7WlDAXYd/OWdeFHO8OChQYRJNJvUCqCbrtKA==} + core-js-compat@3.45.1: + resolution: + { integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA== } core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + resolution: + { integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== } cosmiconfig-typescript-loader@6.1.0: - resolution: {integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g==} - engines: {node: '>=v18'} + resolution: + { integrity: sha512-tJ1w35ZRUiM5FeTzT7DtYWAFFv37ZLqSRkGi2oeCK1gPhvaWjkAtfXvLmvE1pRfxxp9aQo6ba/Pvg1dKj05D4g== } + engines: { node: ">=v18" } peerDependencies: - '@types/node': '*' - cosmiconfig: '>=9' - typescript: '>=5' + "@types/node": "*" + cosmiconfig: ">=9" + typescript: ">=5" cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== } + engines: { node: ">=14" } peerDependencies: - typescript: '>=4.9.5' + typescript: ">=4.9.5" peerDependenciesMeta: typescript: optional: true create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + resolution: + { integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== } - cross-env@10.0.0: - resolution: {integrity: sha512-aU8qlEK/nHYtVuN4p7UQgAwVljzMg8hB4YK5ThRqD2l/ziSnryncPNn7bMLt5cFYsKVKBh8HqLqyCoTupEUu7Q==} - engines: {node: '>=20'} + cross-env@10.1.0: + resolution: + { integrity: sha512-GsYosgnACZTADcmEyJctkJIoqAhHjttw7RsFrVoJNXbsWWqaq6Ym+7kZjq6mS45O0jij6vtiReppKQEtqWy6Dw== } + engines: { node: ">=20" } hasBin: true cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== } + engines: { node: ">= 8" } cross-spawn@7.0.6: - resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== } + engines: { node: ">= 8" } css-b64-images@0.2.5: - resolution: {integrity: sha512-TgQBEdP07adhrDfXvI5o6bHGukKBNMzp2Ngckc/6d09zpjD2gc1Hl3Ca1CKgb8FXjHi88+Phv2Uegs2kTL4zjg==} + resolution: + { integrity: sha512-TgQBEdP07adhrDfXvI5o6bHGukKBNMzp2Ngckc/6d09zpjD2gc1Hl3Ca1CKgb8FXjHi88+Phv2Uegs2kTL4zjg== } hasBin: true + css-tree@3.1.0: + resolution: + { integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w== } + engines: { node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0 } + cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== } + engines: { node: ">=4" } hasBin: true - cssstyle@4.2.1: - resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==} - engines: {node: '>=18'} + cssstyle@5.3.5: + resolution: + { integrity: sha512-GlsEptulso7Jg0VaOZ8BXQi3AkYM5BOJKEO/rjMidSCq70FkIC5y0eawrCXeYzxgt3OCf4Ls+eoxN+/05vN0Ag== } + engines: { node: ">=20" } dargs@7.0.0: - resolution: {integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== } + engines: { node: ">=8" } dargs@8.1.0: - resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==} - engines: {node: '>=12'} - - data-urls@5.0.0: - resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw== } + engines: { node: ">=12" } + + data-urls@6.0.0: + resolution: + { integrity: sha512-BnBS08aLUM+DKamupXs3w2tJJoqU+AkaE/+6vQxi/G/DPmIZFJJp9Dkb1kM03AZx8ADehDUZgsNxju3mPXZYIA== } + engines: { node: ">=20" } + + data-view-buffer@1.0.2: + resolution: + { integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ== } + engines: { node: ">= 0.4" } + + data-view-byte-length@1.0.2: + resolution: + { integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ== } + engines: { node: ">= 0.4" } + + data-view-byte-offset@1.0.1: + resolution: + { integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ== } + engines: { node: ">= 0.4" } dateformat@3.0.3: - resolution: {integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==} + resolution: + { integrity: sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== } debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true + resolution: + { integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== } debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + resolution: + { integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true debug@4.3.6: - resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} + resolution: + { integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} + debug@4.4.1: + resolution: + { integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ== } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true - debug@4.4.1: - resolution: {integrity: sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==} - engines: {node: '>=6.0'} + debug@4.4.3: + resolution: + { integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== } + engines: { node: ">=6.0" } peerDependencies: - supports-color: '*' + supports-color: "*" peerDependenciesMeta: supports-color: optional: true decamelize-keys@1.1.1: - resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== } + engines: { node: ">=0.10.0" } decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== } + engines: { node: ">=0.10.0" } - decimal.js@10.5.0: - resolution: {integrity: sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw==} + decimal.js@10.6.0: + resolution: + { integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg== } decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== } + engines: { node: ">=10" } dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + resolution: + { integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ== } peerDependencies: babel-plugin-macros: ^3.1.0 peerDependenciesMeta: @@ -4862,419 +5721,436 @@ packages: optional: true deep-eql@5.0.2: - resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q== } + engines: { node: ">=6" } deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} + resolution: + { integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== } + engines: { node: ">=4.0.0" } deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + resolution: + { integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== } + + deepcopy-esm@2.1.1: + resolution: + { integrity: sha512-0lopQd/gi3excE3sgBrjuR3gJv6ZElk027i30pUgdjtvSJl/OoZ8B6L42GUBm6C3G8hD1EB5ir2gTYnINzWx4g== } + engines: { node: ">=22" } defaults@1.0.4: - resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + resolution: + { integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A== } defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== } + engines: { node: ">=10" } define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A== } + engines: { node: ">= 0.4" } define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== } + engines: { node: ">=8" } - define-properties@1.2.0: - resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} - engines: {node: '>= 0.4'} + define-properties@1.2.1: + resolution: + { integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== } + engines: { node: ">= 0.4" } delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== } + engines: { node: ">=0.4.0" } depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== } + engines: { node: ">= 0.8" } dependency-tree@11.0.1: - resolution: {integrity: sha512-eCt7HSKIC9NxgIykG2DRq3Aewn9UhVS14MB3rEn6l/AsEI1FBg6ZGSlCU0SZ6Tjm2kkhj6/8c2pViinuyKELhg==} - engines: {node: '>=18'} - hasBin: true - - dependency-tree@9.0.0: - resolution: {integrity: sha512-osYHZJ1fBSon3lNLw70amAXsQ+RGzXsPvk9HbBgTLbp/bQBmpH5mOmsUvqXU+YEWVU0ZLewsmzOET/8jWswjDQ==} - engines: {node: ^10.13 || ^12 || >=14} + resolution: + { integrity: sha512-eCt7HSKIC9NxgIykG2DRq3Aewn9UhVS14MB3rEn6l/AsEI1FBg6ZGSlCU0SZ6Tjm2kkhj6/8c2pViinuyKELhg== } + engines: { node: ">=18" } hasBin: true deprecation@2.3.1: - resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + resolution: + { integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== } detect-indent@5.0.0: - resolution: {integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-rlpvsxUtM0PQvy9iZe640/IWwWYyBsTApREbA1pHOpmOUIl9MkP/U4z7vTtg4Oaojvqhxt7sdufnT0EzGaR31g== } + engines: { node: ">=4" } detect-libc@1.0.3: - resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg== } + engines: { node: ">=0.10" } hasBin: true detect-libc@2.0.1: - resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} - engines: {node: '>=8'} - - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + resolution: + { integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w== } + engines: { node: ">=8" } - detective-amd@3.1.2: - resolution: {integrity: sha512-jffU26dyqJ37JHR/o44La6CxtrDf3Rt9tvd2IbImJYxWKTMdBjctp37qoZ6ZcY80RHg+kzWz4bXn39e4P7cctQ==} - engines: {node: '>=6.0'} - hasBin: true + detect-libc@2.1.2: + resolution: + { integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ== } + engines: { node: ">=8" } - detective-amd@4.2.0: - resolution: {integrity: sha512-RbuEJHz78A8nW7CklkqTzd8lDCN42En53dgEIsya0DilpkwslamSZDasLg8dJyxbw46OxhSQeY+C2btdSkCvQQ==} - engines: {node: '>=12'} - hasBin: true + detect-node@2.1.0: + resolution: + { integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== } detective-amd@6.0.0: - resolution: {integrity: sha512-NTqfYfwNsW7AQltKSEaWR66hGkTeD52Kz3eRQ+nfkA9ZFZt3iifRCWh+yZ/m6t3H42JFwVFTrml/D64R2PAIOA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-NTqfYfwNsW7AQltKSEaWR66hGkTeD52Kz3eRQ+nfkA9ZFZt3iifRCWh+yZ/m6t3H42JFwVFTrml/D64R2PAIOA== } + engines: { node: ">=18" } hasBin: true - detective-cjs@3.1.3: - resolution: {integrity: sha512-ljs7P0Yj9MK64B7G0eNl0ThWSYjhAaSYy+fQcpzaKalYl/UoQBOzOeLCSFEY1qEBhziZ3w7l46KG/nH+s+L7BQ==} - engines: {node: '>=6.0'} - - detective-cjs@4.1.0: - resolution: {integrity: sha512-QxzMwt5MfPLwS7mG30zvnmOvHLx5vyVvjsAV6gQOyuMoBR5G1DhS1eJZ4P10AlH+HSnk93mTcrg3l39+24XCtg==} - engines: {node: '>=12'} - detective-cjs@6.0.0: - resolution: {integrity: sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg==} - engines: {node: '>=18'} - - detective-es6@2.2.2: - resolution: {integrity: sha512-eZUKCUsbHm8xoeoCM0z6JFwvDfJ5Ww5HANo+jPR7AzkFpW9Mun3t/TqIF2jjeWa2TFbAiGaWESykf2OQp3oeMw==} - engines: {node: '>=6.0'} - - detective-es6@3.0.1: - resolution: {integrity: sha512-evPeYIEdK1jK3Oji5p0hX4sPV/1vK+o4ihcWZkMQE6voypSW/cIBiynOLxQk5KOOQbdP8oOAsYqouMTYO5l1sw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-R55jTS6Kkmy6ukdrbzY4x+I7KkXiuDPpFzUViFV/tm2PBGtTCjkh9ZmTuJc1SaziMHJOe636dtiZLEuzBL9drg== } + engines: { node: ">=18" } detective-es6@5.0.0: - resolution: {integrity: sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg==} - engines: {node: '>=18'} - - detective-less@1.0.2: - resolution: {integrity: sha512-Rps1xDkEEBSq3kLdsdnHZL1x2S4NGDcbrjmd4q+PykK5aJwDdP5MBgrJw1Xo+kyUHuv3JEzPqxr+Dj9ryeDRTA==} - engines: {node: '>= 6.0'} - - detective-postcss@4.0.0: - resolution: {integrity: sha512-Fwc/g9VcrowODIAeKRWZfVA/EufxYL7XfuqJQFroBKGikKX83d2G7NFw6kDlSYGG3LNQIyVa+eWv1mqre+v4+A==} - engines: {node: ^10 || ^12 || >=14} - - detective-postcss@6.1.3: - resolution: {integrity: sha512-7BRVvE5pPEvk2ukUWNQ+H2XOq43xENWbH0LcdCE14mwgTBEAMoAx+Fc1rdp76SmyZ4Sp48HlV7VedUnP6GA1Tw==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + resolution: + { integrity: sha512-NGTnzjvgeMW1khUSEXCzPDoraLenWbUjCFjwxReH+Ir+P6LGjYtaBbAvITWn2H0VSC+eM7/9LFOTAkrta6hNYg== } + engines: { node: ">=18" } detective-postcss@7.0.0: - resolution: {integrity: sha512-pSXA6dyqmBPBuERpoOKKTUUjQCZwZPLRbd1VdsTbt6W+m/+6ROl4BbE87yQBUtLoK7yX8pvXHdKyM/xNIW9F7A==} - engines: {node: ^14.0.0 || >=16.0.0} + resolution: + { integrity: sha512-pSXA6dyqmBPBuERpoOKKTUUjQCZwZPLRbd1VdsTbt6W+m/+6ROl4BbE87yQBUtLoK7yX8pvXHdKyM/xNIW9F7A== } + engines: { node: ^14.0.0 || >=16.0.0 } peerDependencies: postcss: ^8.4.38 - detective-sass@3.0.2: - resolution: {integrity: sha512-DNVYbaSlmti/eztFGSfBw4nZvwsTaVXEQ4NsT/uFckxhJrNRFUh24d76KzoCC3aarvpZP9m8sC2L1XbLej4F7g==} - engines: {node: '>=6.0'} - - detective-sass@4.1.3: - resolution: {integrity: sha512-xGRbwGaGte57gvEqM8B9GDiURY3El/H49vA6g9wFkxq9zalmTlTAuqWu+BsH0iwonGPruLt55tZZDEZqPc6lag==} - engines: {node: '>=12'} - detective-sass@6.0.0: - resolution: {integrity: sha512-h5GCfFMkPm4ZUUfGHVPKNHKT8jV7cSmgK+s4dgQH4/dIUNh9/huR1fjEQrblOQNDalSU7k7g+tiW9LJ+nVEUhg==} - engines: {node: '>=18'} - - detective-scss@2.0.2: - resolution: {integrity: sha512-hDWnWh/l0tht/7JQltumpVea/inmkBaanJUcXRB9kEEXVwVUMuZd6z7eusQ6GcBFrfifu3pX/XPyD7StjbAiBg==} - engines: {node: '>=6.0'} - - detective-scss@3.1.1: - resolution: {integrity: sha512-FWkfru1jZBhUeuBsOeGKXKAVDrzYFSQFK2o2tuG/nCCFQ0U/EcXC157MNAcR5mmj+mCeneZzlkBOFJTesDjrww==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-h5GCfFMkPm4ZUUfGHVPKNHKT8jV7cSmgK+s4dgQH4/dIUNh9/huR1fjEQrblOQNDalSU7k7g+tiW9LJ+nVEUhg== } + engines: { node: ">=18" } detective-scss@5.0.0: - resolution: {integrity: sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg==} - engines: {node: '>=18'} - - detective-stylus@1.0.3: - resolution: {integrity: sha512-4/bfIU5kqjwugymoxLXXLltzQNeQfxGoLm2eIaqtnkWxqbhap9puDVpJPVDx96hnptdERzS5Cy6p9N8/08A69Q==} - - detective-stylus@2.0.1: - resolution: {integrity: sha512-/Tvs1pWLg8eYwwV6kZQY5IslGaYqc/GACxjcaGudiNtN5nKCH6o2WnJK3j0gA3huCnoQcbv8X7oz/c1lnvE3zQ==} - engines: {node: '>=6.0'} - - detective-stylus@3.0.0: - resolution: {integrity: sha512-1xYTzbrduExqMYmte7Qk99IRA3Aa6oV7PYzd+3yDcQXkmENvyGF/arripri6lxRDdNYEb4fZFuHtNRAXbz3iAA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-Y64HyMqntdsCh1qAH7ci95dk0nnpA29g319w/5d/oYcHolcGUVJbIhOirOFjfN1KnMAXAFm5FIkZ4l2EKFGgxg== } + engines: { node: ">=18" } detective-stylus@5.0.0: - resolution: {integrity: sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-KMHOsPY6aq3196WteVhkY5FF+6Nnc/r7q741E+Gq+Ax9mhE2iwj8Hlw8pl+749hPDRDBHZ2WlgOjP+twIG61vQ== } + engines: { node: ">=18" } detective-typescript@13.0.0: - resolution: {integrity: sha512-tcMYfiFWoUejSbvSblw90NDt76/4mNftYCX0SMnVRYzSXv8Fvo06hi4JOPdNvVNxRtCAKg3MJ3cBJh+ygEMH+A==} - engines: {node: ^14.14.0 || >=16.0.0} + resolution: + { integrity: sha512-tcMYfiFWoUejSbvSblw90NDt76/4mNftYCX0SMnVRYzSXv8Fvo06hi4JOPdNvVNxRtCAKg3MJ3cBJh+ygEMH+A== } + engines: { node: ^14.14.0 || >=16.0.0 } peerDependencies: typescript: ^5.4.4 - detective-typescript@7.0.2: - resolution: {integrity: sha512-unqovnhxzvkCz3m1/W4QW4qGsvXCU06aU2BAm8tkza+xLnp9SOFnob2QsTxUv5PdnQKfDvWcv9YeOeFckWejwA==} - engines: {node: ^10.13 || >=12.0.0} - - detective-typescript@9.1.1: - resolution: {integrity: sha512-Uc1yVutTF0RRm1YJ3g//i1Cn2vx1kwHj15cnzQP6ff5koNzQ0idc1zAC73ryaWEulA0ElRXFTq6wOqe8vUQ3MA==} - engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} - detective-vue2@2.0.3: - resolution: {integrity: sha512-AgWdSfVnft8uPGnUkdvE1EDadEENDCzoSRMt2xZfpxsjqVO617zGWXbB8TGIxHaqHz/nHa6lOSgAB8/dt0yEug==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-AgWdSfVnft8uPGnUkdvE1EDadEENDCzoSRMt2xZfpxsjqVO617zGWXbB8TGIxHaqHz/nHa6lOSgAB8/dt0yEug== } + engines: { node: ">=18" } peerDependencies: typescript: ^5.4.4 - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} + resolution: + { integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== } + engines: { node: ">=0.3.1" } + + diff@8.0.2: + resolution: + { integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg== } + engines: { node: ">=0.3.1" } dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== } + engines: { node: ">=8" } doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== } + engines: { node: ">=0.10.0" } doctypes@1.1.0: - resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + resolution: + { integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ== } dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + resolution: + { integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== } dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q== } + engines: { node: ">=8" } dotenv-expand@11.0.6: - resolution: {integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g== } + engines: { node: ">=12" } dotenv@10.0.0: - resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} - engines: {node: '>=10'} - - dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== } + engines: { node: ">=10" } dotenv@16.4.5: - resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== } + engines: { node: ">=12" } - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} + dotenv@17.2.3: + resolution: + { integrity: sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w== } + engines: { node: ">=12" } + + dunder-proto@1.0.1: + resolution: + { integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A== } + engines: { node: ">= 0.4" } eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + resolution: + { integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== } ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + resolution: + { integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== } ejs@3.1.9: - resolution: {integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== } + engines: { node: ">=0.10.0" } hasBin: true - electron-to-chromium@1.5.193: - resolution: {integrity: sha512-eePuBZXM9OVCwfYUhd2OzESeNGnWmLyeu0XAEjf7xjijNjHFdeJSzuRUGN4ueT2tEYo5YqjHramKEFxz67p3XA==} + electron-to-chromium@1.5.267: + resolution: + { integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw== } - electron@35.0.0: - resolution: {integrity: sha512-mwNQNktYLPnUWZVR8iNkfWCBjmM5e2/CmB1rhACwE9ASDbVU7CYPgp/jLUB3bj/LyQsfSuubD82OUite6SN8Uw==} - engines: {node: '>= 12.20.55'} + electron@39.2.7: + resolution: + { integrity: sha512-KU0uFS6LSTh4aOIC3miolcbizOFP7N1M46VTYVfqIgFiuA2ilfNaOHLDS9tCMvwwHRowAsvqBrh9NgMXcTOHCQ== } + engines: { node: ">= 12.20.55" } hasBin: true email-addresses@5.0.0: - resolution: {integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw==} + resolution: + { integrity: sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== } emoji-regex@10.4.0: - resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} + resolution: + { integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== } emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + resolution: + { integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== } emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + resolution: + { integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== } enabled@2.0.0: - resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== } encodeurl@2.0.0: - resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== } + engines: { node: ">= 0.8" } encoding@0.1.13: - resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + resolution: + { integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== } end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + resolution: + { integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== } + + end-of-stream@1.4.5: + resolution: + { integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg== } enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== } + engines: { node: ">=10.13.0" } enhanced-resolve@5.18.2: - resolution: {integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ== } + engines: { node: ">=10.13.0" } enquirer@2.3.6: - resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg== } + engines: { node: ">=8.6" } entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} + resolution: + { integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== } + engines: { node: ">=0.12" } - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} + entities@6.0.1: + resolution: + { integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g== } + engines: { node: ">=0.12" } - envinfo@7.10.0: - resolution: {integrity: sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==} - engines: {node: '>=4'} - hasBin: true + entities@7.0.0: + resolution: + { integrity: sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ== } + engines: { node: ">=0.12" } + + env-paths@2.2.1: + resolution: + { integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== } + engines: { node: ">=6" } envinfo@7.13.0: - resolution: {integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q== } + engines: { node: ">=4" } hasBin: true envinfo@7.14.0: - resolution: {integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== } + engines: { node: ">=4" } hasBin: true err-code@2.0.3: - resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + resolution: + { integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA== } error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: + { integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== } - es-abstract@1.22.3: - resolution: {integrity: sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==} - engines: {node: '>= 0.4'} + es-abstract@1.24.0: + resolution: + { integrity: sha512-WSzPgsdLtTcQwm4CROfS5ju2Wa1QQcVeT37jFjYzdFz1r9ahadC8B8/a4qxJxM+09F18iumCdRmlr96ZYkQvEg== } + engines: { node: ">= 0.4" } es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ== } + engines: { node: ">= 0.4" } + + es-define-property@1.0.1: + resolution: + { integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g== } + engines: { node: ">= 0.4" } es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw== } + engines: { node: ">= 0.4" } es-module-lexer@1.7.0: - resolution: {integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==} + resolution: + { integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA== } + + es-module-lexer@2.0.0: + resolution: + { integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw== } + + es-object-atoms@1.1.1: + resolution: + { integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA== } + engines: { node: ">= 0.4" } - es-set-tostringtag@2.0.1: - resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} - engines: {node: '>= 0.4'} + es-set-tostringtag@2.1.0: + resolution: + { integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA== } + engines: { node: ">= 0.4" } - es-shim-unscopables@1.0.0: - resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + es-shim-unscopables@1.1.0: + resolution: + { integrity: sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== } + engines: { node: ">= 0.4" } - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} + es-to-primitive@1.3.0: + resolution: + { integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g== } + engines: { node: ">= 0.4" } es6-error@4.1.1: - resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==} + resolution: + { integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== } - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} - engines: {node: '>=18'} + esbuild@0.25.9: + resolution: + { integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g== } + engines: { node: ">=18" } hasBin: true - esbuild@0.25.9: - resolution: {integrity: sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==} - engines: {node: '>=18'} + esbuild@0.27.2: + resolution: + { integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw== } + engines: { node: ">=18" } hasBin: true escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== } + engines: { node: ">=6" } escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== } + engines: { node: ">=6" } escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + resolution: + { integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== } escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== } + engines: { node: ">=0.8.0" } escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== } + engines: { node: ">=10" } escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - eslint-config-prettier@10.1.2: - resolution: {integrity: sha512-Epgp/EofAUeEpIdZkW60MHKvPyru1ruQJxPL+WIycnaPApuseK0Zpkrh/FwL9oIpQvIhJwV7ptOy0DWUjTlCiA==} + resolution: + { integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== } + engines: { node: ">=6.0" } hasBin: true - peerDependencies: - eslint: '>=7.0.0' - eslint-config-prettier@9.1.0: - resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + eslint-config-prettier@10.1.8: + resolution: + { integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== } hasBin: true peerDependencies: - eslint: '>=7.0.0' + eslint: ">=7.0.0" eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + resolution: + { integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g== } - eslint-module-utils@2.8.0: - resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} - engines: {node: '>=4'} + eslint-module-utils@2.12.1: + resolution: + { integrity: sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw== } + engines: { node: ">=4" } peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' + "@typescript-eslint/parser": "*" + eslint: "*" + eslint-import-resolver-node: "*" + eslint-import-resolver-typescript: "*" + eslint-import-resolver-webpack: "*" peerDependenciesMeta: - '@typescript-eslint/parser': + "@typescript-eslint/parser": optional: true eslint: optional: true @@ -5285,202 +6161,212 @@ packages: eslint-import-resolver-webpack: optional: true - eslint-plugin-import@2.29.1: - resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} - engines: {node: '>=4'} + eslint-plugin-import@2.32.0: + resolution: + { integrity: sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== } + engines: { node: ">=4" } peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + "@typescript-eslint/parser": "*" + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 peerDependenciesMeta: - '@typescript-eslint/parser': + "@typescript-eslint/parser": optional: true - eslint-plugin-jsdoc@48.5.0: - resolution: {integrity: sha512-ukXPNpGby3KjCveCizIS8t1EbuJEHYEu/tBg8GCbn/YbHcXwphyvYCdvRZ/oMRfTscGSSzfsWoZ+ZkAP0/6YMQ==} - engines: {node: '>=18'} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - - eslint-plugin-jsdoc@50.6.11: - resolution: {integrity: sha512-k4+MnBCGR8cuIB5MZ++FGd4gbXxjob2rX1Nq0q3nWFF4xSGZENTgTLZSjb+u9B8SAnP6lpGV2FJrBjllV3pVSg==} - engines: {node: '>=18'} + eslint-plugin-jsdoc@61.5.0: + resolution: + { integrity: sha512-PR81eOGq4S7diVnV9xzFSBE4CDENRQGP0Lckkek8AdHtbj+6Bm0cItwlFnxsLFriJHspiE3mpu8U20eODyToIg== } + engines: { node: ">=20.11.0" } peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - eslint-plugin-prettier@5.4.0: - resolution: {integrity: sha512-BvQOvUhkVQM1i63iMETK9Hjud9QhqBnbtT1Zc642p9ynzBuCe5pybkOnvqZIBypXmMlsGcnU4HZ8sCTPfpAexA==} - engines: {node: ^14.18.0 || >=16.0.0} + eslint-plugin-prettier@5.5.4: + resolution: + { integrity: sha512-swNtI95SToIz05YINMA6Ox5R057IMAmWZ26GqPxusAp1TZzj+IdY9tXNWWD3vkF/wEqydCONcwjTFpxybBqZsg== } + engines: { node: ^14.18.0 || >=16.0.0 } peerDependencies: - '@types/eslint': '>=8.0.0' - eslint: '>=8.0.0' - eslint-config-prettier: '>= 7.0.0 <10.0.0 || >=10.1.0' - prettier: '>=3.0.0' + "@types/eslint": ">=8.0.0" + eslint: ">=8.0.0" + eslint-config-prettier: ">= 7.0.0 <10.0.0 || >=10.1.0" + prettier: ">=3.0.0" peerDependenciesMeta: - '@types/eslint': + "@types/eslint": optional: true eslint-config-prettier: optional: true - eslint-plugin-tsdoc@0.2.17: - resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} - - eslint-plugin-tsdoc@0.4.0: - resolution: {integrity: sha512-MT/8b4aKLdDClnS8mP3R/JNjg29i0Oyqd/0ym6NnQf+gfKbJJ4ZcSh2Bs1H0YiUMTBwww5JwXGTWot/RwyJ7aQ==} + eslint-plugin-tsdoc@0.5.0: + resolution: + { integrity: sha512-ush8ehCwub2rgE16OIgQPFyj/o0k3T8kL++9IrAI4knsmupNo8gvfO2ERgDHWWgTC5MglbwLVRswU93HyXqNpw== } eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + resolution: + { integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== } + engines: { node: ">=8.0.0" } - eslint-visitor-keys@2.1.0: - resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} - engines: {node: '>=10'} + eslint-scope@8.4.0: + resolution: + { integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@4.0.0: - resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. + resolution: + { integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== } + engines: { node: ^12.22.0 || ^14.17.0 || >=16.0.0 } + + eslint-visitor-keys@4.2.1: + resolution: + { integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + + eslint@9.39.2: + resolution: + { integrity: sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } hasBin: true + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true - espree@10.1.0: - resolution: {integrity: sha512-M1M6CpiE6ffoigIOWYO9UDP8TMUw9kqb21tf+08IgDYjCsOvCuDt4jQcZmoYxx+w7zlKw9/N0KXfto+I8/FrXA==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + espree@10.4.0: + resolution: + { integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== } + engines: { node: ">=4" } hasBin: true - esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== } + engines: { node: ">=0.10" } esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== } + engines: { node: ">=4.0" } estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== } + engines: { node: ">=4.0" } estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== } + engines: { node: ">=4.0" } estree-walker@2.0.2: - resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + resolution: + { integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== } estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + resolution: + { integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== } esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== } + engines: { node: ">=0.10.0" } etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== } + engines: { node: ">= 0.6" } event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== } + engines: { node: ">=6" } eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + resolution: + { integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== } events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} + resolution: + { integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== } + engines: { node: ">=0.8.x" } execa@5.0.0: - resolution: {integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ== } + engines: { node: ">=10" } expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - expect-type@0.15.0: - resolution: {integrity: sha512-yWnriYB4e8G54M5/fAFj7rCIBiKs1HAACaY13kCz6Ku0dezjS9aMcfcdVK2X8Tv2tEV1BPz/wKfQ7WA4S/d8aA==} - - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== } + engines: { node: ">=6" } - expect-type@1.2.1: - resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} - engines: {node: '>=12.0.0'} + expect-type@1.3.0: + resolution: + { integrity: sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA== } + engines: { node: ">=12.0.0" } exponential-backoff@3.1.1: - resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + resolution: + { integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw== } - express-rate-limit@7.1.4: - resolution: {integrity: sha512-mv/6z+EwnWpr+MjGVavMGvM4Tl8S/tHmpl9ZsDfrQeHpYy4Hfr0UYdKEf9OOTe280oIr70yPxLRmQ6MfINfJDw==} - engines: {node: '>= 16'} + express-rate-limit@8.2.1: + resolution: + { integrity: sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g== } + engines: { node: ">= 16" } peerDependencies: - express: 4 || 5 || ^5.0.0-beta.1 + express: ">= 4.11" - express@4.20.0: - resolution: {integrity: sha512-pLdae7I6QqShF5PnNTCVn4hI91Dx0Grkn2+IAsMTgMIKuQVte2dN9PeGSSAME2FR8anOhVA62QDIUaWVfEXVLw==} - engines: {node: '>= 0.10.0'} - - external-editor@3.1.0: - resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} - engines: {node: '>=4'} + express@5.2.1: + resolution: + { integrity: sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw== } + engines: { node: ">= 18" } extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} + resolution: + { integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== } + engines: { node: ">= 10.17.0" } hasBin: true fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + resolution: + { integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== } fast-diff@1.3.0: - resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + resolution: + { integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== } fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} + resolution: + { integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== } + engines: { node: ">=8.6.0" } fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + resolution: + { integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== } fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + resolution: + { integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== } fastest-levenshtein@1.0.16: - resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} - engines: {node: '>= 4.9.1'} + resolution: + { integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== } + engines: { node: ">= 4.9.1" } fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + resolution: + { integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== } fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + resolution: + { integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== } fdir@6.5.0: - resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== } + engines: { node: ">=12.0.0" } peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -5488,1143 +6374,1570 @@ packages: optional: true fecha@4.2.3: - resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + resolution: + { integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== } fflate@0.8.2: - resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + resolution: + { integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A== } figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== } + engines: { node: ">=8" } - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} + file-entry-cache@8.0.0: + resolution: + { integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== } + engines: { node: ">=16.0.0" } filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + resolution: + { integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== } filename-reserved-regex@2.0.0: - resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== } + engines: { node: ">=4" } filenamify@4.3.0: - resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==} - engines: {node: '>=8'} - - filing-cabinet@3.3.1: - resolution: {integrity: sha512-renEK4Hh6DUl9Vl22Y3cxBq1yh8oNvbAdXnhih0wVpmea+uyKjC9K4QeRjUaybIiIewdzfum+Fg15ZqJ/GyCaA==} - engines: {node: '>=10.13.0'} - hasBin: true + resolution: + { integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== } + engines: { node: ">=8" } filing-cabinet@5.0.2: - resolution: {integrity: sha512-RZlFj8lzyu6jqtFBeXNqUjjNG6xm+gwXue3T70pRxw1W40kJwlgq0PSWAmh0nAnn5DHuBIecLXk9+1VKS9ICXA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-RZlFj8lzyu6jqtFBeXNqUjjNG6xm+gwXue3T70pRxw1W40kJwlgq0PSWAmh0nAnn5DHuBIecLXk9+1VKS9ICXA== } + engines: { node: ">=18" } hasBin: true fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== } + engines: { node: ">=8" } - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} + finalhandler@2.1.1: + resolution: + { integrity: sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA== } + engines: { node: ">= 18.0.0" } find-cache-dir@3.3.2: - resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} - engines: {node: '>=8'} - - find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== } + engines: { node: ">=8" } find-up@2.1.0: - resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ== } + engines: { node: ">=4" } find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== } + engines: { node: ">=8" } find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== } + engines: { node: ">=10" } find-up@7.0.0: - resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g== } + engines: { node: ">=18" } + + find-up@8.0.0: + resolution: + { integrity: sha512-JGG8pvDi2C+JxidYdIwQDyS/CgcrIdh18cvgxcBge3wSHRQOrooMD3GlFBcmMJAN9M42SAZjDp5zv1dglJjwww== } + engines: { node: ">=20" } - flat-cache@3.0.4: - resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==} - engines: {node: ^10.12.0 || >=12.0.0} + flat-cache@4.0.1: + resolution: + { integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== } + engines: { node: ">=16" } flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} + resolution: + { integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== } hasBin: true - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - flatted@3.3.3: - resolution: {integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==} - - flatten@1.0.3: - resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==} - deprecated: flatten is deprecated in favor of utility frameworks such as lodash. + resolution: + { integrity: sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg== } fn.name@1.1.0: - resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + resolution: + { integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== } follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} + resolution: + { integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== } + engines: { node: ">=4.0" } peerDependencies: - debug: '*' + debug: "*" peerDependenciesMeta: debug: optional: true - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + for-each@0.3.5: + resolution: + { integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg== } + engines: { node: ">= 0.4" } foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg== } + engines: { node: ">=14" } + + foreground-child@3.3.1: + resolution: + { integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== } + engines: { node: ">=14" } form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== } + engines: { node: ">= 6" } + + form-data@4.0.5: + resolution: + { integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w== } + engines: { node: ">= 6" } forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== } + engines: { node: ">= 0.6" } - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} + fresh@2.0.0: + resolution: + { integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A== } + engines: { node: ">= 0.8" } front-matter@4.0.2: - resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} + resolution: + { integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg== } fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + resolution: + { integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== } - fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} + fs-extra@11.3.3: + resolution: + { integrity: sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg== } + engines: { node: ">=14.14" } fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} + resolution: + { integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g== } + engines: { node: ">=6 <7 || >=8" } fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== } + engines: { node: ">= 8" } fs-minipass@3.0.2: - resolution: {integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-2GAfyfoaCDRrM6jaOS3UsBts8yJ55VioXdWcOL7dK9zdAuKT71+WBA4ifnNYqVjYv+4SsPxjK0JT4yIIn4cA/g== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + resolution: + { integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== } fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + resolution: + { integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== } + engines: { node: ^8.16.0 || ^10.6.0 || >=11.0.0 } os: [darwin] function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + resolution: + { integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== } - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} + function.prototype.name@1.1.8: + resolution: + { integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q== } + engines: { node: ">= 0.4" } functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + resolution: + { integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== } gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== } + engines: { node: ">=6.9.0" } - get-amd-module-type@3.0.2: - resolution: {integrity: sha512-PcuKwB8ouJnKuAPn6Hk3UtdfKoUV3zXRqVEvj8XGIXqjWfgd1j7QGdXy5Z9OdQfzVt1Sk29HVe/P+X74ccOuqw==} - engines: {node: '>=6.0'} - - get-amd-module-type@4.1.0: - resolution: {integrity: sha512-0e/eK6vTGCnSfQ6eYs3wtH05KotJYIP7ZIZEueP/KlA+0dIAEs8bYFvOd/U56w1vfjhJqBagUxVMyy9Tr/cViQ==} - engines: {node: '>=12'} - - get-amd-module-type@6.0.0: - resolution: {integrity: sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw==} - engines: {node: '>=18'} + get-amd-module-type@6.0.0: + resolution: + { integrity: sha512-hFM7oivtlgJ3d6XWD6G47l8Wyh/C6vFw5G24Kk1Tbq85yh5gcM8Fne5/lFhiuxB+RT6+SI7I1ThB9lG4FBh3jw== } + engines: { node: ">=18" } get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} + resolution: + { integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== } + engines: { node: 6.* || 8.* || >= 10.* } get-east-asian-width@1.3.0: - resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== } + engines: { node: ">=18" } get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ== } + engines: { node: ">= 0.4" } + + get-intrinsic@1.3.0: + resolution: + { integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ== } + engines: { node: ">= 0.4" } get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} + resolution: + { integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== } get-pkg-repo@4.2.1: - resolution: {integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA==} - engines: {node: '>=6.9.0'} + resolution: + { integrity: sha512-2+QbHjFRfGB74v/pYWjd5OhU3TDIC2Gv/YKUTk/tCvAz0pkn/Mz6P3uByuBimLOcPvN2jYdScl3xGFSrx0jEcA== } + engines: { node: ">=6.9.0" } hasBin: true get-port@5.1.1: - resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ== } + engines: { node: ">=8" } + + get-proto@1.0.1: + resolution: + { integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== } + engines: { node: ">= 0.4" } get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== } + engines: { node: ">=8" } get-stream@6.0.0: - resolution: {integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-A1B3Bh1UmL0bidM/YX2NsCOTnGJePL9rO/M+Mw3m9f2gUpfokS0hi5Eah0WSUEWZdZhIZtMjkIYS7mDfOqNHbg== } + engines: { node: ">=10" } get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== } + engines: { node: ">=10" } - get-symbol-description@1.0.0: - resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} - engines: {node: '>= 0.4'} + get-symbol-description@1.1.0: + resolution: + { integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg== } + engines: { node: ">= 0.4" } gh-pages@6.3.0: - resolution: {integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA== } + engines: { node: ">=10" } hasBin: true git-raw-commits@3.0.0: - resolution: {integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-b5OHmZ3vAgGrDn/X0kS+9qCfNKWe4K/jFnhwzVWWg0/k5eLa3060tZShrRg8Dja5kPc+YjS0Gc6y7cRr44Lpjw== } + engines: { node: ">=14" } hasBin: true git-raw-commits@4.0.0: - resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ== } + engines: { node: ">=16" } hasBin: true git-remote-origin-url@2.0.0: - resolution: {integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-eU+GGrZgccNJcsDH5LkXR3PB9M958hxc7sbA8DFJjrv9j4L2P/eZfKhM+QD6wyzpiv+b1BpK0XrYCxkovtjSLw== } + engines: { node: ">=4" } git-semver-tags@5.0.0: - resolution: {integrity: sha512-fZ+tmZ1O5aXW/T5nLzZLbxWAHdQTLLXalOECMNAmhoEQSfqZjtaeMjpsXH4C5qVhrICTkVQeQFujB1lKzIHljA==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-fZ+tmZ1O5aXW/T5nLzZLbxWAHdQTLLXalOECMNAmhoEQSfqZjtaeMjpsXH4C5qVhrICTkVQeQFujB1lKzIHljA== } + engines: { node: ">=14" } hasBin: true git-up@7.0.0: - resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==} + resolution: + { integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ== } git-url-parse@14.0.0: - resolution: {integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ==} + resolution: + { integrity: sha512-NnLweV+2A4nCvn4U/m2AoYu0pPKlsmhK9cknG7IMwsjFY1S2jxM+mAhsDxyxfCIGfGaD+dozsyX4b6vkYc83yQ== } gitconfiglocal@1.0.0: - resolution: {integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ==} + resolution: + { integrity: sha512-spLUXeTAVHxDtKsJc8FkFVgFtMdEN9qPGpL23VfSHx4fP4+Ds097IXLvymbnDH8FnmxX5Nr9bPw3A+AQ6mWEaQ== } github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + resolution: + { integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== } glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== } + engines: { node: ">= 6" } glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== } + engines: { node: ">=10.13.0" } glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + resolution: + { integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== } glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + resolution: + { integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== } hasBin: true - glob@11.0.0: - resolution: {integrity: sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==} - engines: {node: 20 || >=22} + glob@11.0.2: + resolution: + { integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ== } + engines: { node: 20 || >=22 } hasBin: true - glob@11.0.2: - resolution: {integrity: sha512-YT7U7Vye+t5fZ/QMkBFrTJ7ZQxInIUjwyAjVj84CYXqgBdv30MFUPGnBR6sQaVq6Is15wYJUsnzTuWaGRBhBAQ==} - engines: {node: 20 || >=22} + glob@11.1.0: + resolution: + { integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw== } + engines: { node: 20 || >=22 } hasBin: true + glob@13.0.0: + resolution: + { integrity: sha512-tvZgpqk6fz4BaNZ66ZsRaZnbHvP/jG3uKJvAZOwEVUL4RTA5nJeeLYfyN9/VA8NX/V3IBG+hkeuGpKjvELkVhA== } + engines: { node: 20 || >=22 } + glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + resolution: + { integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== } deprecated: Glob versions prior to v9 are no longer supported glob@9.3.5: - resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q== } + engines: { node: ">=16 || 14 >=14.17" } global-agent@3.0.0: - resolution: {integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==} - engines: {node: '>=10.0'} + resolution: + { integrity: sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q== } + engines: { node: ">=10.0" } global-directory@4.0.1: - resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q== } + engines: { node: ">=18" } - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} + globals@14.0.0: + resolution: + { integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== } + engines: { node: ">=18" } - globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} - engines: {node: '>=8'} - - globalthis@1.0.3: - resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} - engines: {node: '>= 0.4'} + globalthis@1.0.4: + resolution: + { integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ== } + engines: { node: ">= 0.4" } globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== } + engines: { node: ">=10" } gonzales-pe@4.3.0: - resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} - engines: {node: '>=0.6.0'} + resolution: + { integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ== } + engines: { node: ">=0.6.0" } hasBin: true - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + gopd@1.2.0: + resolution: + { integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg== } + engines: { node: ">= 0.4" } got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} + resolution: + { integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g== } + engines: { node: ">=10.19.0" } graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== } handlebars@4.7.7: - resolution: {integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==} - engines: {node: '>=0.4.7'} + resolution: + { integrity: sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== } + engines: { node: ">=0.4.7" } hasBin: true hard-rejection@2.1.0: - resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== } + engines: { node: ">=6" } has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + resolution: + { integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== } has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== } + engines: { node: ">=4" } has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== } + engines: { node: ">=8" } has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + resolution: + { integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg== } has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q== } + engines: { node: ">= 0.4" } + + has-proto@1.2.0: + resolution: + { integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ== } + engines: { node: ">= 0.4" } has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== } + engines: { node: ">= 0.4" } - has-tostringtag@1.0.0: - resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} - engines: {node: '>= 0.4'} + has-symbols@1.1.0: + resolution: + { integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ== } + engines: { node: ">= 0.4" } has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw== } + engines: { node: ">= 0.4" } has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - - has@1.0.3: - resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==} - engines: {node: '>= 0.4.0'} - - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ== } hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== } + engines: { node: ">= 0.4" } - helmet@8.0.0: - resolution: {integrity: sha512-VyusHLEIIO5mjQPUI1wpOAEu+wl6Q0998jzTxqUYGE45xCIcAxy3MsbEK/yyJUJ3ADeMoB6MornPH6GMWAf+Pw==} - engines: {node: '>=18.0.0'} + header-case@2.0.4: + resolution: + { integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== } + + helmet@8.1.0: + resolution: + { integrity: sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg== } + engines: { node: ">=18.0.0" } hosted-git-info@2.8.9: - resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + resolution: + { integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== } hosted-git-info@4.1.0: - resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA== } + engines: { node: ">=10" } + + hosted-git-info@8.1.0: + resolution: + { integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw== } + engines: { node: ^18.17.0 || >=20.5.0 } - hosted-git-info@7.0.2: - resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==} - engines: {node: ^16.14.0 || >=18.0.0} + hosted-git-info@9.0.2: + resolution: + { integrity: sha512-M422h7o/BR3rmCQ8UHi7cyyMqKltdP9Uo+J2fXK+RSAY+wTcKOIRyhTuKv4qn+DJf3g+PL890AzId5KZpX+CBg== } + engines: { node: ^20.17.0 || >=22.9.0 } - html-encoding-sniffer@4.0.0: - resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} - engines: {node: '>=18'} + html-encoding-sniffer@6.0.0: + resolution: + { integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } + + html-entities@2.6.0: + resolution: + { integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ== } html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + resolution: + { integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== } - html-minifier-terser@7.2.0: - resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} - engines: {node: ^14.13.1 || >=16.0.0} + html-minifier-next@4.16.4: + resolution: + { integrity: sha512-VI6GuJWfc8eBEU0Zdc/hMgth7DNOMTkoUERiEiVhI+PN//dvNn7jKpVZiJjVEjHzZ+fQORA6okD6ZDUzynzmqg== } hasBin: true + peerDependencies: + "@swc/core": ^1.15.7 + peerDependenciesMeta: + "@swc/core": + optional: true http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + resolution: + { integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== } + + http-cache-semantics@4.2.0: + resolution: + { integrity: sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ== } http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== } + engines: { node: ">= 0.8" } + + http-errors@2.0.1: + resolution: + { integrity: sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ== } + engines: { node: ">= 0.8" } http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== } + engines: { node: ">= 14" } http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} + resolution: + { integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg== } + engines: { node: ">=10.19.0" } https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} + resolution: + { integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw== } + engines: { node: ">= 14" } human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + resolution: + { integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== } + engines: { node: ">=10.17.0" } husky@9.1.7: - resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA== } + engines: { node: ">=18" } hasBin: true - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== } + engines: { node: ">=0.10.0" } + + iconv-lite@0.7.1: + resolution: + { integrity: sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw== } + engines: { node: ">=0.10.0" } ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + resolution: + { integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== } ignore-by-default@1.0.1: - resolution: {integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==} + resolution: + { integrity: sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA== } - ignore-walk@6.0.4: - resolution: {integrity: sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ignore-walk@8.0.0: + resolution: + { integrity: sha512-FCeMZT4NiRQGh+YkeKMtWrOmBgWjHjMJ26WQWrRQyoyzqevdaGSakUaJW5xQYmjLlUVk2qUnCjYVBax9EKKg8A== } + engines: { node: ^20.17.0 || >=22.9.0 } ignore@5.3.1: - resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== } + engines: { node: ">= 4" } - immutable@4.3.0: - resolution: {integrity: sha512-0AOCmOip+xgJwEVTQj1EfiDDOkPmuyllDuTuEX+DDXUgapLAsBIfkg3sxCYyCEA8mQqZrrxPUGjcOQ2JS3WLkg==} + ignore@7.0.5: + resolution: + { integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== } + engines: { node: ">= 4" } + + immutable@5.1.4: + resolution: + { integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA== } import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== } + engines: { node: ">=6" } import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== } + engines: { node: ">=8" } hasBin: true import-meta-resolve@4.0.0: - resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + resolution: + { integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA== } imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} + resolution: + { integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== } + engines: { node: ">=0.8.19" } indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - indexes-of@1.0.1: - resolution: {integrity: sha512-bup+4tap3Hympa+JBJUG7XuOsdNQ6fxt0MHyXMKuLBKn0OqsTfvUxkUrroEX1+B2VsSHvCjiIcZVxRtYa4nllA==} + resolution: + { integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== } + engines: { node: ">=8" } inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + resolution: + { integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== } deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + resolution: + { integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== } ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + resolution: + { integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== } ini@4.1.1: - resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } ini@4.1.3: - resolution: {integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - init-package-json@6.0.3: - resolution: {integrity: sha512-Zfeb5ol+H+eqJWHTaGca9BovufyGeIfr4zaaBorPmJBMrJ+KBnN+kQx2ZtXdsotUTgldHmHQV44xvUWOUA7E2w==} - engines: {node: ^16.14.0 || >=18.0.0} - - inquirer@8.2.5: - resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==} - engines: {node: '>=12.0.0'} + resolution: + { integrity: sha512-X7rqawQBvfdjS10YU1y1YVreA3SsLrW9dX2CewP2EbBJM4ypVNLDkO5y04gejPwKIY9lR+7r9gn3rFPt/kmWFg== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + ini@5.0.0: + resolution: + { integrity: sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw== } + engines: { node: ^18.17.0 || >=20.5.0 } + + ini@6.0.0: + resolution: + { integrity: sha512-IBTdIkzZNOpqm7q3dRqJvMaldXjDHWkEDfrwGEQTs5eaQMWV+djAhR+wahyNNMAa+qpbDUhBMVt4ZKNwpPm7xQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + init-package-json@8.2.2: + resolution: + { integrity: sha512-pXVMn67Jdw2hPKLCuJZj62NC9B2OIDd1R3JwZXTHXuEnfN3Uq5kJbKOSld6YEU+KOGfMD82EzxFTYz5o0SSJoA== } + engines: { node: ^20.17.0 || >=22.9.0 } + + inquirer@12.9.6: + resolution: + { integrity: sha512-603xXOgyfxhuis4nfnWaZrMaotNT0Km9XwwBNWUKbIDqeCY89jGr2F9YPEMiNhU6XjIP4VoWISMBFfcc5NgrTw== } + engines: { node: ">=18" } + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true - internal-slot@1.0.5: - resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} - engines: {node: '>= 0.4'} + internal-slot@1.1.0: + resolution: + { integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw== } + engines: { node: ">= 0.4" } interpret@3.1.1: - resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== } + engines: { node: ">=10.13.0" } + + ip-address@10.0.1: + resolution: + { integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA== } + engines: { node: ">= 12" } - ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + ip-address@10.1.0: + resolution: + { integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q== } + engines: { node: ">= 12" } ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== } + engines: { node: ">= 0.10" } - is-array-buffer@3.0.2: - resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + is-array-buffer@3.0.5: + resolution: + { integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A== } + engines: { node: ">= 0.4" } is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: + { integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== } - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-async-function@2.1.1: + resolution: + { integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ== } + engines: { node: ">= 0.4" } - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + is-bigint@1.1.0: + resolution: + { integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ== } + engines: { node: ">= 0.4" } is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== } + engines: { node: ">=8" } - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} + is-boolean-object@1.2.2: + resolution: + { integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A== } + engines: { node: ">= 0.4" } is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== } + engines: { node: ">= 0.4" } is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} + resolution: + { integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ== } hasBin: true - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ== } + engines: { node: ">= 0.4" } + + is-core-module@2.16.1: + resolution: + { integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== } + engines: { node: ">= 0.4" } - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} + is-data-view@1.0.2: + resolution: + { integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw== } + engines: { node: ">= 0.4" } + + is-date-object@1.1.0: + resolution: + { integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg== } + engines: { node: ">= 0.4" } is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== } + engines: { node: ">=8" } hasBin: true is-expression@4.0.0: - resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + resolution: + { integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A== } is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== } + engines: { node: ">=0.10.0" } + + is-finalizationregistry@1.1.1: + resolution: + { integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg== } + engines: { node: ">= 0.4" } is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== } + engines: { node: ">=8" } + + is-generator-function@1.1.0: + resolution: + { integrity: sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ== } + engines: { node: ">= 0.4" } is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== } + engines: { node: ">=0.10.0" } is-interactive@1.0.0: - resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w== } + engines: { node: ">=8" } - is-lambda@1.0.1: - resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + is-map@2.0.3: + resolution: + { integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw== } + engines: { node: ">= 0.4" } - is-negative-zero@2.0.2: - resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} - engines: {node: '>= 0.4'} + is-negative-zero@2.0.3: + resolution: + { integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw== } + engines: { node: ">= 0.4" } - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} + is-number-object@1.1.1: + resolution: + { integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw== } + engines: { node: ">= 0.4" } is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} + resolution: + { integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== } + engines: { node: ">=0.12.0" } is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== } + engines: { node: ">=0.10.0" } is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w== } + engines: { node: ">=8" } is-plain-obj@1.1.0: - resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== } + engines: { node: ">=0.10.0" } is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== } + engines: { node: ">=0.10.0" } is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + resolution: + { integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== } is-promise@2.2.2: - resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + resolution: + { integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ== } + + is-promise@4.0.0: + resolution: + { integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== } is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== } + engines: { node: ">= 0.4" } + + is-regex@1.2.1: + resolution: + { integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g== } + engines: { node: ">= 0.4" } is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== } + engines: { node: ">=0.10.0" } - is-relative-path@1.0.2: - resolution: {integrity: sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==} + is-set@2.0.3: + resolution: + { integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg== } + engines: { node: ">= 0.4" } - is-shared-array-buffer@1.0.2: - resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + is-shared-array-buffer@1.0.4: + resolution: + { integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A== } + engines: { node: ">= 0.4" } is-ssh@1.4.0: - resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==} + resolution: + { integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ== } is-stream@2.0.0: - resolution: {integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== } + engines: { node: ">=8" } is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== } + engines: { node: ">=8" } - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} + is-string@1.1.1: + resolution: + { integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA== } + engines: { node: ">= 0.4" } - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} + is-symbol@1.1.1: + resolution: + { integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w== } + engines: { node: ">= 0.4" } is-text-path@1.0.1: - resolution: {integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-xFuJpne9oFz5qDaodwmmG08e3CawH/2ZV8Qqza1Ko7Sk8POWbkRdwIoAWVhqvq0XeUzANEhKo2n0IXUGBm7A/w== } + engines: { node: ">=0.10.0" } is-text-path@2.0.0: - resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw== } + engines: { node: ">=8" } - is-typed-array@1.1.12: - resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} - engines: {node: '>= 0.4'} + is-typed-array@1.1.15: + resolution: + { integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ== } + engines: { node: ">= 0.4" } is-unicode-supported@0.1.0: - resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== } + engines: { node: ">=10" } is-url-superb@4.0.0: - resolution: {integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-GI+WjezhPPcbM+tqE9LnmsY5qqjwHzTvjJ36wxYX5ujNXefSUJ/T17r5bqDV8yLhcgB59KTPNOc9O9cmHTPWsA== } + engines: { node: ">=10" } is-url@1.2.4: - resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==} + resolution: + { integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww== } - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + is-weakmap@2.0.2: + resolution: + { integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w== } + engines: { node: ">= 0.4" } + + is-weakref@1.1.1: + resolution: + { integrity: sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew== } + engines: { node: ">= 0.4" } + + is-weakset@2.0.4: + resolution: + { integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ== } + engines: { node: ">= 0.4" } is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== } + engines: { node: ">=8" } isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + resolution: + { integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== } isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + resolution: + { integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== } isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + resolution: + { integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== } isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + resolution: + { integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== } isexe@3.1.1: - resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ== } + engines: { node: ">=16" } isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== } + engines: { node: ">=0.10.0" } istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== } + engines: { node: ">=8" } istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== } + engines: { node: ">=10" } istanbul-lib-source-maps@5.0.6: - resolution: {integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A== } + engines: { node: ">=10" } - istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} + istanbul-reports@3.2.0: + resolution: + { integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA== } + engines: { node: ">=8" } jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + resolution: + { integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== } jackspeak@4.0.1: - resolution: {integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog==} - engines: {node: 20 || >=22} + resolution: + { integrity: sha512-cub8rahkh0Q/bw1+GxP7aeSe29hHHn2V4m29nnDlvCdlgU+3UGxkZp7Z53jLUdpX3jdTO0nJZUDl3xvbWc2Xog== } + engines: { node: 20 || >=22 } + + jackspeak@4.1.1: + resolution: + { integrity: sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== } + engines: { node: 20 || >=22 } jake@10.8.7: - resolution: {integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== } + engines: { node: ">=10" } hasBin: true javascript-natural-sort@0.7.1: - resolution: {integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==} - - jest-diff@29.6.0: - resolution: {integrity: sha512-ZRm7cd2m9YyZ0N3iMyuo1iUiprxQ/MFpYWXzEEj7hjzL3WnDffKW8192XBDcrAI8j7hnrM1wed3bL/oEnYF/8w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + resolution: + { integrity: sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw== } - jest-get-type@29.4.3: - resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + jest-diff@30.2.0: + resolution: + { integrity: sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== } + engines: { node: ">= 10.13.0" } jiti@2.4.2: - resolution: {integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==} + resolution: + { integrity: sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A== } hasBin: true jju@1.4.0: - resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + resolution: + { integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA== } jmespath@0.16.0: - resolution: {integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==} - engines: {node: '>= 0.6.0'} + resolution: + { integrity: sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw== } + engines: { node: ">= 0.6.0" } jquery@3.7.1: - resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} + resolution: + { integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg== } js-stringify@1.0.2: - resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + resolution: + { integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g== } js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + resolution: + { integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== } js-tokens@9.0.1: - resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==} + resolution: + { integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ== } js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + resolution: + { integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== } hasBin: true js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + resolution: + { integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== } hasBin: true - jsdoc-type-pratt-parser@4.0.0: - resolution: {integrity: sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==} - engines: {node: '>=12.0.0'} + js-yaml@4.1.1: + resolution: + { integrity: sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA== } + hasBin: true - jsdoc-type-pratt-parser@4.1.0: - resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==} - engines: {node: '>=12.0.0'} + jsdoc-type-pratt-parser@6.10.0: + resolution: + { integrity: sha512-+LexoTRyYui5iOhJGn13N9ZazL23nAHGkXsa1p/C8yeq79WRfLBag6ZZ0FQG2aRoc9yfo59JT9EYCQonOkHKkQ== } + engines: { node: ">=20.0.0" } jsdom-global@3.0.2: - resolution: {integrity: sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg==} + resolution: + { integrity: sha512-t1KMcBkz/pT5JrvcJbpUR2u/w1kO9jXctaaGJ0vZDzwFnIvGWw9IDSRciT83kIs8Bnw4qpOl8bQK08V01YgMPg== } peerDependencies: - jsdom: '>=10.0.0' + jsdom: ">=10.0.0" - jsdom@26.1.0: - resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==} - engines: {node: '>=18'} + jsdom@27.4.0: + resolution: + { integrity: sha512-mjzqwWRD9Y1J1KUi7W97Gja1bwOOM5Ug0EZ6UDK3xS7j7mndrkwozHtSblfomlzyB4NepioNt+B2sOSzczVgtQ== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } peerDependencies: canvas: ^3.0.0 peerDependenciesMeta: canvas: optional: true - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== } + engines: { node: ">=6" } hasBin: true json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + resolution: + { integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== } json-parse-better-errors@1.0.2: - resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} + resolution: + { integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== } json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + resolution: + { integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== } + + json-parse-even-better-errors@4.0.0: + resolution: + { integrity: sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA== } + engines: { node: ^18.17.0 || >=20.5.0 } - json-parse-even-better-errors@3.0.2: - resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + json-parse-even-better-errors@5.0.0: + resolution: + { integrity: sha512-ZF1nxZ28VhQouRWhUcVlUIN3qwSgPuswK05s/HIaoetAoE/9tngVmCHjSxmSQPav1nd+lPtTL0YZ/2AFdR/iYQ== } + engines: { node: ^20.17.0 || >=22.9.0 } json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + resolution: + { integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== } json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + resolution: + { integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== } json-source-map@0.6.1: - resolution: {integrity: sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==} + resolution: + { integrity: sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg== } json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + resolution: + { integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== } json-stringify-nice@1.1.4: - resolution: {integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw==} + resolution: + { integrity: sha512-5Z5RFW63yxReJ7vANgW6eZFGWaQvnPE3WNmZoOJrSkGju2etKA2L5rrOa1sm877TVTFt57A80BH1bArcmlLfPw== } json-stringify-safe@5.0.1: - resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + resolution: + { integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== } json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + resolution: + { integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== } hasBin: true json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== } + engines: { node: ">=6" } hasBin: true jsonc-parser@3.2.0: - resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + resolution: + { integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== } - jsoneditor@10.0.0: - resolution: {integrity: sha512-yh/kj/Ecxacj7ZG2ynmJvHcESgdHiAe1N7iKUVIYFpeP4/rwp87yua2y0BDayyY6uJz01KgRvdl4W1Wt94EkOQ==} + jsoneditor@10.4.2: + resolution: + { integrity: sha512-SQPCXlanU4PqdVsYuj2X7yfbLiiJYjklbksGfMKPsuwLhAIPxDlG43jYfXieGXvxpuq1fkw08YoRbkKXKabcLA== } jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + resolution: + { integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg== } jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + resolution: + { integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== } jsonparse@1.3.1: - resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} - engines: {'0': node >= 0.2.0} + resolution: + { integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== } + engines: { "0": node >= 0.2.0 } - jsonrepair@3.5.0: - resolution: {integrity: sha512-SavvDsUP9Xnqo2MoC6Wl6zNyX3f+I5199hRbXBtAITyP2NTPyAgyx5xM0bgcIljRjzsIvOBANbgfWe8XXlyeLA==} + jsonrepair@3.13.1: + resolution: + { integrity: sha512-WJeiE0jGfxYmtLwBTEk8+y/mYcaleyLXWaqp5bJu0/ZTSeG0KQq/wWQ8pmnkKenEdN6pdnn6QtcoSUkbqDHWNw== } hasBin: true jstransformer@1.0.0: - resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + resolution: + { integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A== } just-diff-apply@5.5.0: - resolution: {integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw==} + resolution: + { integrity: sha512-OYTthRfSh55WOItVqwpefPtNt2VdKsq5AnAK6apdtR6yCH8pr0CmSr710J0Mf+WdQy7K/OzMy7K2MgAfdQURDw== } just-diff@6.0.2: - resolution: {integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA==} + resolution: + { integrity: sha512-S59eriX5u3/QhMNq3v/gm8Kd0w8OS6Tz2FS1NG4blv+z0MuQcBRJyFWjdovM0Rad4/P4aUPFtnkNjMjyMlMSYA== } - keyv@4.5.2: - resolution: {integrity: sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==} + keyv@4.5.4: + resolution: + { integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== } kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== } + engines: { node: ">=0.10.0" } klaw@4.1.0: - resolution: {integrity: sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw==} - engines: {node: '>=14.14.0'} + resolution: + { integrity: sha512-1zGZ9MF9H22UnkpVeuaGKOjfA2t6WrfdrJmGjy16ykcjnKQDmHVX+KI477rpbGevz/5FD4MC3xf1oxylBgcaQw== } + engines: { node: ">=14.14.0" } kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== } + engines: { node: ">=6" } kuler@2.0.0: - resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + resolution: + { integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== } - lerna@8.2.3: - resolution: {integrity: sha512-rmuDU+92eWUnnyaPg3Ise339pTxF+r2hu8ky/soCfbGpUoW4kCwsDza3P/LtQJWrKwZWHcosEitfYvxGUWZ16A==} - engines: {node: '>=18.0.0'} + lerna@9.0.3: + resolution: + { integrity: sha512-wCsJWKX8FaGJoWX2K5gL5q7ReqQNxNsS92AW5glBe/JzWEtoM/jgXXGrEzQzORMb8rTXYFjUjpn60et+i8XugA== } + engines: { node: ^20.19.0 || ^22.12.0 || >=24.0.0 } hasBin: true levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - libnpmaccess@8.0.6: - resolution: {integrity: sha512-uM8DHDEfYG6G5gVivVl+yQd4pH3uRclHC59lzIbSvy7b5FEwR+mU49Zq1jEyRtRFv7+M99mUW9S0wL/4laT4lw==} - engines: {node: ^16.14.0 || >=18.0.0} - - libnpmpublish@9.0.9: - resolution: {integrity: sha512-26zzwoBNAvX9AWOPiqqF6FG4HrSCPsHFkQm7nT+xU1ggAujL/eae81RnCv4CJ2In9q9fh10B88sYSzKCUh/Ghg==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== } + engines: { node: ">= 0.8.0" } + + libnpmaccess@10.0.3: + resolution: + { integrity: sha512-JPHTfWJxIK+NVPdNMNGnkz4XGX56iijPbe0qFWbdt68HL+kIvSzh+euBL8npLZvl2fpaxo+1eZSdoG15f5YdIQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + libnpmpublish@11.1.2: + resolution: + { integrity: sha512-tNcU3cLH7toloAzhOOrBDhjzgbxpyuYvkf+BPPnnJCdc5EIcdJ8JcT+SglvCQKKyZ6m9dVXtCVlJcA6csxKdEA== } + engines: { node: ^20.17.0 || >=22.9.0 } + + lightningcss-android-arm64@1.30.2: + resolution: + { integrity: sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A== } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [android] lightningcss-darwin-arm64@1.28.1: - resolution: {integrity: sha512-VG3vvzM0m/rguCdm76DdobNeNJnHK+jWcdkNLFWHLh9YCotRvbRIt45JxwcHlIF8TDqWStVLTdghq5NaigVCBQ==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-VG3vvzM0m/rguCdm76DdobNeNJnHK+jWcdkNLFWHLh9YCotRvbRIt45JxwcHlIF8TDqWStVLTdghq5NaigVCBQ== } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-arm64@1.30.2: + resolution: + { integrity: sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA== } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [darwin] lightningcss-darwin-x64@1.28.1: - resolution: {integrity: sha512-O7ORdislvKfMohFl4Iq7fxKqdJOuuxArcglVI3amuFO5DJ0wfV3Gxgi1JRo49slfr7OVzJQEHLG4muTWYM5cTQ==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-O7ORdislvKfMohFl4Iq7fxKqdJOuuxArcglVI3amuFO5DJ0wfV3Gxgi1JRo49slfr7OVzJQEHLG4muTWYM5cTQ== } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [darwin] + + lightningcss-darwin-x64@1.30.2: + resolution: + { integrity: sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ== } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [darwin] lightningcss-freebsd-x64@1.28.1: - resolution: {integrity: sha512-b7sF89B31kYYijxVcFO7l5u6UNA862YstNu+3YbLl/IQKzveL4a5cwR5cdpG+OOhErg/c2u9WCmzZoX2I5GBvw==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-b7sF89B31kYYijxVcFO7l5u6UNA862YstNu+3YbLl/IQKzveL4a5cwR5cdpG+OOhErg/c2u9WCmzZoX2I5GBvw== } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [freebsd] + + lightningcss-freebsd-x64@1.30.2: + resolution: + { integrity: sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA== } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [freebsd] lightningcss-linux-arm-gnueabihf@1.28.1: - resolution: {integrity: sha512-p61kXwvhUDLLzkWHjzSFfUBW/F0iy3jr3CWi3k8SKULtJEsJXTI9DqRm9EixxMSe2AMBQBt4auTYiQL4B1N51A==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-p61kXwvhUDLLzkWHjzSFfUBW/F0iy3jr3CWi3k8SKULtJEsJXTI9DqRm9EixxMSe2AMBQBt4auTYiQL4B1N51A== } + engines: { node: ">= 12.0.0" } + cpu: [arm] + os: [linux] + + lightningcss-linux-arm-gnueabihf@1.30.2: + resolution: + { integrity: sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA== } + engines: { node: ">= 12.0.0" } cpu: [arm] os: [linux] lightningcss-linux-arm64-gnu@1.28.1: - resolution: {integrity: sha512-iO+fN9hOMmzfwqcG2/BgUtMKD48H2JO/SXU44fyIwpY2veb65QF5xiRrQ9l1FwIxbGK3231KBYCtAqv+xf+NsQ==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-iO+fN9hOMmzfwqcG2/BgUtMKD48H2JO/SXU44fyIwpY2veb65QF5xiRrQ9l1FwIxbGK3231KBYCtAqv+xf+NsQ== } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-gnu@1.30.2: + resolution: + { integrity: sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A== } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] lightningcss-linux-arm64-musl@1.28.1: - resolution: {integrity: sha512-dnMHeXEmCUzHHZjaDpQBYuBKcN9nPC3nPFKl70bcj5Bkn5EmkcgEqm5p035LKOgvAwk1XwLpQCML6pXmCwz0NQ==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-dnMHeXEmCUzHHZjaDpQBYuBKcN9nPC3nPFKl70bcj5Bkn5EmkcgEqm5p035LKOgvAwk1XwLpQCML6pXmCwz0NQ== } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.2: + resolution: + { integrity: sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA== } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [linux] lightningcss-linux-x64-gnu@1.28.1: - resolution: {integrity: sha512-7vWDISaMUn+oo2TwRdf2hl/BLdPxvywv9JKEqNZB/0K7bXwV4XE9wN/C2sAp1gGuh6QBA8lpjF4JIPt3HNlCHA==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-7vWDISaMUn+oo2TwRdf2hl/BLdPxvywv9JKEqNZB/0K7bXwV4XE9wN/C2sAp1gGuh6QBA8lpjF4JIPt3HNlCHA== } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.2: + resolution: + { integrity: sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w== } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] lightningcss-linux-x64-musl@1.28.1: - resolution: {integrity: sha512-IHCu9tVGP+x5BCpA2rF3D04DBokcBza/a8AuHQU+1AiMKubuMegPwcL7RatBgK4ztFHeYnnD5NdhwhRfYMAtNA==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-IHCu9tVGP+x5BCpA2rF3D04DBokcBza/a8AuHQU+1AiMKubuMegPwcL7RatBgK4ztFHeYnnD5NdhwhRfYMAtNA== } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.2: + resolution: + { integrity: sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA== } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [linux] lightningcss-win32-arm64-msvc@1.28.1: - resolution: {integrity: sha512-Erm72kHmMg/3h350PTseskz+eEGBM17Fuu79WW2Qqt0BfWSF1jHHc12lkJCWMYl5jcBHPs5yZdgNHtJ7IJS3Uw==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-Erm72kHmMg/3h350PTseskz+eEGBM17Fuu79WW2Qqt0BfWSF1jHHc12lkJCWMYl5jcBHPs5yZdgNHtJ7IJS3Uw== } + engines: { node: ">= 12.0.0" } + cpu: [arm64] + os: [win32] + + lightningcss-win32-arm64-msvc@1.30.2: + resolution: + { integrity: sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ== } + engines: { node: ">= 12.0.0" } cpu: [arm64] os: [win32] lightningcss-win32-x64-msvc@1.28.1: - resolution: {integrity: sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-ZPQtvx+uQBzrSdHH8p4H3M9Alue+x369TPZAA3b4K3d92FPhpZCuBG04+HQzspam9sVeID9mI6f3VRAs2ezaEA== } + engines: { node: ">= 12.0.0" } + cpu: [x64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.2: + resolution: + { integrity: sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw== } + engines: { node: ">= 12.0.0" } cpu: [x64] os: [win32] lightningcss@1.28.1: - resolution: {integrity: sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ==} - engines: {node: '>= 12.0.0'} + resolution: + { integrity: sha512-KRDkHlLlNj3DWh79CDt93fPlRJh2W1AuHV0ZSZAMMuN7lqlsZTV5842idfS1urWG8q9tc17velp1gCXhY7sLnQ== } + engines: { node: ">= 12.0.0" } + + lightningcss@1.30.2: + resolution: + { integrity: sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ== } + engines: { node: ">= 12.0.0" } lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + resolution: + { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== } lines-and-columns@2.0.3: - resolution: {integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-cNOjgCnLB+FnvWWtyRTzmB3POJ+cXxTA81LoW7u8JdmhfXzriropYwpjShnz1QLLWsQwY7nIxoDmcPTwphDK9w== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } linkify-it@5.0.0: - resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + resolution: + { integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== } - livereload-js@3.4.1: - resolution: {integrity: sha512-5MP0uUeVCec89ZbNOT/i97Mc+q3SxXmiUGhRFOTmhrGPn//uWVQdCvcLJDy64MSBR5MidFdOR7B9viumoavy6g==} + livereload-js@4.0.2: + resolution: + { integrity: sha512-Fy7VwgQNiOkynYyNBTo3v9hQUhcW5pFAheJN148+DTgpShjsy/22pLHKKwDK5v0kOsZsJBK+6q1PMgLvRmrwFQ== } - livereload@0.9.3: - resolution: {integrity: sha512-q7Z71n3i4X0R9xthAryBdNGVGAO2R5X+/xXpmKeuPMrteg+W2U8VusTKV3YiJbXZwKsOlFlHe+go6uSNjfxrZw==} - engines: {node: '>=8.0.0'} + livereload@0.10.3: + resolution: + { integrity: sha512-llSb8HrtSH7ByPFMc8WTTeW3oy++smwgSA8JVGzEn8KiDPESq6jt1M4ZKKkhKTrhn2wvUOadQq4ip10E5daZ3w== } + engines: { node: ">=8.0.0" } hasBin: true load-json-file@4.0.0: - resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw== } + engines: { node: ">=4" } load-json-file@6.2.0: - resolution: {integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-gUD/epcRms75Cw8RT1pUdHugZYM5ce64ucs2GEISABwkRsOQr0q2wm/MV2TKThycIe5e0ytRweW2RZxclogCdQ== } + engines: { node: ">=8" } - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} + loader-runner@4.3.1: + resolution: + { integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q== } + engines: { node: ">=6.11.5" } locate-path@2.0.0: - resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA== } + engines: { node: ">=4" } locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== } + engines: { node: ">=8" } locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== } + engines: { node: ">=10" } locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } + + locate-path@8.0.0: + resolution: + { integrity: sha512-XT9ewWAC43tiAV7xDAPflMkG0qOPn2QjHqlgX8FOqmWa/rxnyYDulF9T0F7tRy1u+TVTmK/M//6VIOye+2zDXg== } + engines: { node: ">=20" } lodash.camelcase@4.3.0: - resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + resolution: + { integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== } lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + resolution: + { integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== } lodash.ismatch@4.4.0: - resolution: {integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g==} + resolution: + { integrity: sha512-fPMfXjGQEV9Xsq/8MTSgUf255gawYRbjwMyDbcvDhXgV7enSZA0hynz6vMPnpAb5iONEzBHBPsT+0zes5Z301g== } lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + resolution: + { integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== } lodash.kebabcase@4.1.1: - resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + resolution: + { integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g== } lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + resolution: + { integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== } lodash.mergewith@4.6.2: - resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==} + resolution: + { integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ== } lodash.snakecase@4.1.1: - resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==} + resolution: + { integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw== } lodash.startcase@4.4.0: - resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + resolution: + { integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg== } lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + resolution: + { integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== } lodash.upperfirst@4.3.1: - resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} + resolution: + { integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg== } lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + resolution: + { integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== } log-symbols@4.1.0: - resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} - engines: {node: '>=10'} - - logform@2.5.1: - resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} - - lookpath@1.2.2: - resolution: {integrity: sha512-k2Gmn8iV6qdME3ztZC2spubmQISimFOPLuQKiPaLcVdRz0IpdxrNClVepMlyTJlhodm/zG/VfbkWERm3kUIh+Q==} - engines: {npm: '>=6.13.4'} + resolution: + { integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== } + engines: { node: ">=10" } + + logform@2.7.0: + resolution: + { integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ== } + engines: { node: ">= 12.0.0" } + + lookpath@1.2.3: + resolution: + { integrity: sha512-kthRVhf4kH4+HW3anM4UBHxsw/XFESf13euCEldhXr6GpBdmBoa7rDd7WO5G0Mhd4G5XtKTcEy8OR0iRZXpS3Q== } + engines: { npm: ">=6.13.4" } hasBin: true - loupe@3.1.3: - resolution: {integrity: sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==} - - loupe@3.2.0: - resolution: {integrity: sha512-2NCfZcT5VGVNX9mSZIxLRkEAegDGBpuQZBy13desuHeVORmBDyAET4TkJr4SjqQy3A8JDofMN6LpkK8Xcm/dlw==} - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + resolution: + { integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== } lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== } + engines: { node: ">=8" } lru-cache@10.2.2: - resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} - engines: {node: 14 || >=16.14} + resolution: + { integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ== } + engines: { node: 14 || >=16.14 } lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + resolution: + { integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== } lru-cache@11.0.0: - resolution: {integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA==} - engines: {node: 20 || >=22} + resolution: + { integrity: sha512-Qv32eSV1RSCfhY3fpPE2GNZ8jgM9X7rdAfemLWqTUxwiyIC4jJ6Sy0fZ8H+oLWevO6i4/bizg7c8d8i6bxrzbA== } + engines: { node: 20 || >=22 } + + lru-cache@11.2.4: + resolution: + { integrity: sha512-B5Y16Jr9LB9dHVkh6ZevG+vAbOsNOYCX+sXvFWFu7B3Iz5mijW3zdbMyhsh8ANd2mSWBYdJgnqi+mL7/LrOPYg== } + engines: { node: 20 || >=22 } lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + resolution: + { integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== } lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== } + engines: { node: ">=10" } lunr@2.3.9: - resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} - - luxon@3.5.0: - resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== } - madge@6.1.0: - resolution: {integrity: sha512-irWhT5RpFOc6lkzGHKLihonCVgM0YtfNUh4IrFeW3EqHpnt/JHUG3z26j8PeJEktCGB4tmGOOOJi1Rl/ACWucQ==} - engines: {node: '>=14'} - hasBin: true - peerDependencies: - typescript: ^3.9.5 || ^4.9.5 || ^5 - peerDependenciesMeta: - typescript: - optional: true + luxon@3.7.2: + resolution: + { integrity: sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew== } + engines: { node: ">=12" } madge@8.0.0: - resolution: {integrity: sha512-9sSsi3TBPhmkTCIpVQF0SPiChj1L7Rq9kU2KDG1o6v2XH9cCw086MopjVCD+vuoL5v8S77DTbVopTO8OUiQpIw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-9sSsi3TBPhmkTCIpVQF0SPiChj1L7Rq9kU2KDG1o6v2XH9cCw086MopjVCD+vuoL5v8S77DTbVopTO8OUiQpIw== } + engines: { node: ">=18" } hasBin: true peerDependencies: typescript: ^5.4.4 @@ -6633,1597 +7946,1969 @@ packages: optional: true magic-string@0.30.17: - resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + resolution: + { integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA== } + + magic-string@0.30.21: + resolution: + { integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== } - magicast@0.3.5: - resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==} + magicast@0.5.1: + resolution: + { integrity: sha512-xrHS24IxaLrvuo613F719wvOIv9xPHFWQHuvGUBmPnCA/3MQxKI3b+r7n1jAoDHmsbC5bRhTZYR77invLAxVnw== } make-dir@2.1.0: - resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA== } + engines: { node: ">=6" } make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== } + engines: { node: ">=8" } make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== } + engines: { node: ">=10" } make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + resolution: + { integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== } - make-fetch-happen@13.0.1: - resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} - engines: {node: ^16.14.0 || >=18.0.0} + make-fetch-happen@14.0.3: + resolution: + { integrity: sha512-QMjGbFTP0blj97EeidG5hk/QhKQ3T4ICckQGLgz38QF7Vgbk6e6FTARN8KhKxyBbWn8R0HU+bnw8aSoFPD4qtQ== } + engines: { node: ^18.17.0 || >=20.5.0 } + + make-fetch-happen@15.0.2: + resolution: + { integrity: sha512-sI1NY4lWlXBAfjmCtVWIIpBypbBdhHtcjnwnv+gtCnsaOffyFil3aidszGC8hgzJe+fT1qix05sWxmD/Bmf/oQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + make-fetch-happen@15.0.3: + resolution: + { integrity: sha512-iyyEpDty1mwW3dGlYXAJqC/azFn5PPvgKVwXayOGBSmKLxhKZ9fg4qIan2ePpp1vJIwfFiO34LAPZgq9SZW9Aw== } + engines: { node: ^20.17.0 || >=22.9.0 } map-obj@1.0.1: - resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== } + engines: { node: ">=0.10.0" } map-obj@4.3.0: - resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== } + engines: { node: ">=8" } markdown-it@14.1.0: - resolution: {integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==} + resolution: + { integrity: sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg== } hasBin: true matcher@3.0.0: - resolution: {integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng== } + engines: { node: ">=10" } + + math-intrinsics@1.1.0: + resolution: + { integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g== } + engines: { node: ">= 0.4" } + + mdn-data@2.12.2: + resolution: + { integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== } mdurl@2.0.0: - resolution: {integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==} + resolution: + { integrity: sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== } - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} + media-typer@1.1.0: + resolution: + { integrity: sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw== } + engines: { node: ">= 0.8" } meow@12.1.1: - resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==} - engines: {node: '>=16.10'} + resolution: + { integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw== } + engines: { node: ">=16.10" } meow@8.1.2: - resolution: {integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== } + engines: { node: ">=10" } - merge-descriptors@1.0.3: - resolution: {integrity: sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==} + merge-descriptors@2.0.0: + resolution: + { integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g== } + engines: { node: ">=18" } merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + resolution: + { integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== } merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== } + engines: { node: ">= 8" } micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== } + engines: { node: ">=8.6" } mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== } + engines: { node: ">= 0.6" } + + mime-db@1.54.0: + resolution: + { integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ== } + engines: { node: ">= 0.6" } mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== } + engines: { node: ">= 0.6" } - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true + mime-types@3.0.2: + resolution: + { integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A== } + engines: { node: ">=18" } mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== } + engines: { node: ">=6" } mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== } + engines: { node: ">=4" } mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== } + engines: { node: ">=10" } min-indent@1.0.1: - resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} - engines: {node: '>=4'} - - minify@13.0.0: - resolution: {integrity: sha512-a8l1p6RWDDHjH9kAaSAapu2m20ozhJ+sfkY9GljvDVXDRSDQME+5zZPbooOC8e17ej95y5k8q47NfN/ceCkLqg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== } + engines: { node: ">=4" } + + minify@15.0.0: + resolution: + { integrity: sha512-Ultmui0hTYhp/zKOsDhFUfCi7+PuSEz3Jd7ER2Oh1IW2U5WIAp16SXqdIGS6VAmFKMoDD6/oC3Sp0kckU9iQUA== } + engines: { node: ">=22" } hasBin: true minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} + resolution: + { integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== } + engines: { node: 20 || >=22 } + + minimatch@10.1.1: + resolution: + { integrity: sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== } + engines: { node: 20 || >=22 } minimatch@3.0.5: - resolution: {integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==} + resolution: + { integrity: sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw== } minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + resolution: + { integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== } minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== } + engines: { node: ">=10" } minimatch@8.0.4: - resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA== } + engines: { node: ">=16 || 14 >=14.17" } minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== } + engines: { node: ">=16 || 14 >=14.17" } minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow== } + engines: { node: ">=16 || 14 >=14.17" } minimist-options@4.1.0: - resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== } + engines: { node: ">= 6" } minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + resolution: + { integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== } minipass-collect@2.0.1: - resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw== } + engines: { node: ">=16 || 14 >=14.17" } + + minipass-fetch@4.0.1: + resolution: + { integrity: sha512-j7U11C5HXigVuutxebFadoYBbd7VSdZWggSe64NVdvWNBqGAiXPL2QVCehjmw7lY1oF9gOllYbORh+hiNgfPgQ== } + engines: { node: ^18.17.0 || >=20.5.0 } - minipass-fetch@3.0.3: - resolution: {integrity: sha512-n5ITsTkDqYkYJZjcRWzZt9qnZKCT7nKCosJhHoj7S7zD+BP4jVbWs+odsniw5TA3E0sLomhTKOKjF86wf11PuQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + minipass-fetch@5.0.0: + resolution: + { integrity: sha512-fiCdUALipqgPWrOVTz9fw0XhcazULXOSU6ie40DDbX1F49p1dBrSRBuswndTx1x3vEb/g0FT7vC4c4C2u/mh3A== } + engines: { node: ^20.17.0 || >=22.9.0 } minipass-flush@1.0.5: - resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw== } + engines: { node: ">= 8" } minipass-pipeline@1.2.4: - resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A== } + engines: { node: ">=8" } minipass-sized@1.0.3: - resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g== } + engines: { node: ">=8" } minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw== } + engines: { node: ">=8" } minipass@4.2.8: - resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ== } + engines: { node: ">=8" } minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== } + engines: { node: ">=8" } minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== } + engines: { node: ">=16 || 14 >=14.17" } minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== } + engines: { node: ">= 8" } + + minizlib@3.1.0: + resolution: + { integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw== } + engines: { node: ">= 18" } mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + resolution: + { integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== } mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== } + engines: { node: ">=10" } hasBin: true - mobius1-selectr@2.4.13: - resolution: {integrity: sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==} - modify-values@1.0.1: - resolution: {integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==} - engines: {node: '>=0.10.0'} - - module-definition@3.4.0: - resolution: {integrity: sha512-XxJ88R1v458pifaSkPNLUTdSPNVGMP2SXVncVmApGO+gAfrLANiYe6JofymCzVceGOMwQE2xogxBSc8uB7XegA==} - engines: {node: '>=6.0'} - hasBin: true - - module-definition@4.1.0: - resolution: {integrity: sha512-rHXi/DpMcD2qcKbPCTklDbX9lBKJrUSl971TW5l6nMpqKCIlzJqmQ8cfEF5M923h2OOLHPDVlh5pJxNyV+AJlw==} - engines: {node: '>=12'} - hasBin: true + resolution: + { integrity: sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== } + engines: { node: ">=0.10.0" } module-definition@6.0.0: - resolution: {integrity: sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w==} - engines: {node: '>=18'} - hasBin: true - - module-lookup-amd@7.0.1: - resolution: {integrity: sha512-w9mCNlj0S8qviuHzpakaLVc+/7q50jl9a/kmJ/n8bmXQZgDPkQHnPBb8MUOYh3WpAYkXuNc2c+khsozhIp/amQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-sEGP5nKEXU7fGSZUML/coJbrO+yQtxcppDAYWRE9ovWsTbFoUHB2qDUx564WUzDaBHXsD46JBbIK5WVTwCyu3w== } + engines: { node: ">=18" } hasBin: true module-lookup-amd@9.0.2: - resolution: {integrity: sha512-p7PzSVEWiW9fHRX9oM+V4aV5B2nCVddVNv4DZ/JB6t9GsXY4E+ZVhPpnwUX7bbJyGeeVZqhS8q/JZ/H77IqPFA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-p7PzSVEWiW9fHRX9oM+V4aV5B2nCVddVNv4DZ/JB6t9GsXY4E+ZVhPpnwUX7bbJyGeeVZqhS8q/JZ/H77IqPFA== } + engines: { node: ">=18" } hasBin: true montag@1.2.1: - resolution: {integrity: sha512-YFuR6t5KhDlmAnUmVSxGzNcpWqSDqxbd95tvnEnn7X9yFv7g3kDFoRjwyGayVdF/NNoWk7YW7IxUjilnGnoC5Q==} + resolution: + { integrity: sha512-YFuR6t5KhDlmAnUmVSxGzNcpWqSDqxbd95tvnEnn7X9yFv7g3kDFoRjwyGayVdF/NNoWk7YW7IxUjilnGnoC5Q== } mrmime@1.0.1: - resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== } + engines: { node: ">=10" } mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + resolution: + { integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw== } + engines: { node: ">=10" } ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + resolution: + { integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== } ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + resolution: + { integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== } multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA== } + engines: { node: ">=10" } - mute-stream@0.0.8: - resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - - mute-stream@1.0.0: - resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mute-stream@2.0.0: + resolution: + { integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== } + engines: { node: ^18.17.0 || >=20.5.0 } nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + resolution: + { integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== } + engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true napi-build-utils@2.0.0: - resolution: {integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==} + resolution: + { integrity: sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA== } natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== } - negotiator@0.6.4: - resolution: {integrity: sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==} - engines: {node: '>= 0.6'} + negotiator@1.0.0: + resolution: + { integrity: sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg== } + engines: { node: ">= 0.6" } neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + resolution: + { integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== } no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + resolution: + { integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== } node-abi@3.74.0: - resolution: {integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-c5XK0MjkGBrQPGYG24GBADZud0NCbznxNx0ZkS+ebUTrmV1qTDxPxSL8zEAPURXSbLRWVexxmP4986BziahL5w== } + engines: { node: ">=10" } node-addon-api@7.1.1: - resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} - - node-fetch@2.6.12: - resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true + resolution: + { integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ== } - node-fetch@2.6.7: - resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} - engines: {node: 4.x || >=6.0.0} + node-fetch@2.7.0: + resolution: + { integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== } + engines: { node: 4.x || >=6.0.0 } peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: encoding: optional: true - node-gyp@10.0.1: - resolution: {integrity: sha512-gg3/bHehQfZivQVfqIyy8wTdSymF9yTyP4CJifK73imyNMU8AIGQE2pUa7dNWfmMeG9cDVF2eehiRMv0LC1iAg==} - engines: {node: ^16.14.0 || >=18.0.0} + node-gyp@11.5.0: + resolution: + { integrity: sha512-ra7Kvlhxn5V9Slyus0ygMa2h+UqExPqUIkfk7Pc8QTLT956JLSy51uWFwHtIYy0vI8cB4BDhc/S03+880My/LQ== } + engines: { node: ^18.17.0 || >=20.5.0 } hasBin: true node-machine-id@1.1.12: - resolution: {integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==} + resolution: + { integrity: sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ== } - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - node-source-walk@4.3.0: - resolution: {integrity: sha512-8Q1hXew6ETzqKRAs3jjLioSxNfT1cx74ooiF8RlAONwVMcfq+UdzLC2eB5qcPldUxaE5w3ytLkrmV1TGddhZTA==} - engines: {node: '>=6.0'} - - node-source-walk@5.0.2: - resolution: {integrity: sha512-Y4jr/8SRS5hzEdZ7SGuvZGwfORvNsSsNRwDXx5WisiqzsVfeftDvRgfeqWNgZvWSJbgubTRVRYBzK6UO+ErqjA==} - engines: {node: '>=12'} + node-releases@2.0.27: + resolution: + { integrity: sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA== } node-source-walk@7.0.0: - resolution: {integrity: sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw==} - engines: {node: '>=18'} - - nodemon@3.0.1: - resolution: {integrity: sha512-g9AZ7HmkhQkqXkRc20w+ZfQ73cHLbE8hnPbtaFbFtCumZsjyMhKk9LajQ07U5Ux28lvFjZ5X7HvWR1xzU8jHVw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-1uiY543L+N7Og4yswvlm5NCKgPKDEXd9AUR9Jh3gen6oOeBsesr6LqhXom1er3eRzSUcVRWXzhv8tSNrIfGHKw== } + engines: { node: ">=18" } + + nodemon@3.1.11: + resolution: + { integrity: sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g== } + engines: { node: ">=10" } hasBin: true noms@0.0.0: - resolution: {integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow==} + resolution: + { integrity: sha512-lNDU9VJaOPxUmXcLb+HQFeUgQQPtMI24Gt6hgfuMHRJgMRHMF/qZ4HJD3GDru4sSw9IQl2jPjAYnQrdIeLbwow== } nopt@1.0.10: - resolution: {integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==} + resolution: + { integrity: sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg== } hasBin: true - nopt@7.2.1: - resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + nopt@8.1.0: + resolution: + { integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A== } + engines: { node: ^18.17.0 || >=20.5.0 } hasBin: true normalize-package-data@2.5.0: - resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + resolution: + { integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA== } normalize-package-data@3.0.3: - resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} - engines: {node: '>=10'} - - normalize-package-data@6.0.2: - resolution: {integrity: sha512-V6gygoYb/5EmNI+MEGrWkC+e6+Rr7mTmfHrxDbLzxQogBkgzo76rkok0Am6thgSF7Mv2nLOajAJj5vDJZEFn7g==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== } + engines: { node: ">=10" } normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== } + engines: { node: ">=0.10.0" } normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - - npm-bundled@3.0.0: - resolution: {integrity: sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-install-checks@6.3.0: - resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-normalize-package-bin@3.0.1: - resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-package-arg@11.0.2: - resolution: {integrity: sha512-IGN0IAwmhDJwy13Wc8k+4PEbTPhpJnMtfR53ZbOyjkvmEcLS4nCwp6mvMWjS5sUjeiW3mpx6cHmuhKEu9XmcQw==} - engines: {node: ^16.14.0 || >=18.0.0} - - npm-packlist@8.0.2: - resolution: {integrity: sha512-shYrPFIS/JLP4oQmAwDyk5HcyysKW8/JLTEA32S0Z5TzvpaeeX2yMFfoK1fjEBnCBvVyIB/Jj/GBFdm0wsgzbA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - npm-pick-manifest@9.0.1: - resolution: {integrity: sha512-Udm1f0l2nXb3wxDpKjfohwgdFUSV50UVwzEIpDXVsbDMXVIEF81a/i0UhuQbhrPMMmdiq3+YMFLFIRVLs3hxQw==} - engines: {node: ^16.14.0 || >=18.0.0} - - npm-registry-fetch@17.1.0: - resolution: {integrity: sha512-5+bKQRH0J1xG1uZ1zMNvxW0VEyoNWgJpY9UDuluPFLKDfJ9u2JmmjmTJV1srBGQOROfdBMiVvnH2Zvpbm+xkVA==} - engines: {node: ^16.14.0 || >=18.0.0} + resolution: + { integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== } + engines: { node: ">=10" } + + npm-bundled@4.0.0: + resolution: + { integrity: sha512-IxaQZDMsqfQ2Lz37VvyyEtKLe8FsRZuysmedy/N06TU1RyVppYKXrO4xIhR0F+7ubIBox6Q7nir6fQI3ej39iA== } + engines: { node: ^18.17.0 || >=20.5.0 } + + npm-bundled@5.0.0: + resolution: + { integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw== } + engines: { node: ^20.17.0 || >=22.9.0 } + + npm-install-checks@7.1.2: + resolution: + { integrity: sha512-z9HJBCYw9Zr8BqXcllKIs5nI+QggAImbBdHphOzVYrz2CB4iQ6FzWyKmlqDZua+51nAu7FcemlbTc9VgQN5XDQ== } + engines: { node: ^18.17.0 || >=20.5.0 } + + npm-install-checks@8.0.0: + resolution: + { integrity: sha512-ScAUdMpyzkbpxoNekQ3tNRdFI8SJ86wgKZSQZdUxT+bj0wVFpsEMWnkXP0twVe1gJyNF5apBWDJhhIbgrIViRA== } + engines: { node: ^20.17.0 || >=22.9.0 } + + npm-normalize-package-bin@4.0.0: + resolution: + { integrity: sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w== } + engines: { node: ^18.17.0 || >=20.5.0 } + + npm-normalize-package-bin@5.0.0: + resolution: + { integrity: sha512-CJi3OS4JLsNMmr2u07OJlhcrPxCeOeP/4xq67aWNai6TNWWbTrlNDgl8NcFKVlcBKp18GPj+EzbNIgrBfZhsag== } + engines: { node: ^20.17.0 || >=22.9.0 } + + npm-package-arg@12.0.2: + resolution: + { integrity: sha512-f1NpFjNI9O4VbKMOlA5QoBq/vSQPORHcTZ2feJpFkTHJ9eQkdlmZEKSjcAhxTGInC7RlEyScT9ui67NaOsjFWA== } + engines: { node: ^18.17.0 || >=20.5.0 } + + npm-package-arg@13.0.1: + resolution: + { integrity: sha512-6zqls5xFvJbgFjB1B2U6yITtyGBjDBORB7suI4zA4T/sZ1OmkMFlaQSNB/4K0LtXNA1t4OprAFxPisadK5O2ag== } + engines: { node: ^20.17.0 || >=22.9.0 } + + npm-packlist@10.0.3: + resolution: + { integrity: sha512-zPukTwJMOu5X5uvm0fztwS5Zxyvmk38H/LfidkOMt3gbZVCyro2cD/ETzwzVPcWZA3JOyPznfUN/nkyFiyUbxg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + npm-pick-manifest@10.0.0: + resolution: + { integrity: sha512-r4fFa4FqYY8xaM7fHecQ9Z2nE9hgNfJR+EmoKv0+chvzWkBcORX3r0FpTByP+CbOVJDladMXnPQGVN8PBLGuTQ== } + engines: { node: ^18.17.0 || >=20.5.0 } + + npm-pick-manifest@11.0.3: + resolution: + { integrity: sha512-buzyCfeoGY/PxKqmBqn1IUJrZnUi1VVJTdSSRPGI60tJdUhUoSQFhs0zycJokDdOznQentgrpf8LayEHyyYlqQ== } + engines: { node: ^20.17.0 || >=22.9.0 } + + npm-registry-fetch@19.1.0: + resolution: + { integrity: sha512-xyZLfs7TxPu/WKjHUs0jZOPinzBAI32kEUel6za0vH+JUTnFZ5zbHI1ZoGZRDm6oMjADtrli6FxtMlk/5ABPNw== } + engines: { node: ^20.17.0 || >=22.9.0 } npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - nwsapi@2.2.16: - resolution: {integrity: sha512-F1I/bimDpj3ncaNDhfyMWuFqmQDBwDB0Fogc2qpL3BWvkQteFD/8BzWuIRl83rq0DXfm8SGt/HFhLXZyljTXcQ==} + resolution: + { integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== } + engines: { node: ">=8" } nx-cloud@19.1.0: - resolution: {integrity: sha512-f24vd5/57/MFSXNMfkerdDiK0EvScGOKO71iOWgJNgI1xVweDRmOA/EfjnPMRd5m+pnoPs/4A7DzuwSW0jZVyw==} + resolution: + { integrity: sha512-f24vd5/57/MFSXNMfkerdDiK0EvScGOKO71iOWgJNgI1xVweDRmOA/EfjnPMRd5m+pnoPs/4A7DzuwSW0jZVyw== } hasBin: true - nx@19.8.14: - resolution: {integrity: sha512-yprBOWV16eQntz5h5SShYHMVeN50fUb6yHfzsqNiFneCJeyVjyJ585m+2TuVbE11vT1amU0xCjHcSGfJBBnm8g==} + nx@22.3.3: + resolution: + { integrity: sha512-pOxtKWUfvf0oD8Geqs8D89Q2xpstRTaSY+F6Ut/Wd0GnEjUjO32SS1ymAM6WggGPHDZN4qpNrd5cfIxQmAbRLg== } hasBin: true peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 + "@swc-node/register": ^1.8.0 + "@swc/core": ^1.3.85 peerDependenciesMeta: - '@swc-node/register': + "@swc-node/register": optional: true - '@swc/core': - optional: true - - nx@19.8.4: - resolution: {integrity: sha512-fc833c3UKo6kuoG4z0kSKet17yWym3VzcQ+yPWYspxxxd8GFVVk42+9wieyVQDi9YqtKZQ6PdQfSEPm59/M7SA==} - hasBin: true - peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 - peerDependenciesMeta: - '@swc-node/register': - optional: true - '@swc/core': + "@swc/core": optional: true object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.3: - resolution: {integrity: sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.4: - resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== } + engines: { node: ">=0.10.0" } - object.fromentries@2.0.7: - resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} - engines: {node: '>= 0.4'} + object-deep-merge@2.0.0: + resolution: + { integrity: sha512-3DC3UMpeffLTHiuXSy/UG4NOIYTLlY9u3V82+djSCLYClWobZiS4ivYzpIUWrRY/nfsJ8cWsKyG3QfyLePmhvg== } - object.groupby@1.0.1: - resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + object-inspect@1.13.4: + resolution: + { integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew== } + engines: { node: ">= 0.4" } - object.values@1.1.7: - resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} - engines: {node: '>= 0.4'} + object-keys@1.1.1: + resolution: + { integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== } + engines: { node: ">= 0.4" } + + object.assign@4.1.7: + resolution: + { integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw== } + engines: { node: ">= 0.4" } + + object.fromentries@2.0.8: + resolution: + { integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ== } + engines: { node: ">= 0.4" } + + object.groupby@1.0.3: + resolution: + { integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== } + engines: { node: ">= 0.4" } + + object.values@1.2.1: + resolution: + { integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== } + engines: { node: ">= 0.4" } + + obug@2.1.1: + resolution: + { integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ== } on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== } + engines: { node: ">= 0.8" } once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + resolution: + { integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== } one-time@1.0.0: - resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + resolution: + { integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== } onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== } + engines: { node: ">=6" } open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== } + engines: { node: ">=12" } opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} + resolution: + { integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== } hasBin: true optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== } + engines: { node: ">= 0.8.0" } opts@2.0.2: - resolution: {integrity: sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg==} + resolution: + { integrity: sha512-k41FwbcLnlgnFh69f4qdUfvDQ+5vaSDnVPFI/y5XuhKRq97EnVVneO9F1ESVCdiVu4fCS2L8usX3mU331hB7pg== } ora@5.3.0: - resolution: {integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-zAKMgGXUim0Jyd6CXK9lraBnD3H5yPGBPPOkC23a2BG6hsm4Zu6OQSjQuEtV0BHDf4aKHcUFvJiGRrFuW3MG8g== } + engines: { node: ">=10" } ora@5.4.1: - resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ== } + engines: { node: ">=10" } - os-tmpdir@1.0.2: - resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} - engines: {node: '>=0.10.0'} + own-keys@1.0.1: + resolution: + { integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg== } + engines: { node: ">= 0.4" } p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg== } + engines: { node: ">=8" } p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== } + engines: { node: ">=4" } p-limit@1.3.0: - resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q== } + engines: { node: ">=4" } p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== } + engines: { node: ">=6" } p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== } + engines: { node: ">=10" } p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } p-locate@2.0.0: - resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg== } + engines: { node: ">=4" } p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== } + engines: { node: ">=8" } p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== } + engines: { node: ">=10" } p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } p-map-series@2.1.0: - resolution: {integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-RpYIIK1zXSNEOdwxcfe7FdvGcs7+y5n8rifMhMNWvaxRNMPINJHF5GDeuVxWqnfrcHPSCnp7Oo5yNXHId9Av2Q== } + engines: { node: ">=8" } p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ== } + engines: { node: ">=10" } + + p-map@7.0.4: + resolution: + { integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ== } + engines: { node: ">=18" } p-pipe@3.1.0: - resolution: {integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-08pj8ATpzMR0Y80x50yJHn37NF6vjrqHutASaX5LiH5npS9XPvrUmscd9MF5R4fuYRHOxQR1FfMIlF7AzwoPqw== } + engines: { node: ">=8" } p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== } + engines: { node: ">=8" } p-reduce@2.1.0: - resolution: {integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-2USApvnsutq8uoxZBGbbWM0JIYLiEMJ9RlaN7fAzVNb9OZN0SHjjTTfIcb667XynS5Y1VhwDJVDa72TnPzAYWw== } + engines: { node: ">=8" } p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== } + engines: { node: ">=8" } p-try@1.0.0: - resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww== } + engines: { node: ">=4" } p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== } + engines: { node: ">=6" } p-waterfall@2.1.1: - resolution: {integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-RRTnDb2TBG/epPRI2yYXsimO0v3BXC8Yd3ogr1545IaqKK17VGhbWVeGGN+XfCm/08OK8635nH31c8bATkHuSw== } + engines: { node: ">=8" } package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + resolution: + { integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw== } - pacote@18.0.6: - resolution: {integrity: sha512-+eK3G27SMwsB8kLIuj4h1FUhHtwiEUo21Tw8wNjmvdlpOEr613edv+8FUsTj/4F/VN5ywGE19X18N7CC2EJk6A==} - engines: {node: ^16.14.0 || >=18.0.0} + package-json-from-dist@1.0.1: + resolution: + { integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== } + + pacote@21.0.1: + resolution: + { integrity: sha512-LHGIUQUrcDIJUej53KJz1BPvUuHrItrR2yrnN0Kl9657cJ0ZT6QJHk9wWPBnQZhYT5KLyZWrk9jaYc2aKDu4yw== } + engines: { node: ^20.17.0 || >=22.9.0 } + hasBin: true + + pacote@21.0.4: + resolution: + { integrity: sha512-RplP/pDW0NNNDh3pnaoIWYPvNenS7UqMbXyvMqJczosiFWTeGGwJC2NQBLqKf4rGLFfwCOnntw1aEp9Jiqm1MA== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + resolution: + { integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== } parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== } + engines: { node: ">=6" } - parse-conflict-json@3.0.1: - resolution: {integrity: sha512-01TvEktc68vwbJOtWZluyWeVGWjP+bZwXtPDMQVbBKzbJ/vZBif0L69KH1+cHv1SZ6e0FKLvjyHe8mqsIqYOmw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + parse-conflict-json@4.0.0: + resolution: + { integrity: sha512-37CN2VtcuvKgHUs8+0b1uJeEsbGn61GRHz469C94P5xiOoqpDYJYwjg4RY9Vmz39WyZAVkR5++nbJwLMIgOCnQ== } + engines: { node: ^18.17.0 || >=20.5.0 } parse-imports-exports@0.2.4: - resolution: {integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ==} - - parse-imports@2.1.0: - resolution: {integrity: sha512-JQWgmK2o4w8leUkZeZPatWdAny6vXGU/3siIUvMF6J2rDCud9aTt8h/px9oZJ6U3EcfhngBJ635uPFI0q0VAeA==} - engines: {node: '>= 18'} + resolution: + { integrity: sha512-4s6vd6dx1AotCx/RCI2m7t7GCh5bDRUtGNvRfHSP2wbBQdMi67pPe7mtzmgwcaQ8VKK/6IB7Glfyu3qdZJPybQ== } parse-json@4.0.0: - resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw== } + engines: { node: ">=4" } parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== } + engines: { node: ">=8" } parse-ms@2.1.0: - resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA== } + engines: { node: ">=6" } parse-path@7.0.0: - resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==} + resolution: + { integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog== } parse-statements@1.0.11: - resolution: {integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA==} + resolution: + { integrity: sha512-HlsyYdMBnbPQ9Jr/VgJ1YF4scnldvJpJxCVx6KgqPL4dxppsWrJHCIIxQXMJrqGnsRkNPATbeMJ8Yxu7JMsYcA== } parse-url@8.1.0: - resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + resolution: + { integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w== } parse5@7.2.1: - resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + resolution: + { integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ== } + + parse5@8.0.0: + resolution: + { integrity: sha512-9m4m5GSgXjL4AjumKzq1Fgfp3Z8rsvjRNbnkVwfu2ImRqE5D0LnY2QfDen18FSY9C573YU5XxSapdHZTZ2WolA== } parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== } + engines: { node: ">= 0.8" } pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + resolution: + { integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== } + + path-case@3.0.4: + resolution: + { integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== } path-equal@1.2.5: - resolution: {integrity: sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g==} + resolution: + { integrity: sha512-i73IctDr3F2W+bsOWDyyVm/lqsXO47aY9nsFZUjTT/aljSbkxHxxCoyZ9UUrM8jK0JVod+An+rl48RCsvWM+9g== } path-exists@3.0.0: - resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== } + engines: { node: ">=4" } path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== } + engines: { node: ">=8" } path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + resolution: + { integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== } + engines: { node: ^12.20.0 || ^14.13.1 || >=16.0.0 } path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== } + engines: { node: ">=0.10.0" } path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== } + engines: { node: ">=8" } path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} + resolution: + { integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== } path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} + resolution: + { integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== } + engines: { node: ">=16 || 14 >=14.18" } path-scurry@2.0.0: - resolution: {integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==} - engines: {node: 20 || >=22} + resolution: + { integrity: sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg== } + engines: { node: 20 || >=22 } - path-to-regexp@0.1.10: - resolution: {integrity: sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==} + path-scurry@2.0.1: + resolution: + { integrity: sha512-oWyT4gICAu+kaA7QWk/jvCHWarMKNs6pXOGWKDTr7cw4IGcUbW+PeTfbaQiLGheFRpjo6O9J0PmyMfQPjH71oA== } + engines: { node: 20 || >=22 } + + path-to-regexp@8.3.0: + resolution: + { integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA== } path-type@3.0.0: - resolution: {integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg== } + engines: { node: ">=4" } path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== } + engines: { node: ">=8" } pathe@2.0.3: - resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} - - pathval@2.0.0: - resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} - engines: {node: '>= 14.16'} + resolution: + { integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w== } pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + resolution: + { integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== } picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + resolution: + { integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== } picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} + resolution: + { integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== } + engines: { node: ">=8.6" } picomatch@4.0.2: - resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== } + engines: { node: ">=12" } picomatch@4.0.3: - resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q== } + engines: { node: ">=12" } picomodal@3.0.0: - resolution: {integrity: sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==} + resolution: + { integrity: sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw== } pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== } + engines: { node: ">=0.10.0" } pify@3.0.0: - resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg== } + engines: { node: ">=4" } pify@4.0.1: - resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== } + engines: { node: ">=6" } pify@5.0.0: - resolution: {integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-eW/gHNMlxdSP6dmG6uJip6FXN0EQBwm2clYYd8Wul42Cwu/DK8HEftzsapcNdYe2MfLiIwZqsDk2RDEsTE79hA== } + engines: { node: ">=10" } pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - - pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} + resolution: + { integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== } + engines: { node: ">=8" } pluralize@8.0.0: - resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA== } + engines: { node: ">=4" } - postcss-selector-parser@6.1.0: - resolution: {integrity: sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==} - engines: {node: '>=4'} + possible-typed-array-names@1.1.0: + resolution: + { integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg== } + engines: { node: ">= 0.4" } - postcss-values-parser@2.0.1: - resolution: {integrity: sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==} - engines: {node: '>=6.14.4'} + postcss-selector-parser@7.1.1: + resolution: + { integrity: sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg== } + engines: { node: ">=4" } postcss-values-parser@6.0.2: - resolution: {integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-YLJpK0N1brcNJrs9WatuJFtHaV9q5aAOj+S4DI5S7jgHlRfm0PIbDCAFRYMQD5SHq7Fy6xsDhyutgS0QOAs0qw== } + engines: { node: ">=10" } peerDependencies: postcss: ^8.2.9 postcss@8.5.6: - resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} - engines: {node: ^10 || ^12 || >=14} + resolution: + { integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== } + engines: { node: ^10 || ^12 || >=14 } prebuild-install@7.1.3: - resolution: {integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug== } + engines: { node: ">=10" } hasBin: true precinct@12.1.2: - resolution: {integrity: sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ==} - engines: {node: '>=18'} - hasBin: true - - precinct@8.3.1: - resolution: {integrity: sha512-pVppfMWLp2wF68rwHqBIpPBYY8Kd12lDhk8LVQzOwqllifVR15qNFyod43YLyFpurKRZQKnE7E4pofAagDOm2Q==} - engines: {node: ^10.13 || ^12 || >=14} - hasBin: true - - precinct@9.2.1: - resolution: {integrity: sha512-uzKHaTyiVejWW7VJtHInb9KBUq9yl9ojxXGujhjhDmPon2wgZPBKQIKR+6csGqSlUeGXAA4MEFnU6DesxZib+A==} - engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0} + resolution: + { integrity: sha512-x2qVN3oSOp3D05ihCd8XdkIPuEQsyte7PSxzLqiRgktu79S5Dr1I75/S+zAup8/0cwjoiJTQztE9h0/sWp9bJQ== } + engines: { node: ">=18" } hasBin: true prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== } + engines: { node: ">= 0.8.0" } prettier-linter-helpers@1.0.0: - resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} - engines: {node: '>=6.0.0'} - - prettier-plugin-multiline-arrays@3.0.6: - resolution: {integrity: sha512-FrWVa7MoDQo9b5XoLPrqIDClb0k+O8wOIsIr1DutRXhcerLY8PfIe/yYeTVD/vpRISkSXCBEYmj5Voe0wb5dEQ==} - peerDependencies: - prettier: '>=3.0.0' - - prettier-plugin-multiline-arrays@4.0.3: - resolution: {integrity: sha512-H1f/0zbvlO/FR0Fmyl31sSBodsIZkuQF0Omi9BrptLU31rZ+Almt9BbrE8IS3BFT/DGKePKb55XqN660LTnmsQ==} - engines: {node: '>=20'} + resolution: + { integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== } + engines: { node: ">=6.0.0" } + + prettier-plugin-multiline-arrays@4.1.3: + resolution: + { integrity: sha512-V1U2EtLCvaoid1lDPReN4Gxw888dGmedJsz61Wfw36z/oG4NIcm3i13gdiUAKRvFKbf+iPsYO1a076tlksD/Tw== } + engines: { node: ">=20" } peerDependencies: - prettier: '>=3.0.0' + prettier: ">=3.0.0 <4.0.0" - prettier@3.6.2: - resolution: {integrity: sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==} - engines: {node: '>=14'} + prettier@3.7.4: + resolution: + { integrity: sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA== } + engines: { node: ">=14" } hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + pretty-format@30.2.0: + resolution: + { integrity: sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA== } + engines: { node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0 } pretty-ms@7.0.1: - resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q== } + engines: { node: ">=10" } - proc-log@3.0.0: - resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@5.0.0: + resolution: + { integrity: sha512-Azwzvl90HaF0aCz1JrDdXQykFakSSNPaPoiZ9fm5qJIMHioDZEi7OAdRwSm6rSoPtY3Qutnm3L7ogmg3dc+wbQ== } + engines: { node: ^18.17.0 || >=20.5.0 } - proc-log@4.2.0: - resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proc-log@6.1.0: + resolution: + { integrity: sha512-iG+GYldRf2BQ0UDUAd6JQ/RwzaQy6mXmsk/IzlYyal4A4SNFw54MeH4/tLkF4I5WoWG9SQwuqWzS99jaFQHBuQ== } + engines: { node: ^20.17.0 || >=22.9.0 } process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + resolution: + { integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== } - proggy@2.0.0: - resolution: {integrity: sha512-69agxLtnI8xBs9gUGqEnK26UfiexpHy+KUpBQWabiytQjnn5wFY8rklAi7GRfABIuPNnQ/ik48+LGLkYYJcy4A==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + proggy@3.0.0: + resolution: + { integrity: sha512-QE8RApCM3IaRRxVzxrjbgNMpQEX6Wu0p0KBeoSiSEw5/bsGwZHsshF4LCxH2jp/r6BU+bqA3LrMDEYNfJnpD8Q== } + engines: { node: ^18.17.0 || >=20.5.0 } progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== } + engines: { node: ">=0.4.0" } promise-all-reject-late@1.0.1: - resolution: {integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw==} + resolution: + { integrity: sha512-vuf0Lf0lOxyQREH7GDIOUMLS7kz+gs8i6B+Yi8dC68a2sychGrHTJYghMBD6k7eUcH0H5P73EckCA48xijWqXw== } promise-call-limit@3.0.1: - resolution: {integrity: sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg==} - - promise-inflight@1.0.1: - resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} - peerDependencies: - bluebird: '*' - peerDependenciesMeta: - bluebird: - optional: true + resolution: + { integrity: sha512-utl+0x8gIDasV5X+PI5qWEPqH6fJS0pFtQ/4gZ95xfEFb/89dmh+/b895TbFDBLiafBvxD/PGTKfvxl4kH/pQg== } promise-retry@2.0.1: - resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g== } + engines: { node: ">=10" } promise@7.3.1: - resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + resolution: + { integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg== } prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== } + engines: { node: ">= 6" } - promzard@1.0.0: - resolution: {integrity: sha512-KQVDEubSUHGSt5xLakaToDFrSoZhStB8dXLzk2xvwR67gJktrHFvpR63oZgHyK19WKbHFLXJqCPXdVR3aBP8Ig==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + promzard@2.0.0: + resolution: + { integrity: sha512-Ncd0vyS2eXGOjchIRg6PVCYKetJYrW1BSbbIo+bKdig61TB6nH2RQNF2uP+qMpsI73L/jURLWojcw8JNIKZ3gg== } + engines: { node: ^18.17.0 || >=20.5.0 } protocols@2.0.1: - resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==} + resolution: + { integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== } proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== } + engines: { node: ">= 0.10" } proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - proxy-vir@1.0.0: - resolution: {integrity: sha512-WV1gkBxUOwLSz0Bn09tisIqLK7leAqtFm/474t3L0hQKJw7/gdrkGcWw0/OT1PhSy+TDS6swfq7Niuoq3XJhkQ==} + resolution: + { integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== } proxy-vir@2.0.1: - resolution: {integrity: sha512-hjy5mWzHZhgRGh0f90f0Bz3VrGUe0T+AlhwnETakzRdvaN9RtPYLQG1+ZuEzSDK95FAhPYd26nEi1xVrXqvBwg==} - engines: {node: '>=22'} + resolution: + { integrity: sha512-hjy5mWzHZhgRGh0f90f0Bz3VrGUe0T+AlhwnETakzRdvaN9RtPYLQG1+ZuEzSDK95FAhPYd26nEi1xVrXqvBwg== } + engines: { node: ">=22" } pstree.remy@1.1.8: - resolution: {integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==} + resolution: + { integrity: sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w== } pug-attrs@3.0.0: - resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + resolution: + { integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA== } pug-code-gen@3.0.3: - resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} + resolution: + { integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw== } pug-error@2.1.0: - resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + resolution: + { integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg== } pug-filters@4.0.0: - resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + resolution: + { integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A== } pug-lexer@5.0.1: - resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + resolution: + { integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w== } pug-linker@4.0.0: - resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + resolution: + { integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw== } pug-load@3.0.0: - resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + resolution: + { integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ== } pug-parser@6.0.0: - resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + resolution: + { integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw== } pug-runtime@3.0.1: - resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + resolution: + { integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg== } pug-strip-comments@2.0.0: - resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + resolution: + { integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ== } pug-walk@2.0.0: - resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + resolution: + { integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ== } pug@3.0.3: - resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + resolution: + { integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g== } pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + resolution: + { integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== } + + pump@3.0.3: + resolution: + { integrity: sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA== } punycode.js@2.3.1: - resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== } + engines: { node: ">=6" } punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} + resolution: + { integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== } + engines: { node: ">=6" } - qs@6.13.0: - resolution: {integrity: sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==} - engines: {node: '>=0.6'} + qs@6.14.0: + resolution: + { integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w== } + engines: { node: ">=0.6" } queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + resolution: + { integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== } quick-lru@4.0.1: - resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== } + engines: { node: ">=8" } quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA== } + engines: { node: ">=10" } quote-unquote@1.0.0: - resolution: {integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg==} + resolution: + { integrity: sha512-twwRO/ilhlG/FIgYeKGFqyHhoEhqgnKVkcmqMKi2r524gz3ZbDTcyFt38E9xjJI2vT+KbRNHVbnJ/e0I25Azwg== } randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + resolution: + { integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== } range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} + resolution: + { integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== } + engines: { node: ">= 0.6" } - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} + raw-body@3.0.2: + resolution: + { integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA== } + engines: { node: ">= 0.10" } rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + resolution: + { integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== } hasBin: true - react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} + react-is@18.3.1: + resolution: + { integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== } read-cmd-shim@4.0.0: - resolution: {integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-yILWifhaSEEytfXI76kB9xEEiG1AiozaCJZ83A87ytjRiN+jVibXjedjCRNjoZviinhG+4UkalO3mWTd8u5O0Q== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } - read-package-json-fast@3.0.2: - resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read-cmd-shim@5.0.0: + resolution: + { integrity: sha512-SEbJV7tohp3DAAILbEMPXavBjAnMN0tVnh4+9G8ihV4Pq3HYF9h8QNez9zkJ1ILkv9G2BjdzwctznGZXgu/HGw== } + engines: { node: ^18.17.0 || >=20.5.0 } read-pkg-up@3.0.0: - resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw== } + engines: { node: ">=4" } read-pkg-up@7.0.1: - resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg== } + engines: { node: ">=8" } read-pkg@3.0.0: - resolution: {integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA== } + engines: { node: ">=4" } read-pkg@5.2.0: - resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== } + engines: { node: ">=8" } - read@2.1.0: - resolution: {integrity: sha512-bvxi1QLJHcaywCAEsAk4DG3nVoqiY2Csps3qzWalhj5hFqRn1d/OixkFXtLO1PrgHUcAP0FNaSY/5GYNfENFFQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - read@3.0.1: - resolution: {integrity: sha512-SLBrDU/Srs/9EoWhU5GdbAoxG1GzpQHo/6qiGItaoLJ1thmYpcNIM1qISEUvyHBzfGlWIyd6p2DNi1oV1VmAuw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + read@4.1.0: + resolution: + { integrity: sha512-uRfX6K+f+R8OOrYScaM3ixPY4erg69f8DN6pgTvMcA9iRc8iDhwrA4m3Yu8YYKsXJgVvum+m8PkRboZwwuLzYA== } + engines: { node: ^18.17.0 || >=20.5.0 } readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} + resolution: + { integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== } readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + resolution: + { integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== } readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} + resolution: + { integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== } + engines: { node: ">= 6" } readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} + resolution: + { integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== } + engines: { node: ">=8.10.0" } + + readdirp@4.1.2: + resolution: + { integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== } + engines: { node: ">= 14.18.0" } readjson@2.2.2: - resolution: {integrity: sha512-PdeC9tsmLWBiL8vMhJvocq+OezQ3HhsH2HrN7YkhfYcTjQSa/iraB15A7Qvt7Xpr0Yd2rDNt6GbFwVQDg3HcAw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-PdeC9tsmLWBiL8vMhJvocq+OezQ3HhsH2HrN7YkhfYcTjQSa/iraB15A7Qvt7Xpr0Yd2rDNt6GbFwVQDg3HcAw== } + engines: { node: ">=10" } rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== } + engines: { node: ">= 10.13.0" } redent@3.0.0: - resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== } + engines: { node: ">=8" } - regenerate-unicode-properties@10.1.0: - resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==} - engines: {node: '>=4'} + reflect.getprototypeof@1.0.10: + resolution: + { integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw== } + engines: { node: ">= 0.4" } - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regexp.prototype.flags@1.5.1: - resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} - engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.2.0: + resolution: + { integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== } + engines: { node: ">=4" } - regexpu-core@5.3.2: - resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} - engines: {node: '>=4'} - - regjsparser@0.9.1: - resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==} + regenerate@1.4.2: + resolution: + { integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== } + + regexp.prototype.flags@1.5.4: + resolution: + { integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA== } + engines: { node: ">= 0.4" } + + regexpu-core@6.2.0: + resolution: + { integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== } + engines: { node: ">=4" } + + regjsgen@0.8.0: + resolution: + { integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== } + + regjsparser@0.12.0: + resolution: + { integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== } hasBin: true relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} + resolution: + { integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== } + engines: { node: ">= 0.10" } require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== } + engines: { node: ">=0.10.0" } require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== } + engines: { node: ">=0.10.0" } requirejs-config-file@4.0.0: - resolution: {integrity: sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw==} - engines: {node: '>=10.13.0'} - - requirejs@2.3.6: - resolution: {integrity: sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==} - engines: {node: '>=0.4.0'} - hasBin: true + resolution: + { integrity: sha512-jnIre8cbWOyvr8a5F2KuqBnY+SDA4NXr/hzEZJG79Mxm2WiFQz2dzhC8ibtPJS7zkmBEl1mxSwp5HhC1W4qpxw== } + engines: { node: ">=10.13.0" } requirejs@2.3.7: - resolution: {integrity: sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw==} - engines: {node: '>=0.4.0'} + resolution: + { integrity: sha512-DouTG8T1WanGok6Qjg2SXuCMzszOo0eHeH9hDZ5Y4x8Je+9JB38HdTLT4/VA8OaUhBa0JPVHJ0pyBkM1z+pDsw== } + engines: { node: ">=0.4.0" } hasBin: true + reserved-identifiers@1.2.0: + resolution: + { integrity: sha512-yE7KUfFvaBFzGPs5H3Ops1RevfUEsDc5Iz65rOwWg4lE8HJSYtle77uul3+573457oHvBKuHYDl/xqUkKpEEdw== } + engines: { node: ">=18" } + resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + resolution: + { integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g== } resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - - resolve-dependency-path@2.0.0: - resolution: {integrity: sha512-DIgu+0Dv+6v2XwRaNWnumKu7GPufBBOr5I1gRPJHkvghrfCGOooJODFvgFimX/KRxk9j0whD2MnKHzM1jYvk9w==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== } + engines: { node: ">=8" } resolve-dependency-path@4.0.0: - resolution: {integrity: sha512-hlY1SybBGm5aYN3PC4rp15MzsJLM1w+MEA/4KU3UBPfz4S0lL3FL6mgv7JgaA8a+ZTeEQAiF1a1BuN2nkqiIlg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-hlY1SybBGm5aYN3PC4rp15MzsJLM1w+MEA/4KU3UBPfz4S0lL3FL6mgv7JgaA8a+ZTeEQAiF1a1BuN2nkqiIlg== } + engines: { node: ">=18" } resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== } + engines: { node: ">=4" } resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - resolve@1.19.0: - resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + resolution: + { integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== } + engines: { node: ">=8" } + + resolve.exports@2.0.3: + resolution: + { integrity: sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A== } + engines: { node: ">=10" } + + resolve@1.22.10: + resolution: + { integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== } + engines: { node: ">= 0.4" } + hasBin: true resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + resolution: + { integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== } hasBin: true responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + resolution: + { integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw== } restore-cursor@3.1.0: - resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== } + engines: { node: ">=8" } retry@0.12.0: - resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} - engines: {node: '>= 4'} + resolution: + { integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== } + engines: { node: ">= 4" } reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + resolution: + { integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== } + engines: { iojs: ">=1.0.0", node: ">=0.10.0" } rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + resolution: + { integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== } deprecated: Rimraf versions prior to v4 are no longer supported hasBin: true rimraf@4.4.1: - resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og== } + engines: { node: ">=14" } hasBin: true - rimraf@5.0.7: - resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} - engines: {node: '>=14.18'} - hasBin: true - - rimraf@6.0.1: - resolution: {integrity: sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==} - engines: {node: 20 || >=22} + rimraf@6.1.2: + resolution: + { integrity: sha512-cFCkPslJv7BAXJsYlK1dZsbP8/ZNLkCAQ0bi1hf5EKX2QHegmDFEFA6QhuYJlk7UDdc+02JjO80YSOrWPpw06g== } + engines: { node: 20 || >=22 } hasBin: true roarr@2.15.4: - resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A== } + engines: { node: ">=8.0" } rollup@4.50.1: - resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} + resolution: + { integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA== } + engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true - rrweb-cssom@0.8.0: - resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + router@2.2.0: + resolution: + { integrity: sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ== } + engines: { node: ">= 18" } - run-async@2.4.1: - resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} - engines: {node: '>=0.12.0'} + run-async@4.0.6: + resolution: + { integrity: sha512-IoDlSLTs3Yq593mb3ZoKWKXMNu3UpObxhgA/Xuid5p4bbfi2jdY1Hj0m1K+0/tEuQTxIGMhQDqGjKb7RuxGpAQ== } + engines: { node: ">=0.12.0" } run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - run-time-assertions@1.0.0: - resolution: {integrity: sha512-2MgjLxjJbgrXIAEROObGvz9me4A5Mj0vYIGrJ/9NERO6MrtY3OqJZz2iqfezTcXOWT/zJfdAasVmSLpnwHJIZw==} - deprecated: Use @augment-vir/assert instead. - - run-time-assertions@1.5.1: - resolution: {integrity: sha512-yyAFU3+ZGw+zjMu0s7uOSGqKIRDLaCnl80VIKdtwuu4ejxcWHCRj2mxL6elVNtI7fytHwk4e40e3IrdNkXihlw==} - deprecated: Use @augment-vir/assert instead. + resolution: + { integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== } - rxjs@7.8.1: - resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + rxjs@7.8.2: + resolution: + { integrity: sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== } - safe-array-concat@1.0.1: - resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} - engines: {node: '>=0.4'} + safe-array-concat@1.1.3: + resolution: + { integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q== } + engines: { node: ">=0.4" } safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + resolution: + { integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== } safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + resolution: + { integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== } - safe-regex-test@1.0.0: - resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + safe-push-apply@1.0.0: + resolution: + { integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA== } + engines: { node: ">= 0.4" } - safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} + safe-regex-test@1.1.0: + resolution: + { integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw== } + engines: { node: ">= 0.4" } safe-stable-stringify@2.5.0: - resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== } + engines: { node: ">=10" } safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sass-lookup@3.0.0: - resolution: {integrity: sha512-TTsus8CfFRn1N44bvdEai1no6PqdmDiQUiqW5DlpmtT+tYnIt1tXtDIph5KA1efC+LmioJXSnCtUVpcK9gaKIg==} - engines: {node: '>=6.0.0'} - hasBin: true + resolution: + { integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== } sass-lookup@6.0.1: - resolution: {integrity: sha512-nl9Wxbj9RjEJA5SSV0hSDoU2zYGtE+ANaDS4OFUR7nYrquvBFvPKZZtQHe3lvnxCcylEDV00KUijjdMTUElcVQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-nl9Wxbj9RjEJA5SSV0hSDoU2zYGtE+ANaDS4OFUR7nYrquvBFvPKZZtQHe3lvnxCcylEDV00KUijjdMTUElcVQ== } + engines: { node: ">=18" } hasBin: true - sass@1.69.5: - resolution: {integrity: sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==} - engines: {node: '>=14.0.0'} + sass@1.97.1: + resolution: + { integrity: sha512-uf6HoO8fy6ClsrShvMgaKUn14f2EHQLQRtpsZZLeU/Mv0Q1K5P0+x2uvH6Cub39TVVbWNSrraUhDAoFph6vh0A== } + engines: { node: ">=14.0.0" } hasBin: true sax@1.4.1: - resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + resolution: + { integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== } saxes@6.0.0: - resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} - engines: {node: '>=v12.22.7'} - - schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} + resolution: + { integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== } + engines: { node: ">=v12.22.7" } schema-utils@4.3.2: - resolution: {integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==} - engines: {node: '>= 10.13.0'} + resolution: + { integrity: sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ== } + engines: { node: ">= 10.13.0" } + + schema-utils@4.3.3: + resolution: + { integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA== } + engines: { node: ">= 10.13.0" } semver-compare@1.0.0: - resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==} + resolution: + { integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow== } semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + resolution: + { integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== } hasBin: true semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + resolution: + { integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== } hasBin: true - semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} + semver@7.7.2: + resolution: + { integrity: sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA== } + engines: { node: ">=10" } hasBin: true - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} + semver@7.7.3: + resolution: + { integrity: sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== } + engines: { node: ">=10" } hasBin: true - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} + send@1.2.1: + resolution: + { integrity: sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ== } + engines: { node: ">= 18" } - send@0.19.0: - resolution: {integrity: sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==} - engines: {node: '>= 0.8.0'} + sentence-case@3.0.4: + resolution: + { integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== } - seq-logging@2.1.1: - resolution: {integrity: sha512-aaJjxNiOK6ByZIv/vYLxaQE/SoqKYkoNF1DE5DD5fiv2qpq5l8QQrxTAkkDZFxK3DkSbmxNdhrGq/MN40LYYAA==} - engines: {node: '>=14.18'} + seq-logging@3.0.0: + resolution: + { integrity: sha512-ys5QV0745vxBCWuZBPSkgoobuLoUMxTSz1g7ZclHqX1tXXKFLyRIIn8V89EPgDnfRiWfoSo4KSxy/E0MtOYYyw== } + engines: { node: ">=14.18" } serialize-error@7.0.1: - resolution: {integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw== } + engines: { node: ">=10" } serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} + resolution: + { integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== } - serve-static@1.16.0: - resolution: {integrity: sha512-pDLK8zwl2eKaYrs8mrPZBJua4hMplRWJ1tIFksVC3FtBEBnl8dxgeHtsaMS8DhS9i4fLObaon6ABoc4/hQGdPA==} - engines: {node: '>= 0.8.0'} + serve-static@2.2.1: + resolution: + { integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw== } + engines: { node: ">= 18" } set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + resolution: + { integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== } set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg== } + engines: { node: ">= 0.4" } - set-function-name@2.0.1: - resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} - engines: {node: '>= 0.4'} + set-function-name@2.0.2: + resolution: + { integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ== } + engines: { node: ">= 0.4" } + + set-proto@1.0.0: + resolution: + { integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw== } + engines: { node: ">= 0.4" } setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + resolution: + { integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== } shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== } + engines: { node: ">=8" } shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== } + engines: { node: ">=8" } shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== } + engines: { node: ">=8" } + + shell-quote@1.8.3: + resolution: + { integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== } + engines: { node: ">= 0.4" } + + side-channel-list@1.0.0: + resolution: + { integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA== } + engines: { node: ">= 0.4" } + + side-channel-map@1.0.1: + resolution: + { integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA== } + engines: { node: ">= 0.4" } + + side-channel-weakmap@1.0.2: + resolution: + { integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A== } + engines: { node: ">= 0.4" } + + side-channel@1.1.0: + resolution: + { integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw== } + engines: { node: ">= 0.4" } siginfo@2.0.0: - resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + resolution: + { integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g== } signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + resolution: + { integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== } signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} + resolution: + { integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== } + engines: { node: ">=14" } - sigstore@2.3.1: - resolution: {integrity: sha512-8G+/XDU8wNsJOQS5ysDVO0Etg9/2uA5gR9l4ZwijjlwxBcrU6RPfwi2+jJmbP+Ap1Hlp/nVAaEO4Fj22/SL2gQ==} - engines: {node: ^16.14.0 || >=18.0.0} + sigstore@4.1.0: + resolution: + { integrity: sha512-/fUgUhYghuLzVT/gaJoeVehLCgZiUxPCPMcyVNY0lIf/cTCz58K/WTI7PefDarXxp9nUKpEwg1yyz3eSBMTtgA== } + engines: { node: ^20.17.0 || >=22.9.0 } simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + resolution: + { integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== } simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + resolution: + { integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== } simple-update-notifier@2.0.0: - resolution: {integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== } + engines: { node: ">=10" } simport@1.2.0: - resolution: {integrity: sha512-85Bm7pKsqiiQ8rmYCaPDdlXZjJvuW6/k/FY8MTtLFMgU7f8S00CgTHfRtWB6KwSb6ek4p9YyG2enG1+yJbl+CA==} - engines: {node: '>=12.2'} + resolution: + { integrity: sha512-85Bm7pKsqiiQ8rmYCaPDdlXZjJvuW6/k/FY8MTtLFMgU7f8S00CgTHfRtWB6KwSb6ek4p9YyG2enG1+yJbl+CA== } + engines: { node: ">=12.2" } sirv@2.0.3: - resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} - engines: {node: '>= 10'} + resolution: + { integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== } + engines: { node: ">= 10" } - sirv@3.0.1: - resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} - engines: {node: '>=18'} + sirv@3.0.2: + resolution: + { integrity: sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g== } + engines: { node: ">=18" } sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + resolution: + { integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== } slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slashes@3.0.12: - resolution: {integrity: sha512-Q9VME8WyGkc7pJf6QEkj3wE+2CnvZMI+XJhwdTPR8Z/kWQRXi7boAWLDibRPyHRTUTPx5FaU7MsyrjI3yLB4HA==} + resolution: + { integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== } + engines: { node: ">=8" } smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + resolution: + { integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== } + engines: { node: ">= 6.0.0", npm: ">= 3.0.0" } - socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} - engines: {node: '>= 14'} + snake-case@3.0.4: + resolution: + { integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== } - socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + socks-proxy-agent@8.0.5: + resolution: + { integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw== } + engines: { node: ">= 14" } - sort-keys@2.0.0: - resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==} - engines: {node: '>=4'} + socks@2.8.7: + resolution: + { integrity: sha512-HLpt+uLy/pxB+bum/9DzAgiKS8CX1EvbWxI4zlmgGCExImLdiad2iCwXT5Z4c9c3Eq8rP2318mPW2c+QbtjK8A== } + engines: { node: ">= 10.0.0", npm: ">= 3.0.0" } - source-map-js@1.0.2: - resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} - engines: {node: '>=0.10.0'} + sort-keys@2.0.0: + resolution: + { integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg== } + engines: { node: ">=4" } source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== } + engines: { node: ">=0.10.0" } source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + resolution: + { integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== } source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== } + engines: { node: ">=0.10.0" } source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== } + engines: { node: ">= 8" } spdx-correct@3.2.0: - resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + resolution: + { integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== } spdx-exceptions@2.3.0: - resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==} + resolution: + { integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== } spdx-expression-parse@3.0.1: - resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + resolution: + { integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== } spdx-expression-parse@4.0.0: - resolution: {integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==} + resolution: + { integrity: sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ== } spdx-license-ids@3.0.13: - resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==} + resolution: + { integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== } split2@3.2.2: - resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==} + resolution: + { integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== } split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} + resolution: + { integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== } + engines: { node: ">= 10.x" } split@1.0.1: - resolution: {integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==} + resolution: + { integrity: sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg== } sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + resolution: + { integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== } + + sprintf-js@1.1.3: + resolution: + { integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA== } - sprintf-js@1.1.2: - resolution: {integrity: sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==} + ssri@12.0.0: + resolution: + { integrity: sha512-S7iGNosepx9RadX82oimUkvr0Ct7IjJbEbs4mJcTxst8um95J3sDYU1RBEOvdu6oL1Wek2ODI5i4MAw+dZ6cAQ== } + engines: { node: ^18.17.0 || >=20.5.0 } - ssri@10.0.6: - resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + ssri@13.0.0: + resolution: + { integrity: sha512-yizwGBpbCn4YomB2lzhZqrHLJoqFGXihNbib3ozhqF/cIp5ue+xSmOQrjNasEE62hFxsCcg/V/z23t4n8jMEng== } + engines: { node: ^20.17.0 || >=22.9.0 } stack-trace@0.0.10: - resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + resolution: + { integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg== } stackback@0.0.2: - resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + resolution: + { integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw== } stats.ts@1.1.0: - resolution: {integrity: sha512-mokWb6xGU0elmDlUT6Y5E4zsUs/Enlq5fpyE7pfffpJg9Lg83GlL7B9zHEPA0eDvDC3Ko0ZZ50cjIN8yYJRPoQ==} + resolution: + { integrity: sha512-mokWb6xGU0elmDlUT6Y5E4zsUs/Enlq5fpyE7pfffpJg9Lg83GlL7B9zHEPA0eDvDC3Ko0ZZ50cjIN8yYJRPoQ== } statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== } + engines: { node: ">= 0.8" } - std-env@3.9.0: - resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} + statuses@2.0.2: + resolution: + { integrity: sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw== } + engines: { node: ">= 0.8" } + + std-env@3.10.0: + resolution: + { integrity: sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg== } + + stop-iteration-iterator@1.1.0: + resolution: + { integrity: sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ== } + engines: { node: ">= 0.4" } stream-to-array@2.3.0: - resolution: {integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA==} + resolution: + { integrity: sha512-UsZtOYEn4tWU2RGLOXr/o/xjRBftZRlG3dEWoaHr8j4GuypJ3isitGbVyjQKAuMu+xbiop8q224TjiZWc4XTZA== } string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== } + engines: { node: ">=8" } string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== } + engines: { node: ">=12" } string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== } + engines: { node: ">=18" } - string.prototype.trim@1.2.8: - resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} - engines: {node: '>= 0.4'} + string.prototype.trim@1.2.10: + resolution: + { integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA== } + engines: { node: ">= 0.4" } - string.prototype.trimend@1.0.7: - resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + string.prototype.trimend@1.0.9: + resolution: + { integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ== } + engines: { node: ">= 0.4" } - string.prototype.trimstart@1.0.7: - resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + string.prototype.trimstart@1.0.8: + resolution: + { integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg== } + engines: { node: ">= 0.4" } string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + resolution: + { integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== } string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + resolution: + { integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== } string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + resolution: + { integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== } stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== } + engines: { node: ">=4" } strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== } + engines: { node: ">=8" } strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== } + engines: { node: ">=12" } strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== } + engines: { node: ">=4" } strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== } + engines: { node: ">=8" } strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== } + engines: { node: ">=6" } strip-indent@3.0.0: - resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== } + engines: { node: ">=8" } strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== } + engines: { node: ">=0.10.0" } strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - strip-literal@3.0.0: - resolution: {integrity: sha512-TcccoMhJOM3OebGhSBEmp3UZ2SfDMZUEBdRA/9ynfLi8yYajyWX3JiXArcJt4Umh4vISpspkQIY8ZZoCqjbviA==} + resolution: + { integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== } + engines: { node: ">=8" } strip-outer@1.0.1: - resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==} - engines: {node: '>=0.10.0'} - - strong-log-transformer@2.1.0: - resolution: {integrity: sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==} - engines: {node: '>=4'} - hasBin: true - - stylus-lookup@3.0.2: - resolution: {integrity: sha512-oEQGHSjg/AMaWlKe7gqsnYzan8DLcGIHe0dUaFkucZZ14z4zjENRlQMCHT4FNsiWnJf17YN9OvrCfCoi7VvOyg==} - engines: {node: '>=6.0.0'} - hasBin: true + resolution: + { integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== } + engines: { node: ">=0.10.0" } stylus-lookup@6.0.0: - resolution: {integrity: sha512-RaWKxAvPnIXrdby+UWCr1WRfa+lrPMSJPySte4Q6a+rWyjeJyFOLJxr5GrAVfcMCsfVlCuzTAJ/ysYT8p8do7Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-RaWKxAvPnIXrdby+UWCr1WRfa+lrPMSJPySte4Q6a+rWyjeJyFOLJxr5GrAVfcMCsfVlCuzTAJ/ysYT8p8do7Q== } + engines: { node: ">=18" } hasBin: true stylus@0.64.0: - resolution: {integrity: sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-ZIdT8eUv8tegmqy1tTIdJv9We2DumkNZFdCF5mz/Kpq3OcTaxSuCAYZge6HKK2CmNC02G1eJig2RV7XTw5hQrA== } + engines: { node: ">=16" } hasBin: true sumchecker@3.0.1: - resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==} - engines: {node: '>= 8.0'} + resolution: + { integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg== } + engines: { node: ">= 8.0" } supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== } + engines: { node: ">=4" } supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== } + engines: { node: ">=8" } supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== } + engines: { node: ">=10" } supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} + resolution: + { integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== } + engines: { node: ">= 0.4" } symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + resolution: + { integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== } - synckit@0.11.4: - resolution: {integrity: sha512-Q/XQKRaJiLiFIBNN+mndW7S/RHxvwzuZS6ZwmRzUBqJBv/5QIKCEwkBC8GBf8EQJKYnaFs0wOZbKTXBPj8L9oQ==} - engines: {node: ^14.18.0 || >=16.0.0} + synckit@0.11.11: + resolution: + { integrity: sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw== } + engines: { node: ^14.18.0 || >=16.0.0 } - synckit@0.9.0: - resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} - engines: {node: ^14.18.0 || >=16.0.0} + tagged-tag@1.0.0: + resolution: + { integrity: sha512-yEFYrVhod+hdNyx7g5Bnkkb0G6si8HJurOoOEgC8B/O0uXLHlaey/65KRv6cuWBNhBgHKAROVpc7QyYqE5gFng== } + engines: { node: ">=20" } tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== } + engines: { node: ">=6" } + + tapable@2.3.0: + resolution: + { integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg== } + engines: { node: ">=6" } tar-fs@2.1.2: - resolution: {integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA==} + resolution: + { integrity: sha512-EsaAXwxmx8UB7FRKqeozqEPop69DXcmYwTQwXvyAPF352HJsPdkVhvTaDPYqfNgruveJIJy3TA2l+2zj8LJIJA== } tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== } + engines: { node: ">=6" } tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A== } + engines: { node: ">=10" } - temp-dir@1.0.0: - resolution: {integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ==} - engines: {node: '>=4'} + tar@7.5.2: + resolution: + { integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg== } + engines: { node: ">=18" } - terser-webpack-plugin@5.3.14: - resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} - engines: {node: '>= 10.13.0'} + temp-dir@1.0.0: + resolution: + { integrity: sha512-xZFXEGbG7SNC3itwBzI3RYjq/cEhBkx2hJuKGIUOcEULmkQExXiHat2z/qkISYsuR+IKumhEfKKbV5qXmhICFQ== } + engines: { node: ">=4" } + + terser-webpack-plugin@5.3.16: + resolution: + { integrity: sha512-h9oBFCWrq78NyWWVcSwZarJkZ01c2AyGrzs1crmHZO3QUg9D61Wu4NPjBy69n7JqylFF5y+CsUZYmYEIZ3mR+Q== } + engines: { node: ">= 10.13.0" } peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' + "@swc/core": "*" + esbuild: "*" + uglify-js: "*" webpack: ^5.1.0 peerDependenciesMeta: - '@swc/core': + "@swc/core": optional: true esbuild: optional: true @@ -8231,486 +9916,556 @@ packages: optional: true terser@5.36.0: - resolution: {integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w== } + engines: { node: ">=10" } hasBin: true - test-exclude@7.0.1: - resolution: {integrity: sha512-pFYqmTw68LXVjeWJMST4+borgQP2AyMNbg1BpZh9LbyhUeNkeaPF9gzfPGUAnSMV3qPYdWUwDIjjCLiSDOl7vg==} - engines: {node: '>=18'} + terser@5.44.1: + resolution: + { integrity: sha512-t/R3R/n0MSwnnazuPpPNVO60LX0SKL45pyl9YlvxIdkH0Of7D5qM2EVe+yASRIlY5pZ73nclYJfNANGWPwFDZw== } + engines: { node: ">=10" } + hasBin: true text-extensions@1.9.0: - resolution: {integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ==} - engines: {node: '>=0.10'} + resolution: + { integrity: sha512-wiBrwC1EhBelW12Zy26JeOUkQ5mRu+5o8rpsJk5+2t+Y5vE7e842qtZDQ2g1NpX/29HdyFeJ4nSIhI47ENSxlQ== } + engines: { node: ">=0.10" } text-extensions@2.4.0: - resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g== } + engines: { node: ">=8" } text-hex@1.0.0: - resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + resolution: + { integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== } through2@2.0.5: - resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + resolution: + { integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ== } through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + resolution: + { integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== } tinybench@2.9.0: - resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + resolution: + { integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg== } tinyexec@1.0.1: - resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} + resolution: + { integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw== } - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} - engines: {node: '>=12.0.0'} + tinyexec@1.0.2: + resolution: + { integrity: sha512-W/KYk+NFhkmsYpuHq5JykngiOCnxeVL8v8dFnqxSD8qEEdRfXk1SDM6JzNqcERbcGYj9tMrDQBYV9cjgnunFIg== } + engines: { node: ">=18" } - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} + tinyglobby@0.2.12: + resolution: + { integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww== } + engines: { node: ">=12.0.0" } tinyglobby@0.2.15: - resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} - engines: {node: '>=12.0.0'} - - tinypool@1.1.1: - resolution: {integrity: sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg==} - engines: {node: ^18.0.0 || >=20.0.0} - - tinyrainbow@2.0.0: - resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} - engines: {node: '>=14.0.0'} - - tinyspy@4.0.3: - resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} - engines: {node: '>=14.0.0'} - - tldts-core@6.1.50: - resolution: {integrity: sha512-na2EcZqmdA2iV9zHV7OHQDxxdciEpxrjbkp+aHmZgnZKHzoElLajP59np5/4+sare9fQBfixgvXKx8ev1d7ytw==} - - tldts@6.1.50: - resolution: {integrity: sha512-q9GOap6q3KCsLMdOjXhWU5jVZ8/1dIib898JBRLsN+tBhENpBDcAVQbE0epADOjw11FhQQy9AcbqKGBQPUfTQA==} + resolution: + { integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== } + engines: { node: ">=12.0.0" } + + tinyrainbow@3.0.3: + resolution: + { integrity: sha512-PSkbLUoxOFRzJYjjxHJt9xro7D+iilgMX/C9lawzVuYiIdcihh9DXmVibBe8lmcFrRi/VzlPjBxbN7rH24q8/Q== } + engines: { node: ">=14.0.0" } + + tldts-core@7.0.19: + resolution: + { integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A== } + + tldts@7.0.19: + resolution: + { integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA== } hasBin: true - tmp@0.0.33: - resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} - engines: {node: '>=0.6.0'} - tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} + resolution: + { integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ== } + engines: { node: ">=8.17.0" } to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} + resolution: + { integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== } + engines: { node: ">=8.0" } + + to-valid-identifier@1.0.0: + resolution: + { integrity: sha512-41wJyvKep3yT2tyPqX/4blcfybknGB4D+oETKLs7Q76UiPqRpUJK3hr1nxelyYO0PHKVzJwlu0aCeEAsGI6rpw== } + engines: { node: ">=20" } toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} + resolution: + { integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== } + engines: { node: ">=0.6" } token-stream@1.0.0: - resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + resolution: + { integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg== } totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== } + engines: { node: ">=6" } touch@3.1.0: - resolution: {integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==} + resolution: + { integrity: sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA== } hasBin: true - tough-cookie@5.1.2: - resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==} - engines: {node: '>=16'} + tough-cookie@6.0.0: + resolution: + { integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w== } + engines: { node: ">=16" } tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + resolution: + { integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== } - tr46@5.1.1: - resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==} - engines: {node: '>=18'} + tr46@6.0.0: + resolution: + { integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw== } + engines: { node: ">=20" } tree-kill@1.2.2: - resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + resolution: + { integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== } hasBin: true treeverse@3.0.0: - resolution: {integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-gcANaAnd2QDZFmHFEOF4k7uc1J/6a6z3DJMd/QwEyxLoKGiptJRwid582r7QIsFlFMIZ3SnxfS52S4hm2DHkuQ== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } trim-newlines@3.0.1: - resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== } + engines: { node: ">=8" } trim-repeated@1.0.0: - resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== } + engines: { node: ">=0.10.0" } triple-beam@1.4.0: - resolution: {integrity: sha512-rD6Q7Grj07i2PW1sQmz4KXviI+9E02EWBnAU9DafQbUueb7Esh786jop+be92KFxvxPGHuC0mR7YVcE6rScMBg==} - engines: {node: '>= 16.0.0'} + resolution: + { integrity: sha512-rD6Q7Grj07i2PW1sQmz4KXviI+9E02EWBnAU9DafQbUueb7Esh786jop+be92KFxvxPGHuC0mR7YVcE6rScMBg== } + engines: { node: ">= 16.0.0" } try-catch@3.0.1: - resolution: {integrity: sha512-91yfXw1rr/P6oLpHSyHDOHm0vloVvUoo9FVdw8YwY05QjJQG9OT0LUxe2VRAzmHG+0CUOmI3nhxDUMLxDN/NEQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-91yfXw1rr/P6oLpHSyHDOHm0vloVvUoo9FVdw8YwY05QjJQG9OT0LUxe2VRAzmHG+0CUOmI3nhxDUMLxDN/NEQ== } + engines: { node: ">=6" } + + try-catch@4.0.7: + resolution: + { integrity: sha512-gkBWUxbiN4T4PsO8KhoQYWzUPN6e0/h12H9H3YhcfPbwaN8b84fy8cFqL4rWTiPh7qHPFaEfklr6OkVxYRW0Gg== } + engines: { node: ">=22" } try-to-catch@3.0.1: - resolution: {integrity: sha512-hOY83V84Hx/1sCzDSaJA+Xz2IIQOHRvjxzt+F0OjbQGPZ6yLPLArMA0gw/484MlfUkQbCpKYMLX3VDCAjWKfzQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-hOY83V84Hx/1sCzDSaJA+Xz2IIQOHRvjxzt+F0OjbQGPZ6yLPLArMA0gw/484MlfUkQbCpKYMLX3VDCAjWKfzQ== } + engines: { node: ">=6" } + + try-to-catch@4.0.3: + resolution: + { integrity: sha512-mUz1zpe6nkRQW0XZ/Ojfe/Eg7e5h3s+r+h7ONfP3Oo27/Jm8mkNDAnLzZ/A3sEMApROolzuJGBiQhGmmVDAFLw== } + engines: { node: ">=22" } ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} + resolution: + { integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ== } + engines: { node: ">=16" } peerDependencies: - typescript: '>=4.2.0' + typescript: ">=4.2.0" - ts-graphviz@1.8.1: - resolution: {integrity: sha512-54/fe5iu0Jb6X0pmDmzsA2UHLfyHjUEUwfHtZcEOR0fZ6Myf+dFoO6eNsyL8CBDMJ9u7WWEewduVaiaXlvjSVw==} - engines: {node: '>=14.16'} + ts-api-utils@2.1.0: + resolution: + { integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ== } + engines: { node: ">=18.12" } + peerDependencies: + typescript: ">=4.8.4" + + ts-api-utils@2.3.0: + resolution: + { integrity: sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg== } + engines: { node: ">=18.12" } + peerDependencies: + typescript: ">=4.8.4" ts-graphviz@2.1.2: - resolution: {integrity: sha512-9GnOA3yiFaqZeHBEZXWa6kqc61FVhAhxQU5g3KLyGrhRr7OsDGRzs+1z35ctvD+hTTEhrBza6D41+qz+3qs7Zw==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-9GnOA3yiFaqZeHBEZXWa6kqc61FVhAhxQU5g3KLyGrhRr7OsDGRzs+1z35ctvD+hTTEhrBza6D41+qz+3qs7Zw== } + engines: { node: ">=18" } ts-json-schema-generator@2.4.0: - resolution: {integrity: sha512-HbmNsgs58CfdJq0gpteRTxPXG26zumezOs+SB9tgky6MpqiFgQwieCn2MW70+sxpHouZ/w9LW0V6L4ZQO4y1Ug==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-HbmNsgs58CfdJq0gpteRTxPXG26zumezOs+SB9tgky6MpqiFgQwieCn2MW70+sxpHouZ/w9LW0V6L4ZQO4y1Ug== } + engines: { node: ">=18.0.0" } hasBin: true ts-node@10.9.2: - resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + resolution: + { integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== } hasBin: true peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' + "@swc/core": ">=1.2.50" + "@swc/wasm": ">=1.2.50" + "@types/node": "*" + typescript: ">=2.7" peerDependenciesMeta: - '@swc/core': + "@swc/core": optional: true - '@swc/wasm': + "@swc/wasm": optional: true tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + resolution: + { integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg== } tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - - tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + resolution: + { integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== } + engines: { node: ">=6" } tslib@2.8.1: - resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - - tsutils@3.21.0: - resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} - engines: {node: '>= 6'} - peerDependencies: - typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + resolution: + { integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== } - tuf-js@2.2.1: - resolution: {integrity: sha512-GwIJau9XaA8nLVbUXsN3IlFi7WmQ48gBUrl3FTkkL/XLu/POhBzfmX9hd33FNMX1qAsfl6ozO1iMmW9NC8YniA==} - engines: {node: ^16.14.0 || >=18.0.0} + tuf-js@4.1.0: + resolution: + { integrity: sha512-50QV99kCKH5P/Vs4E2Gzp7BopNV+KzTXqWeaxrfu5IQJBOULRsTIS9seSsOVT8ZnGXzCyx55nYWAi4qJzpZKEQ== } + engines: { node: ^20.17.0 || >=22.9.0 } tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + resolution: + { integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== } type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} + resolution: + { integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== } + engines: { node: ">= 0.8.0" } type-fest@0.13.1: - resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg== } + engines: { node: ">=10" } type-fest@0.18.1: - resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==} - engines: {node: '>=10'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== } + engines: { node: ">=10" } type-fest@0.4.1: - resolution: {integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-IwzA/LSfD2vC1/YDYMv/zHP4rDF1usCwllsDpbolT3D4fUepIO7f9K70jjmUewU/LmGUKJcwcVtDCpnKk4BPMw== } + engines: { node: ">=6" } type-fest@0.6.0: - resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== } + engines: { node: ">=8" } type-fest@0.8.1: - resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} - engines: {node: '>=8'} - - type-fest@4.10.3: - resolution: {integrity: sha512-JLXyjizi072smKGGcZiAJDCNweT8J+AuRxmPZ1aG7TERg4ijx9REl8CNhbr36RV4qXqL1gO1FF9HL8OkVmmrsA==} - engines: {node: '>=16'} - - type-fest@4.20.1: - resolution: {integrity: sha512-R6wDsVsoS9xYOpy8vgeBlqpdOyzJ12HNfQhC/aAKWM3YoCV9TtunJzh/QpkMgeDhkoynDcw5f1y+qF9yc/HHyg==} - engines: {node: '>=16'} - - type-fest@4.30.2: - resolution: {integrity: sha512-UJShLPYi1aWqCdq9HycOL/gwsuqda1OISdBO3t8RlXQC4QvtuIz4b5FCfe2dQIWEpmlRExKmcTBfP1r9bhY7ig==} - engines: {node: '>=16'} - - type-fest@4.41.0: - resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} - engines: {node: '>=16'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typed-array-buffer@1.0.0: - resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.0: - resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.0: - resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.4: - resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} - - typed-event-target@4.0.4: - resolution: {integrity: sha512-S0Ob9gNz/AlsFiE/ltidnnz0yqONOBi7WhRMK4PZNPSnjNy/Y3K5eRy28FhGbO6IuPKWYtTIIt/4oPtfOBOf3A==} - engines: {node: '>=22'} + resolution: + { integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== } + engines: { node: ">=8" } + + type-fest@5.3.1: + resolution: + { integrity: sha512-VCn+LMHbd4t6sF3wfU/+HKT63C9OoyrSIf4b+vtWHpt2U7/4InZG467YDNMFMR70DdHjAdpPWmw2lzRdg0Xqqg== } + engines: { node: ">=20" } + + type-is@2.0.1: + resolution: + { integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw== } + engines: { node: ">= 0.6" } + + typed-array-buffer@1.0.3: + resolution: + { integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw== } + engines: { node: ">= 0.4" } + + typed-array-byte-length@1.0.3: + resolution: + { integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg== } + engines: { node: ">= 0.4" } + + typed-array-byte-offset@1.0.4: + resolution: + { integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ== } + engines: { node: ">= 0.4" } + + typed-array-length@1.0.7: + resolution: + { integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg== } + engines: { node: ">= 0.4" } + + typed-event-target@4.1.0: + resolution: + { integrity: sha512-fDFhZb7ofywLsVv8mYePD6ONfCpVHyM1t2dboEJx/XMsnflljnu3GQ5qH09hS1USuypGMR7wRbdWQPydgJ8nGQ== } + engines: { node: ">=22" } typedarray@0.0.6: - resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + resolution: + { integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== } typedoc-plugin-carbon-ads@1.6.0: - resolution: {integrity: sha512-PzWe1iqnul+9DOZh3/OCcndjTstoxHET4XIXEMif1l/LbxpHdIBQ+h5HlcS6D2nW8HoiZqxMYjvWIqtaqPmRAQ==} + resolution: + { integrity: sha512-PzWe1iqnul+9DOZh3/OCcndjTstoxHET4XIXEMif1l/LbxpHdIBQ+h5HlcS6D2nW8HoiZqxMYjvWIqtaqPmRAQ== } peerDependencies: typedoc: ^0.25.4 typedoc-plugin-clarity@1.6.0: - resolution: {integrity: sha512-BvJj8ZvgCZzS2sLO7yIkRg9EWLPdll+xLyQekjMAtypHITOXSwCO9E9Ir77R2fctsVC9BVJiToGAYcsMtyuPdw==} + resolution: + { integrity: sha512-BvJj8ZvgCZzS2sLO7yIkRg9EWLPdll+xLyQekjMAtypHITOXSwCO9E9Ir77R2fctsVC9BVJiToGAYcsMtyuPdw== } peerDependencies: typedoc: ^0.25.4 - typedoc-plugin-coverage@4.0.1: - resolution: {integrity: sha512-P1QBR5GJSfW3fDrpz4Vkd8z8lzWaBYjaHebRLk0u2Uga0oSFlPaqrCyiHzItBXxZX28aMlNlZwrUnsLgUgqA7g==} - engines: {node: '>= 18'} + typedoc-plugin-coverage@4.0.2: + resolution: + { integrity: sha512-mfn0e7NCqB8x2PfvhXrtmd7KWlsNf1+B2N9y8gR/jexXBLrXl/0e+b2HdG5HaTXGi7i0t2pyQY2VRmq7gtdEHQ== } + engines: { node: ">= 18" } peerDependencies: typedoc: 0.28.x typedoc-plugin-keywords@1.6.0: - resolution: {integrity: sha512-URyCIHw6+Lwil0ywy6lVb2TckfDVGjAWnRnTAiiSZaRaglI6vaaP1EhhwEipOIlHaJSnHZfdwpWe1t4mffTIpA==} + resolution: + { integrity: sha512-URyCIHw6+Lwil0ywy6lVb2TckfDVGjAWnRnTAiiSZaRaglI6vaaP1EhhwEipOIlHaJSnHZfdwpWe1t4mffTIpA== } peerDependencies: typedoc: ^0.25.4 - typedoc-plugin-mdn-links@5.0.7: - resolution: {integrity: sha512-F4hSmW4wGn562EuF8UQWmutQfWlvSoP+14QJ6UQcNViGrBCQ9NLqze5LuhYc0DLxuQnWIzUnCShpuy2Zo5LtfQ==} + typedoc-plugin-mdn-links@5.0.10: + resolution: + { integrity: sha512-TOMj1+fyhqhdJaMwfkw7ANz+0KHjRVUnE/SorPW83wghElmsMxxCZhDSBgF2hRB9+qsf/qIjDw65RDay94E2Wg== } peerDependencies: typedoc: 0.27.x || 0.28.x - typedoc-plugin-missing-exports@4.0.0: - resolution: {integrity: sha512-Z4ei+853xppDEhcqzyeyRs4+R0kUuKQWnMK1EtSTEd5LFkgkdW5Bdn8vfo/rsCGbYVJxOWU99fxgM1mROw5Fug==} + typedoc-plugin-missing-exports@4.1.2: + resolution: + { integrity: sha512-WNoeWX9+8X3E3riuYPduilUTFefl1K+Z+5bmYqNeH5qcWjtnTRMbRzGdEQ4XXn1WEO4WCIlU0vf46Ca2y/mspg== } peerDependencies: typedoc: ^0.28.1 - typedoc@0.28.9: - resolution: {integrity: sha512-aw45vwtwOl3QkUAmWCnLV9QW1xY+FSX2zzlit4MAfE99wX+Jij4ycnpbAWgBXsRrxmfs9LaYktg/eX5Bpthd3g==} - engines: {node: '>= 18', pnpm: '>= 10'} + typedoc@0.28.15: + resolution: + { integrity: sha512-mw2/2vTL7MlT+BVo43lOsufkkd2CJO4zeOSuWQQsiXoV2VuEn7f6IZp2jsUDPmBMABpgR0R5jlcJ2OGEFYmkyg== } + engines: { node: ">= 18", pnpm: ">= 10" } hasBin: true peerDependencies: typescript: 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x || 5.5.x || 5.6.x || 5.7.x || 5.8.x || 5.9.x - typescript-json-schema@0.65.1: - resolution: {integrity: sha512-tuGH7ff2jPaUYi6as3lHyHcKpSmXIqN7/mu50x3HlYn0EHzLpmt3nplZ7EuhUkO0eqDRc9GqWNkfjgBPIS9kxg==} - hasBin: true - - typescript@3.9.10: - resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==} - engines: {node: '>=4.2.0'} - hasBin: true - - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} - hasBin: true + typescript-eslint@8.51.0: + resolution: + { integrity: sha512-jh8ZuM5oEh2PSdyQG9YAEM1TCGuWenLSuSUhf/irbVUNW9O5FhbFVONviN2TgMTBnUmyHv7E56rYnfLZK6TkiA== } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <6.0.0" - typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} + typescript-json-schema@0.67.1: + resolution: + { integrity: sha512-vKTZB/RoYTIBdVP7E7vrgHMCssBuhja91wQy498QIVhvfRimaOgjc98uwAXmZ7mbLUytJmOSbF11wPz+ByQeXg== } hasBin: true typescript@5.5.4: - resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} - engines: {node: '>=14.17'} + resolution: + { integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q== } + engines: { node: ">=14.17" } hasBin: true - typescript@5.9.2: - resolution: {integrity: sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==} - engines: {node: '>=14.17'} + typescript@5.9.3: + resolution: + { integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== } + engines: { node: ">=14.17" } hasBin: true uc.micro@2.1.0: - resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + resolution: + { integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== } uglify-js@3.17.4: - resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} - engines: {node: '>=0.8.0'} + resolution: + { integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g== } + engines: { node: ">=0.8.0" } hasBin: true - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + unbox-primitive@1.1.0: + resolution: + { integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw== } + engines: { node: ">= 0.4" } undefsafe@2.0.5: - resolution: {integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==} + resolution: + { integrity: sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA== } undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - undici-types@6.20.0: - resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + resolution: + { integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== } undici-types@6.21.0: - resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==} + resolution: + { integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== } - undici-types@7.8.0: - resolution: {integrity: sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==} + undici-types@7.16.0: + resolution: + { integrity: sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw== } unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== } + engines: { node: ">=4" } unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== } + engines: { node: ">=4" } unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== } + engines: { node: ">=4" } unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== } + engines: { node: ">=4" } unicorn-magic@0.1.0: - resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ== } + engines: { node: ">=18" } + + unicorn-magic@0.3.0: + resolution: + { integrity: sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA== } + engines: { node: ">=18" } + + unique-filename@4.0.0: + resolution: + { integrity: sha512-XSnEewXmQ+veP7xX2dS5Q4yZAvO40cBN2MWkJ7D/6sW4Dg6wYBNwM1Vrnz1FhH5AdeLIlUXRI9e28z1YZi71NQ== } + engines: { node: ^18.17.0 || >=20.5.0 } + + unique-filename@5.0.0: + resolution: + { integrity: sha512-2RaJTAvAb4owyjllTfXzFClJ7WsGxlykkPvCr9pA//LD9goVq+m4PPAeBgNodGZ7nSrntT/auWpJ6Y5IFXcfjg== } + engines: { node: ^20.17.0 || >=22.9.0 } + + unique-slug@5.0.0: + resolution: + { integrity: sha512-9OdaqO5kwqR+1kVgHAhsp5vPNU0hnxRa26rBFNfNgM7M6pNtgzeBn3s/xbyCQL3dcjzOatcef6UUHpB/6MaETg== } + engines: { node: ^18.17.0 || >=20.5.0 } + + unique-slug@6.0.0: + resolution: + { integrity: sha512-4Lup7Ezn8W3d52/xBhZBVdx323ckxa7DEvd9kPQHppTkLoJXw6ltrBCyj5pnrxj0qKDxYMJ56CoxNuFCscdTiw== } + engines: { node: ^20.17.0 || >=22.9.0 } - uniq@1.0.1: - resolution: {integrity: sha512-Gw+zz50YNKPDKXs+9d+aKAjVwpjNwqzvNpLigIruT4HA9lMZNdMqs9x07kKHB/L9WRzqp4+DlTU5s4wG2esdoA==} - - unique-filename@3.0.0: - resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - unique-slug@4.0.0: - resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - - universal-user-agent@6.0.0: - resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + universal-user-agent@6.0.0: + resolution: + { integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== } universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} + resolution: + { integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== } + engines: { node: ">= 4.0.0" } universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} + resolution: + { integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== } + engines: { node: ">= 10.0.0" } unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} + resolution: + { integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== } + engines: { node: ">= 0.8" } untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== } + engines: { node: ">=8" } upath@2.0.1: - resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} - engines: {node: '>=4'} + resolution: + { integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== } + engines: { node: ">=4" } - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} + update-browserslist-db@1.2.3: + resolution: + { integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== } hasBin: true peerDependencies: - browserslist: '>= 4.21.0' + browserslist: ">= 4.21.0" + + upper-case-first@2.0.2: + resolution: + { integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== } + + upper-case@2.0.2: + resolution: + { integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== } uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + resolution: + { integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== } util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} + resolution: + { integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== } - uuid@10.0.0: - resolution: {integrity: sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==} + uuid@11.1.0: + resolution: + { integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A== } hasBin: true v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + resolution: + { integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== } validate-npm-package-license@3.0.4: - resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + resolution: + { integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew== } - validate-npm-package-name@5.0.1: - resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + validate-npm-package-name@6.0.2: + resolution: + { integrity: sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ== } + engines: { node: ^18.17.0 || >=20.5.0 } - vanilla-picker@2.12.2: - resolution: {integrity: sha512-dk0gNeNL9fQFGd1VEhNDQfFlbCqAiksRh1H2tVPlavkH88n/a/y30rXi9PPKrYPTK5kEfPO4xcldt4ts/1wIAg==} + vanilla-picker@2.12.3: + resolution: + { integrity: sha512-qVkT1E7yMbUsB2mmJNFmaXMWE2hF8ffqzMMwe9zdAikd8u2VfnsVY2HQcOUi2F38bgbxzlJBEdS1UUhOXdF9GQ== } vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true + resolution: + { integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== } + engines: { node: ">= 0.8" } vite@6.3.6: - resolution: {integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + resolution: + { integrity: sha512-0msEVHJEScQbhkbVTb/4iHZdJ6SXp/AvxL2sjwYQFfBqleHtnCqv1J3sa9zbWz/6kW1m9Tfzn92vW+kZ1WV6QA== } + engines: { node: ^18.0.0 || ^20.0.0 || >=22.0.0 } hasBin: true peerDependencies: - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - jiti: '>=1.21.0' - less: '*' + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" + less: "*" lightningcss: ^1.21.0 - sass: '*' - sass-embedded: '*' - stylus: '*' - sugarss: '*' + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true jiti: optional: true @@ -8733,24 +10488,25 @@ packages: yaml: optional: true - vite@7.1.5: - resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} - engines: {node: ^20.19.0 || >=22.12.0} + vite@7.3.0: + resolution: + { integrity: sha512-dZwN5L1VlUBewiP6H9s2+B3e3Jg96D0vzN+Ry73sOefebhYr9f94wwkMNN/9ouoU8pV1BqA1d1zGk8928cx0rg== } + engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' + "@types/node": ^20.19.0 || >=22.12.0 + jiti: ">=1.21.0" less: ^4.0.0 lightningcss: ^1.21.0 sass: ^1.70.0 sass-embedded: ^1.70.0 - stylus: '>=0.54.8' + stylus: ">=0.54.8" sugarss: ^5.0.0 terser: ^5.16.0 tsx: ^4.8.1 yaml: ^2.4.2 peerDependenciesMeta: - '@types/node': + "@types/node": optional: true jiti: optional: true @@ -8773,212 +10529,264 @@ packages: yaml: optional: true - vitest@3.2.4: - resolution: {integrity: sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} + vitest@4.0.16: + resolution: + { integrity: sha512-E4t7DJ9pESL6E3I8nFjPa4xGUd3PmiWDLsDztS2qXSJWfHtbQnwAWylaBvSNY48I3vr8PTqIZlyK8TE3V3CA4Q== } + engines: { node: ^20.0.0 || ^22.0.0 || >=24.0.0 } hasBin: true peerDependencies: - '@edge-runtime/vm': '*' - '@types/debug': ^4.1.12 - '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.2.4 - '@vitest/ui': 3.2.4 - happy-dom: '*' - jsdom: '*' + "@edge-runtime/vm": "*" + "@opentelemetry/api": ^1.9.0 + "@types/node": ^20.0.0 || ^22.0.0 || >=24.0.0 + "@vitest/browser-playwright": 4.0.16 + "@vitest/browser-preview": 4.0.16 + "@vitest/browser-webdriverio": 4.0.16 + "@vitest/ui": 4.0.16 + happy-dom: "*" + jsdom: "*" peerDependenciesMeta: - '@edge-runtime/vm': + "@edge-runtime/vm": + optional: true + "@opentelemetry/api": optional: true - '@types/debug': + "@types/node": optional: true - '@types/node': + "@vitest/browser-playwright": optional: true - '@vitest/browser': + "@vitest/browser-preview": optional: true - '@vitest/ui': + "@vitest/browser-webdriverio": + optional: true + "@vitest/ui": optional: true happy-dom: optional: true jsdom: optional: true + vm2@3.10.0: + resolution: + { integrity: sha512-3ggF4Bs0cw4M7Rxn19/Cv3nJi04xrgHwt4uLto+zkcZocaKwP/nKP9wPx6ggN2X0DSXxOOIc63BV1jvES19wXQ== } + engines: { node: ">=6.0" } + hasBin: true + void-elements@3.1.0: - resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} - engines: {node: '>=0.10.0'} + resolution: + { integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== } + engines: { node: ">=0.10.0" } w3c-xmlserializer@5.0.0: - resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA== } + engines: { node: ">=18" } - walk-up-path@3.0.1: - resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + walk-up-path@4.0.0: + resolution: + { integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A== } + engines: { node: 20 || >=22 } walkdir@0.4.1: - resolution: {integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==} - engines: {node: '>=6.0.0'} + resolution: + { integrity: sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ== } + engines: { node: ">=6.0.0" } - watchpack@2.4.1: - resolution: {integrity: sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==} - engines: {node: '>=10.13.0'} + watchpack@2.4.4: + resolution: + { integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA== } + engines: { node: ">=10.13.0" } wcwidth@1.0.1: - resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + resolution: + { integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg== } webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - webidl-conversions@7.0.0: - resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} - engines: {node: '>=12'} - - webpack-bundle-analyzer@4.10.2: - resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} - engines: {node: '>= 10.13.0'} - hasBin: true - - webpack-cli@5.1.4: - resolution: {integrity: sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==} - engines: {node: '>=14.15.0'} + resolution: + { integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== } + + webidl-conversions@8.0.0: + resolution: + { integrity: sha512-n4W4YFyz5JzOfQeA8oN7dUYpR+MBP3PIUsn2jLjWXwK5ASUzt0Jc/A5sAUZoCYFJRGF0FBKJ+1JjN43rNdsQzA== } + engines: { node: ">=20" } + + webpack-bundle-analyzer@5.1.0: + resolution: + { integrity: sha512-WAWwIoIUx4yC2AEBqXbDkcmh/LzAaenv0+nISBflP5l+XIXO9/x6poWarGA3RTrfavk9H3oWQ64Wm0z26/UGKA== } + engines: { node: ">= 20.9.0" } hasBin: true - peerDependencies: - '@webpack-cli/generators': '*' - webpack: 5.x.x - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' - peerDependenciesMeta: - '@webpack-cli/generators': - optional: true - webpack-bundle-analyzer: - optional: true - webpack-dev-server: - optional: true webpack-cli@6.0.1: - resolution: {integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw==} - engines: {node: '>=18.12.0'} + resolution: + { integrity: sha512-MfwFQ6SfwinsUVi0rNJm7rHZ31GyTcpVE5pgVA3hwFRb7COD4TzjUUwhGWKfO50+xdc2MQPuEBBJoqIMGt3JDw== } + engines: { node: ">=18.12.0" } hasBin: true peerDependencies: webpack: ^5.82.0 - webpack-bundle-analyzer: '*' - webpack-dev-server: '*' + webpack-bundle-analyzer: "*" + webpack-dev-server: "*" peerDependenciesMeta: webpack-bundle-analyzer: optional: true webpack-dev-server: optional: true - webpack-merge@5.9.0: - resolution: {integrity: sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==} - engines: {node: '>=10.0.0'} - webpack-merge@6.0.1: - resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} - engines: {node: '>=18.0.0'} + resolution: + { integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg== } + engines: { node: ">=18.0.0" } webpack-sources@3.3.3: - resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} - engines: {node: '>=10.13.0'} - - webpack@5.101.0: - resolution: {integrity: sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==} - engines: {node: '>=10.13.0'} + resolution: + { integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg== } + engines: { node: ">=10.13.0" } + + webpack@5.104.1: + resolution: + { integrity: sha512-Qphch25abbMNtekmEGJmeRUhLDbe+QfiWTiqpKYkpCOWY64v9eyl+KRRLmqOFA2AvKPpc9DC6+u2n76tQLBoaA== } + engines: { node: ">=10.13.0" } hasBin: true peerDependencies: - webpack-cli: '*' + webpack-cli: "*" peerDependenciesMeta: webpack-cli: optional: true - whatwg-encoding@3.1.1: - resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} - engines: {node: '>=18'} - whatwg-mimetype@4.0.0: - resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg== } + engines: { node: ">=18" } - whatwg-url@14.2.0: - resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} - engines: {node: '>=18'} + whatwg-url@15.1.0: + resolution: + { integrity: sha512-2ytDk0kiEj/yu90JOAp44PVPUkO9+jVhyf+SybKlRHSDlvOOZhdPIrr7xTH64l4WixO2cP+wQIcgujkGBPPz6g== } + engines: { node: ">=20" } whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + resolution: + { integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== } + + which-boxed-primitive@1.1.1: + resolution: + { integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA== } + engines: { node: ">= 0.4" } + + which-builtin-type@1.2.1: + resolution: + { integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q== } + engines: { node: ">= 0.4" } - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + which-collection@1.0.2: + resolution: + { integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw== } + engines: { node: ">= 0.4" } - which-typed-array@1.1.13: - resolution: {integrity: sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==} - engines: {node: '>= 0.4'} + which-typed-array@1.1.19: + resolution: + { integrity: sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw== } + engines: { node: ">= 0.4" } which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} + resolution: + { integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== } + engines: { node: ">= 8" } hasBin: true - which@4.0.0: - resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} - engines: {node: ^16.13.0 || >=18.0.0} + which@5.0.0: + resolution: + { integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ== } + engines: { node: ^18.17.0 || >=20.5.0 } + hasBin: true + + which@6.0.0: + resolution: + { integrity: sha512-f+gEpIKMR9faW/JgAgPK1D7mekkFoqbmiwvNzuhsHetni20QSgzg9Vhn0g2JSJkkfehQnqdUAx7/e15qS1lPxg== } + engines: { node: ^20.17.0 || >=22.9.0 } hasBin: true why-is-node-running@2.3.0: - resolution: {integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w== } + engines: { node: ">=8" } hasBin: true wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + resolution: + { integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg== } wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} + resolution: + { integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== } - winston-transport@4.5.0: - resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} - engines: {node: '>= 6.4.0'} + winston-transport@4.9.0: + resolution: + { integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A== } + engines: { node: ">= 12.0.0" } - winston@3.11.0: - resolution: {integrity: sha512-L3yR6/MzZAOl0DsysUXHVjOwv8mKZ71TrA/41EIduGpOOV5LQVodqN+QdQ6BS6PJ/RdIshZhq84P/fStEZkk7g==} - engines: {node: '>= 12.0.0'} + winston@3.19.0: + resolution: + { integrity: sha512-LZNJgPzfKR+/J3cHkxcpHKpKKvGfDZVPS4hfJCc4cCG0CgYzvlD6yE/S3CIL/Yt91ak327YCpiF/0MyeZHEHKA== } + engines: { node: ">= 12.0.0" } with@7.0.2: - resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} - engines: {node: '>= 10.0.0'} + resolution: + { integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w== } + engines: { node: ">= 10.0.0" } wordwrap@1.0.0: - resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + resolution: + { integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== } + + wrap-ansi@6.2.0: + resolution: + { integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== } + engines: { node: ">=8" } wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== } + engines: { node: ">=10" } wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== } + engines: { node: ">=12" } wrap-ansi@9.0.0: - resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== } + engines: { node: ">=18" } wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + resolution: + { integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== } write-file-atomic@2.4.3: - resolution: {integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==} + resolution: + { integrity: sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ== } write-file-atomic@5.0.1: - resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} - engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + resolution: + { integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw== } + engines: { node: ^14.17.0 || ^16.13.0 || >=18.0.0 } + + write-file-atomic@6.0.0: + resolution: + { integrity: sha512-GmqrO8WJ1NuzJ2DrziEI2o57jKAVIQNf8a18W3nCYU3H7PNWqCCVTeH6/NQE93CIllIgQS98rrmVkYgTX9fFJQ== } + engines: { node: ^18.17.0 || >=20.5.0 } write-json-file@3.2.0: - resolution: {integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-3xZqT7Byc2uORAatYiP3DHUUAVEkNOswEWNs9H5KXiicRTvzYzYqKjYc4G7p+8pltvAw641lVByKVtMpf+4sYQ== } + engines: { node: ">=6" } write-pkg@4.0.0: - resolution: {integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA==} - engines: {node: '>=8'} + resolution: + { integrity: sha512-v2UQ+50TNf2rNHJ8NyWttfm/EJUBWMJcx6ZTYZr6Qp52uuegWw/lBkCtCbnYZEmPRNL61m+u67dAmGxo+HTULA== } + engines: { node: ">=8" } ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} + resolution: + { integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== } + engines: { node: ">=8.3.0" } peerDependencies: bufferutil: ^4.0.1 utf-8-validate: ^5.0.2 @@ -8988,12 +10796,13 @@ packages: utf-8-validate: optional: true - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} + ws@8.18.3: + resolution: + { integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg== } + engines: { node: ">=10.0.0" } peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true @@ -9001,1075 +10810,990 @@ packages: optional: true xml-name-validator@5.0.0: - resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} - engines: {node: '>=18'} + resolution: + { integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg== } + engines: { node: ">=18" } xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + resolution: + { integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== } xtend@4.0.2: - resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} - engines: {node: '>=0.4'} + resolution: + { integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== } + engines: { node: ">=0.4" } y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== } + engines: { node: ">=10" } yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + resolution: + { integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== } yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - yaml@2.8.0: - resolution: {integrity: sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==} - engines: {node: '>= 14.6'} + resolution: + { integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== } + + yallist@5.0.0: + resolution: + { integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw== } + engines: { node: ">=18" } + + yaml@2.8.1: + resolution: + { integrity: sha512-lcYcMxX2PO9XMGvAJkJ3OsNMw+/7FKes7/hgerGUYWIoWu5j/+YQqcZr5JnPZWzOsEBgMbSbiSTn/dv/69Mkpw== } + engines: { node: ">= 14.6" } hasBin: true yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== } + engines: { node: ">=10" } yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== } + engines: { node: ">=12" } yargs-parser@22.0.0: - resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + resolution: + { integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw== } + engines: { node: ^20.19.0 || ^22.12.0 || >=23 } yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== } + engines: { node: ">=10" } yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} + resolution: + { integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== } + engines: { node: ">=12" } yargs@18.0.0: - resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} - engines: {node: ^20.19.0 || ^22.12.0 || >=23} + resolution: + { integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg== } + engines: { node: ^20.19.0 || ^22.12.0 || >=23 } yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + resolution: + { integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== } yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} + resolution: + { integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== } + engines: { node: ">=6" } yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} + resolution: + { integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== } + engines: { node: ">=10" } yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} + resolution: + { integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== } + engines: { node: ">=12.20" } + + yoctocolors-cjs@2.1.3: + resolution: + { integrity: sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw== } + engines: { node: ">=18" } snapshots: + "@aashutoshrathi/word-wrap@1.2.6": {} - '@aashutoshrathi/word-wrap@1.2.6': {} + "@acemir/cssom@0.9.29": {} - '@adobe/css-tools@4.3.3': {} + "@adobe/css-tools@4.3.3": {} - '@ampproject/remapping@2.3.0': + "@asamuzakjp/css-color@4.1.1": dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + "@csstools/css-calc": 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + "@csstools/css-color-parser": 3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) + "@csstools/css-tokenizer": 3.0.4 + lru-cache: 11.2.4 - '@asamuzakjp/css-color@2.8.3': + "@asamuzakjp/dom-selector@6.7.6": dependencies: - '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-color-parser': 3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 - lru-cache: 10.4.3 + "@asamuzakjp/nwsapi": 2.3.9 + bidi-js: 1.0.3 + css-tree: 3.1.0 + is-potential-custom-element-name: 1.0.1 + lru-cache: 11.2.4 - '@augment-vir/assert@31.17.1': - dependencies: - '@augment-vir/core': 31.17.1 - '@date-vir/duration': 7.3.1 - deep-eql: 5.0.2 - expect-type: 1.2.1 - type-fest: 4.41.0 + "@asamuzakjp/nwsapi@2.3.9": {} - '@augment-vir/assert@31.2.0': + "@augment-vir/assert@31.54.4": dependencies: - '@augment-vir/core': 31.2.0 - '@date-vir/duration': 7.1.1 + "@augment-vir/core": 31.54.4 + "@date-vir/duration": 8.1.0 deep-eql: 5.0.2 - expect-type: 1.1.0 - type-fest: 4.30.2 - - '@augment-vir/common@23.4.0': - dependencies: - browser-or-node: 2.1.1 - run-time-assertions: 1.0.0 - type-fest: 4.10.3 - - '@augment-vir/common@28.2.4': - dependencies: - browser-or-node: 3.0.0 - run-time-assertions: 1.5.1 - type-fest: 4.20.1 + expect-type: 1.3.0 + type-fest: 5.3.1 - '@augment-vir/common@31.17.1': + "@augment-vir/common@31.54.4": dependencies: - '@augment-vir/assert': 31.17.1 - '@augment-vir/core': 31.17.1 - '@date-vir/duration': 7.3.1 - ansi-styles: 6.2.1 - json5: 2.2.3 - type-fest: 4.41.0 - typed-event-target: 4.0.4 - - '@augment-vir/core@31.17.1': - dependencies: - '@date-vir/duration': 7.3.1 - browser-or-node: 3.0.0 + "@augment-vir/assert": 31.54.4 + "@augment-vir/core": 31.54.4 + "@date-vir/duration": 8.1.0 + ansi-styles: 6.2.3 + deepcopy-esm: 2.1.1 json5: 2.2.3 - type-fest: 4.41.0 + type-fest: 5.3.1 + typed-event-target: 4.1.0 - '@augment-vir/core@31.2.0': + "@augment-vir/core@31.54.4": dependencies: - '@date-vir/duration': 7.1.1 + "@date-vir/duration": 8.1.0 browser-or-node: 3.0.0 + diff: 8.0.2 json5: 2.2.3 - type-fest: 4.30.2 + type-fest: 5.3.1 - '@babel/code-frame@7.27.1': + "@babel/code-frame@7.27.1": dependencies: - '@babel/helper-validator-identifier': 7.27.1 + "@babel/helper-validator-identifier": 7.27.1 js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.24.1': {} + "@babel/compat-data@7.28.0": {} - '@babel/compat-data@7.27.2': {} + "@babel/compat-data@7.28.5": {} - '@babel/core@7.28.0': + "@babel/core@7.28.5": dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.27.3(@babel/core@7.28.0) - '@babel/helpers': 7.28.2 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + "@babel/code-frame": 7.27.1 + "@babel/generator": 7.28.5 + "@babel/helper-compilation-targets": 7.27.2 + "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.5) + "@babel/helpers": 7.28.4 + "@babel/parser": 7.28.5 + "@babel/template": 7.27.2 + "@babel/traverse": 7.28.5 + "@babel/types": 7.28.5 + "@jridgewell/remapping": 2.3.5 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/generator@7.27.1': + "@babel/generator@7.28.5": dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + "@babel/parser": 7.28.5 + "@babel/types": 7.28.5 + "@jridgewell/gen-mapping": 0.3.12 + "@jridgewell/trace-mapping": 0.3.29 jsesc: 3.0.2 - '@babel/generator@7.28.0': + "@babel/helper-annotate-as-pure@7.27.3": dependencies: - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 - '@jridgewell/gen-mapping': 0.3.12 - '@jridgewell/trace-mapping': 0.3.29 - jsesc: 3.0.2 - - '@babel/helper-annotate-as-pure@7.22.5': - dependencies: - '@babel/types': 7.27.1 + "@babel/types": 7.28.5 - '@babel/helper-builder-binary-assignment-operator-visitor@7.22.15': + "@babel/helper-compilation-targets@7.27.2": dependencies: - '@babel/types': 7.27.1 - - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.27.2 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.25.1 + "@babel/compat-data": 7.28.0 + "@babel/helper-validator-option": 7.27.1 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 - '@babel/helper-create-class-features-plugin@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.28.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 + "@babel/helper-create-class-features-plugin@7.28.3(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-annotate-as-pure": 7.27.3 + "@babel/helper-member-expression-to-functions": 7.27.1 + "@babel/helper-optimise-call-expression": 7.27.1 + "@babel/helper-replace-supers": 7.27.1(@babel/core@7.28.5) + "@babel/helper-skip-transparent-expression-wrappers": 7.27.1 + "@babel/traverse": 7.28.5 semver: 6.3.1 + transitivePeerDependencies: + - supports-color - '@babel/helper-create-regexp-features-plugin@7.22.15(@babel/core@7.28.0)': + "@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.22.5 - regexpu-core: 5.3.2 + "@babel/core": 7.28.5 + "@babel/helper-annotate-as-pure": 7.27.3 + regexpu-core: 6.2.0 semver: 6.3.1 - '@babel/helper-define-polyfill-provider@0.6.1(@babel/core@7.28.0)': + "@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.24.0 - debug: 4.4.0 + "@babel/core": 7.28.5 + "@babel/helper-compilation-targets": 7.27.2 + "@babel/helper-plugin-utils": 7.27.1 + debug: 4.4.3(supports-color@5.5.0) lodash.debounce: 4.0.8 - resolve: 1.22.8 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - '@babel/helper-environment-visitor@7.22.20': {} - - '@babel/helper-function-name@7.23.0': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.27.1 - - '@babel/helper-globals@7.28.0': {} + "@babel/helper-globals@7.28.0": {} - '@babel/helper-hoist-variables@7.22.5': + "@babel/helper-member-expression-to-functions@7.27.1": dependencies: - '@babel/types': 7.27.1 - - '@babel/helper-member-expression-to-functions@7.23.0': - dependencies: - '@babel/types': 7.27.1 - - '@babel/helper-module-imports@7.24.3': - dependencies: - '@babel/types': 7.27.1 - - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.0 - '@babel/types': 7.28.2 + "@babel/traverse": 7.28.5 + "@babel/types": 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.1(@babel/core@7.28.0)': + "@babel/helper-module-imports@7.27.1": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.27.1 + "@babel/traverse": 7.28.5 + "@babel/types": 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.27.3(@babel/core@7.28.0)': + "@babel/helper-module-transforms@7.28.3(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - '@babel/traverse': 7.28.0 + "@babel/core": 7.28.5 + "@babel/helper-module-imports": 7.27.1 + "@babel/helper-validator-identifier": 7.27.1 + "@babel/traverse": 7.28.5 transitivePeerDependencies: - supports-color - '@babel/helper-optimise-call-expression@7.22.5': - dependencies: - '@babel/types': 7.27.1 - - '@babel/helper-plugin-utils@7.24.0': {} - - '@babel/helper-remap-async-to-generator@7.22.20(@babel/core@7.28.0)': + "@babel/helper-optimise-call-expression@7.27.1": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-wrap-function': 7.22.20 + "@babel/types": 7.28.5 - '@babel/helper-replace-supers@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-member-expression-to-functions': 7.23.0 - '@babel/helper-optimise-call-expression': 7.22.5 + "@babel/helper-plugin-utils@7.27.1": {} - '@babel/helper-simple-access@7.22.5': + "@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/types': 7.27.1 + "@babel/core": 7.28.5 + "@babel/helper-annotate-as-pure": 7.27.3 + "@babel/helper-wrap-function": 7.28.3 + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + "@babel/helper-replace-supers@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/types': 7.27.1 + "@babel/core": 7.28.5 + "@babel/helper-member-expression-to-functions": 7.27.1 + "@babel/helper-optimise-call-expression": 7.27.1 + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/helper-split-export-declaration@7.22.6': + "@babel/helper-skip-transparent-expression-wrappers@7.27.1": dependencies: - '@babel/types': 7.27.1 - - '@babel/helper-string-parser@7.27.1': {} - - '@babel/helper-validator-identifier@7.22.20': {} - - '@babel/helper-validator-identifier@7.27.1': {} + "@babel/traverse": 7.28.5 + "@babel/types": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/helper-validator-option@7.23.5': {} + "@babel/helper-string-parser@7.27.1": {} - '@babel/helper-validator-option@7.27.1': {} + "@babel/helper-validator-identifier@7.27.1": {} - '@babel/helper-wrap-function@7.22.20': - dependencies: - '@babel/helper-function-name': 7.23.0 - '@babel/template': 7.27.2 - '@babel/types': 7.27.1 + "@babel/helper-validator-identifier@7.28.5": {} - '@babel/helpers@7.28.2': - dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 + "@babel/helper-validator-option@7.27.1": {} - '@babel/parser@7.27.2': + "@babel/helper-wrap-function@7.28.3": dependencies: - '@babel/types': 7.27.1 + "@babel/template": 7.27.2 + "@babel/traverse": 7.28.5 + "@babel/types": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/parser@7.28.0': + "@babel/helpers@7.28.4": dependencies: - '@babel/types': 7.28.2 + "@babel/template": 7.27.2 + "@babel/types": 7.28.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.24.1(@babel/core@7.28.0)': + "@babel/parser@7.28.0": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/types": 7.28.2 - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.24.1(@babel/core@7.28.0)': + "@babel/parser@7.28.3": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.28.0) + "@babel/types": 7.28.2 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.24.1(@babel/core@7.28.0)': + "@babel/parser@7.28.5": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/types": 7.28.5 - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0)': + "@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.28.0)': + "@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.28.0)': + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.28.0)': + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": 7.27.1 + "@babel/plugin-transform-optional-chaining": 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.28.0)': + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.28.0)': + "@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 - '@babel/plugin-syntax-import-assertions@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-import-attributes@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.28.0)': + "@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.28.0)': + "@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.28.0)': + "@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-remap-async-to-generator": 7.27.1(@babel/core@7.28.5) + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.28.0)': + "@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-module-imports": 7.27.1 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-remap-async-to-generator": 7.27.1(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.28.0)': + "@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.28.0)': + "@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.28.0)': + "@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-create-class-features-plugin": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.28.0)': + "@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-create-class-features-plugin": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.28.0)': + "@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-annotate-as-pure": 7.27.3 + "@babel/helper-compilation-targets": 7.27.2 + "@babel/helper-globals": 7.28.0 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-replace-supers": 7.27.1(@babel/core@7.28.5) + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.28.0)': + "@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/template": 7.27.2 - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.0)': + "@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-arrow-functions@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-async-generator-functions@7.24.3(@babel/core@7.28.0)': + "@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-async-to-generator@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-imports': 7.24.3 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-remap-async-to-generator': 7.22.20(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-block-scoped-functions@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-block-scoping@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/plugin-transform-destructuring": 7.28.5(@babel/core@7.28.5) + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-class-properties@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-class-static-block@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-classes@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.28.0) - '@babel/helper-split-export-declaration': 7.22.6 - globals: 11.12.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-computed-properties@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/template': 7.27.2 + "@babel/core": 7.28.5 + "@babel/helper-compilation-targets": 7.27.2 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-destructuring@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-dotall-regex@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-duplicate-keys@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-dynamic-import@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.15 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-export-namespace-from@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-for-of@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-modules-systemjs@7.28.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + "@babel/core": 7.28.5 + "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-validator-identifier": 7.28.5 + "@babel/traverse": 7.28.5 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-function-name@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-module-transforms": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-json-strings@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-literals@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-member-expression-literals@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-modules-amd@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-compilation-targets": 7.27.2 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/plugin-transform-destructuring": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-transform-parameters": 7.27.7(@babel/core@7.28.5) + "@babel/traverse": 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-simple-access': 7.22.5 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-replace-supers": 7.27.1(@babel/core@7.28.5) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-modules-systemjs@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-identifier': 7.22.20 - transitivePeerDependencies: - - supports-color + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-modules-umd@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-module-transforms': 7.27.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-named-capturing-groups-regex@7.22.5(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-new-target@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) - - '@babel/plugin-transform-numeric-separator@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) - - '@babel/plugin-transform-object-rest-spread@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.28.0) - - '@babel/plugin-transform-object-super@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-replace-supers': 7.24.1(@babel/core@7.28.0) - - '@babel/plugin-transform-optional-catch-binding@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-optional-chaining@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-create-class-features-plugin": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-parameters@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-annotate-as-pure": 7.27.3 + "@babel/helper-create-class-features-plugin": 7.28.3(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-private-methods@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-private-property-in-object@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-annotate-as-pure': 7.22.5 - '@babel/helper-create-class-features-plugin': 7.24.1(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-property-literals@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-regenerator@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - regenerator-transform: 0.15.2 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-reserved-words@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 - '@babel/plugin-transform-shorthand-properties@7.24.1(@babel/core@7.28.0)': + "@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-skip-transparent-expression-wrappers": 7.27.1 + transitivePeerDependencies: + - supports-color - '@babel/plugin-transform-spread@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 - - '@babel/plugin-transform-sticky-regex@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-template-literals@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-typeof-symbol@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-unicode-escapes@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-unicode-property-regex@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-unicode-regex@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/plugin-transform-unicode-sets-regex@7.24.1(@babel/core@7.28.0)': - dependencies: - '@babel/core': 7.28.0 - '@babel/helper-create-regexp-features-plugin': 7.22.15(@babel/core@7.28.0) - '@babel/helper-plugin-utils': 7.24.0 - - '@babel/preset-env@7.24.3(@babel/core@7.28.0)': - dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.28.0 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/helper-validator-option': 7.23.5 - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.0) - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.28.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.0) - '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-import-assertions': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-attributes': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.28.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.28.0) - '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.28.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.0) - '@babel/plugin-transform-arrow-functions': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-async-generator-functions': 7.24.3(@babel/core@7.28.0) - '@babel/plugin-transform-async-to-generator': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoped-functions': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-block-scoping': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-class-properties': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-class-static-block': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-classes': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-computed-properties': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-destructuring': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-dotall-regex': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-duplicate-keys': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-dynamic-import': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-exponentiation-operator': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-export-namespace-from': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-for-of': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-function-name': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-json-strings': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-literals': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-logical-assignment-operators': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-member-expression-literals': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-amd': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-systemjs': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-modules-umd': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.22.5(@babel/core@7.28.0) - '@babel/plugin-transform-new-target': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-numeric-separator': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-object-rest-spread': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-object-super': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-catch-binding': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-optional-chaining': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-parameters': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-methods': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-private-property-in-object': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-property-literals': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-regenerator': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-reserved-words': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-shorthand-properties': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-spread': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-sticky-regex': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-template-literals': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-typeof-symbol': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-escapes': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-property-regex': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-regex': 7.24.1(@babel/core@7.28.0) - '@babel/plugin-transform-unicode-sets-regex': 7.24.1(@babel/core@7.28.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.0) - babel-plugin-polyfill-corejs2: 0.4.10(@babel/core@7.28.0) - babel-plugin-polyfill-corejs3: 0.10.4(@babel/core@7.28.0) - babel-plugin-polyfill-regenerator: 0.6.1(@babel/core@7.28.0) - core-js-compat: 3.35.1 + "@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + + "@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + + "@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + + "@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + + "@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + + "@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + + "@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.5)": + dependencies: + "@babel/core": 7.28.5 + "@babel/helper-create-regexp-features-plugin": 7.27.1(@babel/core@7.28.5) + "@babel/helper-plugin-utils": 7.27.1 + + "@babel/preset-env@7.28.5(@babel/core@7.28.5)": + dependencies: + "@babel/compat-data": 7.28.5 + "@babel/core": 7.28.5 + "@babel/helper-compilation-targets": 7.27.2 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/helper-validator-option": 7.27.1 + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-bugfix-safari-class-field-initializer-scope": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": 7.28.3(@babel/core@7.28.5) + "@babel/plugin-proposal-private-property-in-object": 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.5) + "@babel/plugin-syntax-import-assertions": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-syntax-import-attributes": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-syntax-unicode-sets-regex": 7.18.6(@babel/core@7.28.5) + "@babel/plugin-transform-arrow-functions": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-async-generator-functions": 7.28.0(@babel/core@7.28.5) + "@babel/plugin-transform-async-to-generator": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-block-scoped-functions": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-block-scoping": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-transform-class-properties": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-class-static-block": 7.28.3(@babel/core@7.28.5) + "@babel/plugin-transform-classes": 7.28.4(@babel/core@7.28.5) + "@babel/plugin-transform-computed-properties": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-destructuring": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-transform-dotall-regex": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-duplicate-keys": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-dynamic-import": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-explicit-resource-management": 7.28.0(@babel/core@7.28.5) + "@babel/plugin-transform-exponentiation-operator": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-transform-export-namespace-from": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-for-of": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-function-name": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-json-strings": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-literals": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-logical-assignment-operators": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-transform-member-expression-literals": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-modules-amd": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-modules-commonjs": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-modules-systemjs": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-transform-modules-umd": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-named-capturing-groups-regex": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-new-target": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-nullish-coalescing-operator": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-numeric-separator": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-object-rest-spread": 7.28.4(@babel/core@7.28.5) + "@babel/plugin-transform-object-super": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-optional-catch-binding": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-optional-chaining": 7.28.5(@babel/core@7.28.5) + "@babel/plugin-transform-parameters": 7.27.7(@babel/core@7.28.5) + "@babel/plugin-transform-private-methods": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-private-property-in-object": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-property-literals": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-regenerator": 7.28.4(@babel/core@7.28.5) + "@babel/plugin-transform-regexp-modifiers": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-reserved-words": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-shorthand-properties": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-spread": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-sticky-regex": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-template-literals": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-typeof-symbol": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-unicode-escapes": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-unicode-property-regex": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-unicode-regex": 7.27.1(@babel/core@7.28.5) + "@babel/plugin-transform-unicode-sets-regex": 7.27.1(@babel/core@7.28.5) + "@babel/preset-modules": 0.1.6-no-external-plugins(@babel/core@7.28.5) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.5) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.5) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.45.1 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.0)': + "@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.5)": dependencies: - '@babel/core': 7.28.0 - '@babel/helper-plugin-utils': 7.24.0 - '@babel/types': 7.27.1 + "@babel/core": 7.28.5 + "@babel/helper-plugin-utils": 7.27.1 + "@babel/types": 7.28.5 esutils: 2.0.3 - '@babel/regjsgen@0.8.0': {} - - '@babel/runtime@7.21.5': - dependencies: - regenerator-runtime: 0.13.11 - - '@babel/template@7.27.2': - dependencies: - '@babel/code-frame': 7.27.1 - '@babel/parser': 7.28.0 - '@babel/types': 7.28.2 - - '@babel/traverse@7.27.1': + "@babel/template@7.27.2": dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.27.1 - '@babel/parser': 7.27.2 - '@babel/template': 7.27.2 - '@babel/types': 7.27.1 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + "@babel/code-frame": 7.27.1 + "@babel/parser": 7.28.5 + "@babel/types": 7.28.5 - '@babel/traverse@7.28.0': + "@babel/traverse@7.28.5": dependencies: - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.0 - '@babel/helper-globals': 7.28.0 - '@babel/parser': 7.28.0 - '@babel/template': 7.27.2 - '@babel/types': 7.28.2 - debug: 4.4.0 + "@babel/code-frame": 7.27.1 + "@babel/generator": 7.28.5 + "@babel/helper-globals": 7.28.0 + "@babel/parser": 7.28.5 + "@babel/template": 7.27.2 + "@babel/types": 7.28.5 + debug: 4.4.1 transitivePeerDependencies: - supports-color - '@babel/types@7.27.1': + "@babel/types@7.28.2": dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + "@babel/helper-string-parser": 7.27.1 + "@babel/helper-validator-identifier": 7.27.1 - '@babel/types@7.28.2': + "@babel/types@7.28.5": dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 + "@babel/helper-string-parser": 7.27.1 + "@babel/helper-validator-identifier": 7.28.5 - '@bcoe/v8-coverage@1.0.2': {} + "@bcoe/v8-coverage@1.0.2": {} - '@colors/colors@1.5.0': {} + "@colors/colors@1.6.0": {} - '@colors/colors@1.6.0': {} - - '@commitlint/cli@19.8.1(@types/node@24.1.0)(typescript@5.9.2)': + "@commitlint/cli@20.2.0(@types/node@25.0.3)(typescript@5.9.3)": dependencies: - '@commitlint/format': 19.8.1 - '@commitlint/lint': 19.8.1 - '@commitlint/load': 19.8.1(@types/node@24.1.0)(typescript@5.9.2) - '@commitlint/read': 19.8.1 - '@commitlint/types': 19.8.1 + "@commitlint/format": 20.2.0 + "@commitlint/lint": 20.2.0 + "@commitlint/load": 20.2.0(@types/node@25.0.3)(typescript@5.9.3) + "@commitlint/read": 20.2.0 + "@commitlint/types": 20.2.0 tinyexec: 1.0.1 yargs: 17.7.2 transitivePeerDependencies: - - '@types/node' + - "@types/node" - typescript - '@commitlint/config-conventional@19.8.1': + "@commitlint/config-conventional@20.2.0": dependencies: - '@commitlint/types': 19.8.1 + "@commitlint/types": 20.2.0 conventional-changelog-conventionalcommits: 7.0.2 - '@commitlint/config-validator@19.8.1': + "@commitlint/config-validator@20.2.0": dependencies: - '@commitlint/types': 19.8.1 + "@commitlint/types": 20.2.0 ajv: 8.12.0 - '@commitlint/ensure@19.8.1': + "@commitlint/ensure@20.2.0": dependencies: - '@commitlint/types': 19.8.1 + "@commitlint/types": 20.2.0 lodash.camelcase: 4.3.0 lodash.kebabcase: 4.1.1 lodash.snakecase: 4.1.1 lodash.startcase: 4.4.0 lodash.upperfirst: 4.3.1 - '@commitlint/execute-rule@19.8.1': {} + "@commitlint/execute-rule@20.0.0": {} - '@commitlint/format@19.8.1': + "@commitlint/format@20.2.0": dependencies: - '@commitlint/types': 19.8.1 + "@commitlint/types": 20.2.0 chalk: 5.3.0 - '@commitlint/is-ignored@19.8.1': + "@commitlint/is-ignored@20.2.0": dependencies: - '@commitlint/types': 19.8.1 - semver: 7.6.3 + "@commitlint/types": 20.2.0 + semver: 7.7.2 - '@commitlint/lint@19.8.1': + "@commitlint/lint@20.2.0": dependencies: - '@commitlint/is-ignored': 19.8.1 - '@commitlint/parse': 19.8.1 - '@commitlint/rules': 19.8.1 - '@commitlint/types': 19.8.1 + "@commitlint/is-ignored": 20.2.0 + "@commitlint/parse": 20.2.0 + "@commitlint/rules": 20.2.0 + "@commitlint/types": 20.2.0 - '@commitlint/load@19.8.1(@types/node@24.1.0)(typescript@5.9.2)': + "@commitlint/load@20.2.0(@types/node@25.0.3)(typescript@5.9.3)": dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/execute-rule': 19.8.1 - '@commitlint/resolve-extends': 19.8.1 - '@commitlint/types': 19.8.1 + "@commitlint/config-validator": 20.2.0 + "@commitlint/execute-rule": 20.0.0 + "@commitlint/resolve-extends": 20.2.0 + "@commitlint/types": 20.2.0 chalk: 5.3.0 - cosmiconfig: 9.0.0(typescript@5.9.2) - cosmiconfig-typescript-loader: 6.1.0(@types/node@24.1.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) + cosmiconfig-typescript-loader: 6.1.0(@types/node@25.0.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3) lodash.isplainobject: 4.0.6 lodash.merge: 4.6.2 lodash.uniq: 4.5.0 transitivePeerDependencies: - - '@types/node' + - "@types/node" - typescript - '@commitlint/message@19.8.1': {} + "@commitlint/message@20.0.0": {} - '@commitlint/parse@19.8.1': + "@commitlint/parse@20.2.0": dependencies: - '@commitlint/types': 19.8.1 + "@commitlint/types": 20.2.0 conventional-changelog-angular: 7.0.0 conventional-commits-parser: 5.0.0 - '@commitlint/read@19.8.1': + "@commitlint/read@20.2.0": dependencies: - '@commitlint/top-level': 19.8.1 - '@commitlint/types': 19.8.1 + "@commitlint/top-level": 20.0.0 + "@commitlint/types": 20.2.0 git-raw-commits: 4.0.0 minimist: 1.2.8 tinyexec: 1.0.1 - '@commitlint/resolve-extends@19.8.1': + "@commitlint/resolve-extends@20.2.0": dependencies: - '@commitlint/config-validator': 19.8.1 - '@commitlint/types': 19.8.1 + "@commitlint/config-validator": 20.2.0 + "@commitlint/types": 20.2.0 global-directory: 4.0.1 import-meta-resolve: 4.0.0 lodash.mergewith: 4.6.2 resolve-from: 5.0.0 - '@commitlint/rules@19.8.1': + "@commitlint/rules@20.2.0": dependencies: - '@commitlint/ensure': 19.8.1 - '@commitlint/message': 19.8.1 - '@commitlint/to-lines': 19.8.1 - '@commitlint/types': 19.8.1 + "@commitlint/ensure": 20.2.0 + "@commitlint/message": 20.0.0 + "@commitlint/to-lines": 20.0.0 + "@commitlint/types": 20.2.0 - '@commitlint/to-lines@19.8.1': {} + "@commitlint/to-lines@20.0.0": {} - '@commitlint/top-level@19.8.1': + "@commitlint/top-level@20.0.0": dependencies: find-up: 7.0.0 - '@commitlint/types@19.8.1': + "@commitlint/types@20.2.0": dependencies: - '@types/conventional-commits-parser': 5.0.0 + "@types/conventional-commits-parser": 5.0.0 chalk: 5.3.0 - '@cspotcode/source-map-support@0.8.1': + "@cspotcode/source-map-support@0.8.1": dependencies: - '@jridgewell/trace-mapping': 0.3.9 + "@jridgewell/trace-mapping": 0.3.9 - '@csstools/color-helpers@5.0.1': {} + "@csstools/color-helpers@5.1.0": {} - '@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + "@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": dependencies: - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) + "@csstools/css-tokenizer": 3.0.4 - '@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)': + "@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)": dependencies: - '@csstools/color-helpers': 5.0.1 - '@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3) - '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3) - '@csstools/css-tokenizer': 3.0.3 + "@csstools/color-helpers": 5.1.0 + "@csstools/css-calc": 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) + "@csstools/css-parser-algorithms": 3.0.5(@csstools/css-tokenizer@3.0.4) + "@csstools/css-tokenizer": 3.0.4 - '@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)': + "@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)": dependencies: - '@csstools/css-tokenizer': 3.0.3 + "@csstools/css-tokenizer": 3.0.4 + + "@csstools/css-syntax-patches-for-csstree@1.0.21": {} - '@csstools/css-tokenizer@3.0.3': {} + "@csstools/css-tokenizer@3.0.4": {} - '@dabh/diagnostics@2.0.3': + "@dabh/diagnostics@2.0.8": dependencies: - colorspace: 1.1.4 + "@so-ric/colorspace": 1.1.6 enabled: 2.0.0 kuler: 2.0.0 - '@datalust/winston-seq@2.0.0(encoding@0.1.13)(winston@3.11.0)': + "@datalust/winston-seq@3.0.1(encoding@0.1.13)(winston@3.19.0)": dependencies: - seq-logging: 2.1.1(encoding@0.1.13) - winston: 3.11.0 - winston-transport: 4.5.0 + seq-logging: 3.0.0(encoding@0.1.13) + winston: 3.19.0 + winston-transport: 4.9.0 transitivePeerDependencies: - encoding - '@date-vir/duration@7.1.1': + "@date-vir/duration@8.1.0": dependencies: - '@types/luxon': 3.4.2 - luxon: 3.5.0 - type-fest: 4.30.2 + "@types/luxon": 3.7.1 + luxon: 3.7.2 + type-fest: 5.3.1 - '@date-vir/duration@7.3.1': - dependencies: - '@types/luxon': 3.4.2 - luxon: 3.5.0 - type-fest: 4.41.0 - - '@dependents/detective-less@3.0.2': - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 5.0.2 - - '@dependents/detective-less@5.0.0': + "@dependents/detective-less@5.0.0": dependencies: gonzales-pe: 4.3.0 node-source-walk: 7.0.0 - '@discoveryjs/json-ext@0.5.7': {} + "@discoveryjs/json-ext@0.5.7": {} - '@discoveryjs/json-ext@0.6.3': {} + "@discoveryjs/json-ext@0.6.3": {} - '@electron/get@2.0.2': + "@electron/get@2.0.3": dependencies: - debug: 4.3.7 + debug: 4.4.3(supports-color@5.5.0) env-paths: 2.2.1 fs-extra: 8.1.0 got: 11.8.6 @@ -10081,202 +11805,221 @@ snapshots: transitivePeerDependencies: - supports-color - '@emnapi/core@1.2.0': + "@emnapi/core@1.2.0": dependencies: - '@emnapi/wasi-threads': 1.0.1 - tslib: 2.6.2 + "@emnapi/wasi-threads": 1.0.1 + tslib: 2.8.1 - '@emnapi/runtime@1.2.0': + "@emnapi/runtime@1.2.0": dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@emnapi/wasi-threads@1.0.1': + "@emnapi/wasi-threads@1.0.1": dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@epic-web/invariant@1.0.0': {} + "@epic-web/invariant@1.0.0": {} - '@es-joy/jsdoccomment@0.43.1': + "@es-joy/jsdoccomment@0.76.0": dependencies: - '@types/eslint': 8.56.6 - '@types/estree': 1.0.8 - '@typescript-eslint/types': 7.14.1 + "@types/estree": 1.0.8 + "@typescript-eslint/types": 8.50.0 comment-parser: 1.4.1 esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.0.0 + jsdoc-type-pratt-parser: 6.10.0 - '@es-joy/jsdoccomment@0.49.0': - dependencies: - comment-parser: 1.4.1 - esquery: 1.6.0 - jsdoc-type-pratt-parser: 4.1.0 + "@es-joy/resolve.exports@1.2.0": {} - '@esbuild/aix-ppc64@0.24.2': + "@esbuild/aix-ppc64@0.25.9": optional: true - '@esbuild/aix-ppc64@0.25.9': + "@esbuild/aix-ppc64@0.27.2": optional: true - '@esbuild/android-arm64@0.24.2': + "@esbuild/android-arm64@0.25.9": optional: true - '@esbuild/android-arm64@0.25.9': + "@esbuild/android-arm64@0.27.2": optional: true - '@esbuild/android-arm@0.24.2': + "@esbuild/android-arm@0.25.9": optional: true - '@esbuild/android-arm@0.25.9': + "@esbuild/android-arm@0.27.2": optional: true - '@esbuild/android-x64@0.24.2': + "@esbuild/android-x64@0.25.9": optional: true - '@esbuild/android-x64@0.25.9': + "@esbuild/android-x64@0.27.2": optional: true - '@esbuild/darwin-arm64@0.24.2': + "@esbuild/darwin-arm64@0.25.9": optional: true - '@esbuild/darwin-arm64@0.25.9': + "@esbuild/darwin-arm64@0.27.2": optional: true - '@esbuild/darwin-x64@0.24.2': + "@esbuild/darwin-x64@0.25.9": optional: true - '@esbuild/darwin-x64@0.25.9': + "@esbuild/darwin-x64@0.27.2": optional: true - '@esbuild/freebsd-arm64@0.24.2': + "@esbuild/freebsd-arm64@0.25.9": optional: true - '@esbuild/freebsd-arm64@0.25.9': + "@esbuild/freebsd-arm64@0.27.2": optional: true - '@esbuild/freebsd-x64@0.24.2': + "@esbuild/freebsd-x64@0.25.9": optional: true - '@esbuild/freebsd-x64@0.25.9': + "@esbuild/freebsd-x64@0.27.2": optional: true - '@esbuild/linux-arm64@0.24.2': + "@esbuild/linux-arm64@0.25.9": optional: true - '@esbuild/linux-arm64@0.25.9': + "@esbuild/linux-arm64@0.27.2": optional: true - '@esbuild/linux-arm@0.24.2': + "@esbuild/linux-arm@0.25.9": optional: true - '@esbuild/linux-arm@0.25.9': + "@esbuild/linux-arm@0.27.2": optional: true - '@esbuild/linux-ia32@0.24.2': + "@esbuild/linux-ia32@0.25.9": optional: true - '@esbuild/linux-ia32@0.25.9': + "@esbuild/linux-ia32@0.27.2": optional: true - '@esbuild/linux-loong64@0.24.2': + "@esbuild/linux-loong64@0.25.9": optional: true - '@esbuild/linux-loong64@0.25.9': + "@esbuild/linux-loong64@0.27.2": optional: true - '@esbuild/linux-mips64el@0.24.2': + "@esbuild/linux-mips64el@0.25.9": optional: true - '@esbuild/linux-mips64el@0.25.9': + "@esbuild/linux-mips64el@0.27.2": optional: true - '@esbuild/linux-ppc64@0.24.2': + "@esbuild/linux-ppc64@0.25.9": optional: true - '@esbuild/linux-ppc64@0.25.9': + "@esbuild/linux-ppc64@0.27.2": optional: true - '@esbuild/linux-riscv64@0.24.2': + "@esbuild/linux-riscv64@0.25.9": optional: true - '@esbuild/linux-riscv64@0.25.9': + "@esbuild/linux-riscv64@0.27.2": optional: true - '@esbuild/linux-s390x@0.24.2': + "@esbuild/linux-s390x@0.25.9": optional: true - '@esbuild/linux-s390x@0.25.9': + "@esbuild/linux-s390x@0.27.2": optional: true - '@esbuild/linux-x64@0.24.2': + "@esbuild/linux-x64@0.25.9": optional: true - '@esbuild/linux-x64@0.25.9': + "@esbuild/linux-x64@0.27.2": optional: true - '@esbuild/netbsd-arm64@0.24.2': + "@esbuild/netbsd-arm64@0.25.9": optional: true - '@esbuild/netbsd-arm64@0.25.9': + "@esbuild/netbsd-arm64@0.27.2": optional: true - '@esbuild/netbsd-x64@0.24.2': + "@esbuild/netbsd-x64@0.25.9": optional: true - '@esbuild/netbsd-x64@0.25.9': + "@esbuild/netbsd-x64@0.27.2": optional: true - '@esbuild/openbsd-arm64@0.24.2': + "@esbuild/openbsd-arm64@0.25.9": optional: true - '@esbuild/openbsd-arm64@0.25.9': + "@esbuild/openbsd-arm64@0.27.2": optional: true - '@esbuild/openbsd-x64@0.24.2': + "@esbuild/openbsd-x64@0.25.9": optional: true - '@esbuild/openbsd-x64@0.25.9': + "@esbuild/openbsd-x64@0.27.2": optional: true - '@esbuild/openharmony-arm64@0.25.9': + "@esbuild/openharmony-arm64@0.25.9": optional: true - '@esbuild/sunos-x64@0.24.2': + "@esbuild/openharmony-arm64@0.27.2": optional: true - '@esbuild/sunos-x64@0.25.9': + "@esbuild/sunos-x64@0.25.9": optional: true - '@esbuild/win32-arm64@0.24.2': + "@esbuild/sunos-x64@0.27.2": optional: true - '@esbuild/win32-arm64@0.25.9': + "@esbuild/win32-arm64@0.25.9": optional: true - '@esbuild/win32-ia32@0.24.2': + "@esbuild/win32-arm64@0.27.2": optional: true - '@esbuild/win32-ia32@0.25.9': + "@esbuild/win32-ia32@0.25.9": optional: true - '@esbuild/win32-x64@0.24.2': + "@esbuild/win32-ia32@0.27.2": optional: true - '@esbuild/win32-x64@0.25.9': + "@esbuild/win32-x64@0.25.9": optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': + "@esbuild/win32-x64@0.27.2": + optional: true + + "@eslint-community/eslint-utils@4.7.0(eslint@9.39.2(jiti@2.4.2))": dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.10.0': {} + "@eslint-community/eslint-utils@4.9.0(eslint@9.39.2(jiti@2.4.2))": + dependencies: + eslint: 9.39.2(jiti@2.4.2) + eslint-visitor-keys: 3.4.3 + + "@eslint-community/regexpp@4.12.1": {} + + "@eslint/config-array@0.21.1": + dependencies: + "@eslint/object-schema": 2.1.7 + debug: 4.4.1 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + "@eslint/config-helpers@0.4.2": + dependencies: + "@eslint/core": 0.17.0 + + "@eslint/core@0.17.0": + dependencies: + "@types/json-schema": 7.0.15 - '@eslint/eslintrc@2.1.4': + "@eslint/eslintrc@3.3.1": dependencies: ajv: 6.12.6 - debug: 4.3.7 - espree: 9.6.1 - globals: 13.20.0 + debug: 4.4.1 + espree: 10.4.0 + globals: 14.0.0 ignore: 5.3.1 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -10285,33 +12028,174 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@8.57.1': {} + "@eslint/js@9.39.2": {} - '@fortawesome/fontawesome-free@6.4.2': {} + "@eslint/object-schema@2.1.7": {} - '@gerrit0/mini-shiki@3.9.1': + "@eslint/plugin-kit@0.4.1": dependencies: - '@shikijs/engine-oniguruma': 3.9.1 - '@shikijs/langs': 3.9.1 - '@shikijs/themes': 3.9.1 - '@shikijs/types': 3.9.1 - '@shikijs/vscode-textmate': 10.0.2 + "@eslint/core": 0.17.0 + levn: 0.4.1 + + "@exodus/bytes@1.6.0": {} - '@humanwhocodes/config-array@0.13.0': + "@fortawesome/fontawesome-free@7.1.0": {} + + "@gerrit0/mini-shiki@3.20.0": dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color + "@shikijs/engine-oniguruma": 3.20.0 + "@shikijs/langs": 3.20.0 + "@shikijs/themes": 3.20.0 + "@shikijs/types": 3.20.0 + "@shikijs/vscode-textmate": 10.0.2 + + "@humanfs/core@0.19.1": {} + + "@humanfs/node@0.16.6": + dependencies: + "@humanfs/core": 0.19.1 + "@humanwhocodes/retry": 0.3.1 + + "@humanwhocodes/module-importer@1.0.1": {} + + "@humanwhocodes/retry@0.3.1": {} + + "@humanwhocodes/retry@0.4.3": {} + + "@hutson/parse-repository-url@3.0.2": {} + + "@inquirer/ansi@1.0.2": {} + + "@inquirer/checkbox@4.3.2(@types/node@25.0.3)": + dependencies: + "@inquirer/ansi": 1.0.2 + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/confirm@5.1.21(@types/node@25.0.3)": + dependencies: + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/core@10.3.2(@types/node@25.0.3)": + dependencies: + "@inquirer/ansi": 1.0.2 + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@25.0.3) + cli-width: 4.1.0 + mute-stream: 2.0.0 + signal-exit: 4.1.0 + wrap-ansi: 6.2.0 + yoctocolors-cjs: 2.1.3 + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/editor@4.2.23(@types/node@25.0.3)": + dependencies: + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/external-editor": 1.0.3(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/expand@4.0.23(@types/node@25.0.3)": + dependencies: + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/external-editor@1.0.3(@types/node@25.0.3)": + dependencies: + chardet: 2.1.1 + iconv-lite: 0.7.1 + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/figures@1.0.15": {} + + "@inquirer/input@4.3.1(@types/node@25.0.3)": + dependencies: + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/number@3.0.23(@types/node@25.0.3)": + dependencies: + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/password@4.0.23(@types/node@25.0.3)": + dependencies: + "@inquirer/ansi": 1.0.2 + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/prompts@7.10.1(@types/node@25.0.3)": + dependencies: + "@inquirer/checkbox": 4.3.2(@types/node@25.0.3) + "@inquirer/confirm": 5.1.21(@types/node@25.0.3) + "@inquirer/editor": 4.2.23(@types/node@25.0.3) + "@inquirer/expand": 4.0.23(@types/node@25.0.3) + "@inquirer/input": 4.3.1(@types/node@25.0.3) + "@inquirer/number": 3.0.23(@types/node@25.0.3) + "@inquirer/password": 4.0.23(@types/node@25.0.3) + "@inquirer/rawlist": 4.1.11(@types/node@25.0.3) + "@inquirer/search": 3.2.2(@types/node@25.0.3) + "@inquirer/select": 4.4.2(@types/node@25.0.3) + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/rawlist@4.1.11(@types/node@25.0.3)": + dependencies: + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + "@types/node": 25.0.3 + + "@inquirer/search@3.2.2(@types/node@25.0.3)": + dependencies: + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + "@types/node": 25.0.3 - '@humanwhocodes/module-importer@1.0.1': {} + "@inquirer/select@4.4.2(@types/node@25.0.3)": + dependencies: + "@inquirer/ansi": 1.0.2 + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/figures": 1.0.15 + "@inquirer/type": 3.0.10(@types/node@25.0.3) + yoctocolors-cjs: 2.1.3 + optionalDependencies: + "@types/node": 25.0.3 - '@humanwhocodes/object-schema@2.0.3': {} + "@inquirer/type@3.0.10(@types/node@25.0.3)": + optionalDependencies: + "@types/node": 25.0.3 + + "@isaacs/balanced-match@4.0.1": {} - '@hutson/parse-repository-url@3.0.2': {} + "@isaacs/brace-expansion@5.0.0": + dependencies: + "@isaacs/balanced-match": 4.0.1 - '@isaacs/cliui@8.0.2': + "@isaacs/cliui@8.0.2": dependencies: string-width: 5.1.2 string-width-cjs: string-width@4.2.3 @@ -10320,1470 +12204,1388 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 - '@isaacs/string-locale-compare@1.1.0': {} + "@isaacs/fs-minipass@4.0.1": + dependencies: + minipass: 7.1.2 + + "@isaacs/string-locale-compare@1.1.0": {} - '@istanbuljs/schema@0.1.3': {} + "@jest/diff-sequences@30.0.1": {} + + "@jest/get-type@30.1.0": {} + + "@jest/schemas@30.0.5": + dependencies: + "@sinclair/typebox": 0.34.41 - '@jest/schemas@29.6.3': + "@jridgewell/gen-mapping@0.3.12": dependencies: - '@sinclair/typebox': 0.27.8 + "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/trace-mapping": 0.3.29 - '@jridgewell/gen-mapping@0.3.12': + "@jridgewell/gen-mapping@0.3.5": dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.29 + "@jridgewell/set-array": 1.2.1 + "@jridgewell/sourcemap-codec": 1.5.0 + "@jridgewell/trace-mapping": 0.3.25 - '@jridgewell/gen-mapping@0.3.5': + "@jridgewell/remapping@2.3.5": dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/gen-mapping": 0.3.12 + "@jridgewell/trace-mapping": 0.3.29 - '@jridgewell/resolve-uri@3.1.1': {} + "@jridgewell/resolve-uri@3.1.1": {} - '@jridgewell/set-array@1.2.1': {} + "@jridgewell/set-array@1.2.1": {} - '@jridgewell/source-map@0.3.5': + "@jridgewell/source-map@0.3.5": dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/gen-mapping": 0.3.5 + "@jridgewell/trace-mapping": 0.3.25 - '@jridgewell/sourcemap-codec@1.4.15': {} + "@jridgewell/sourcemap-codec@1.4.15": {} - '@jridgewell/sourcemap-codec@1.5.0': {} + "@jridgewell/sourcemap-codec@1.5.0": {} - '@jridgewell/trace-mapping@0.3.25': + "@jridgewell/sourcemap-codec@1.5.5": {} + + "@jridgewell/trace-mapping@0.3.25": + dependencies: + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 + + "@jridgewell/trace-mapping@0.3.29": dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.5.0 - '@jridgewell/trace-mapping@0.3.29': + "@jridgewell/trace-mapping@0.3.31": dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.5.0 + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.5.0 - '@jridgewell/trace-mapping@0.3.9': + "@jridgewell/trace-mapping@0.3.9": dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 + "@jridgewell/resolve-uri": 3.1.1 + "@jridgewell/sourcemap-codec": 1.4.15 - '@lerna/create@8.2.3(@swc/core@1.9.2)(encoding@0.1.13)(typescript@5.9.2)': + "@lerna/create@9.0.3(@swc/core@1.9.2)(@types/node@25.0.3)(typescript@5.9.3)": dependencies: - '@npmcli/arborist': 7.5.4 - '@npmcli/package-json': 5.2.0 - '@npmcli/run-script': 8.1.0 - '@nx/devkit': 19.8.4(nx@19.8.14(@swc/core@1.9.2)) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 20.1.2 + "@npmcli/arborist": 9.1.6 + "@npmcli/package-json": 7.0.2 + "@npmcli/run-script": 10.0.2 + "@nx/devkit": 22.3.3(nx@22.3.3(@swc/core@1.9.2)) + "@octokit/plugin-enterprise-rest": 6.0.1 + "@octokit/rest": 20.1.2 aproba: 2.0.0 byte-size: 8.1.1 chalk: 4.1.0 - clone-deep: 4.0.1 cmd-shim: 6.0.3 color-support: 1.1.3 columnify: 1.6.0 console-control-strings: 1.1.0 conventional-changelog-core: 5.0.1 conventional-recommended-bump: 7.0.1 - cosmiconfig: 9.0.0(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) dedent: 1.5.3 execa: 5.0.0 - fs-extra: 11.2.0 + fs-extra: 11.3.3 get-stream: 6.0.0 git-url-parse: 14.0.0 glob-parent: 6.0.2 - graceful-fs: 4.2.11 has-unicode: 2.0.1 ini: 1.3.8 - init-package-json: 6.0.3 - inquirer: 8.2.5 + init-package-json: 8.2.2 + inquirer: 12.9.6(@types/node@25.0.3) is-ci: 3.0.1 is-stream: 2.0.0 - js-yaml: 4.1.0 - libnpmpublish: 9.0.9 + js-yaml: 4.1.1 + libnpmpublish: 11.1.2 load-json-file: 6.2.0 - lodash: 4.17.21 make-dir: 4.0.0 + make-fetch-happen: 15.0.2 minimatch: 3.0.5 multimatch: 5.0.0 - node-fetch: 2.6.7(encoding@0.1.13) - npm-package-arg: 11.0.2 - npm-packlist: 8.0.2 - npm-registry-fetch: 17.1.0 - nx: 19.8.14(@swc/core@1.9.2) + npm-package-arg: 13.0.1 + npm-packlist: 10.0.3 + npm-registry-fetch: 19.1.0 + nx: 22.3.3(@swc/core@1.9.2) p-map: 4.0.0 p-map-series: 2.1.0 p-queue: 6.6.2 p-reduce: 2.1.0 - pacote: 18.0.6 + pacote: 21.0.1 pify: 5.0.0 read-cmd-shim: 4.0.0 resolve-from: 5.0.0 rimraf: 4.4.1 - semver: 7.6.3 + semver: 7.7.2 set-blocking: 2.0.0 signal-exit: 3.0.7 slash: 3.0.0 - ssri: 10.0.6 + ssri: 12.0.0 string-width: 4.2.3 tar: 6.2.1 temp-dir: 1.0.0 through: 2.3.8 tinyglobby: 0.2.12 upath: 2.0.1 - uuid: 10.0.0 + uuid: 11.1.0 validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.1 + validate-npm-package-name: 6.0.2 wide-align: 1.1.5 write-file-atomic: 5.0.1 write-pkg: 4.0.0 yargs: 17.7.2 yargs-parser: 21.1.1 transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' + - "@swc-node/register" + - "@swc/core" + - "@types/node" - babel-plugin-macros - - bluebird - debug - - encoding - supports-color - typescript - '@microsoft/tsdoc-config@0.16.2': - dependencies: - '@microsoft/tsdoc': 0.14.2 - ajv: 6.12.6 - jju: 1.4.0 - resolve: 1.19.0 - - '@microsoft/tsdoc-config@0.17.1': + "@microsoft/tsdoc-config@0.18.0": dependencies: - '@microsoft/tsdoc': 0.15.1 + "@microsoft/tsdoc": 0.16.0 ajv: 8.12.0 jju: 1.4.0 - resolve: 1.22.8 + resolve: 1.22.10 - '@microsoft/tsdoc@0.14.2': {} + "@microsoft/tsdoc@0.16.0": {} - '@microsoft/tsdoc@0.15.1': {} - - '@napi-rs/wasm-runtime@0.2.4': + "@napi-rs/wasm-runtime@0.2.4": dependencies: - '@emnapi/core': 1.2.0 - '@emnapi/runtime': 1.2.0 - '@tybys/wasm-util': 0.9.0 + "@emnapi/core": 1.2.0 + "@emnapi/runtime": 1.2.0 + "@tybys/wasm-util": 0.9.0 - '@nodelib/fs.scandir@2.1.5': + "@nodelib/fs.scandir@2.1.5": dependencies: - '@nodelib/fs.stat': 2.0.5 + "@nodelib/fs.stat": 2.0.5 run-parallel: 1.2.0 - '@nodelib/fs.stat@2.0.5': {} + "@nodelib/fs.stat@2.0.5": {} - '@nodelib/fs.walk@1.2.8': + "@nodelib/fs.walk@1.2.8": dependencies: - '@nodelib/fs.scandir': 2.1.5 + "@nodelib/fs.scandir": 2.1.5 fastq: 1.15.0 - '@npmcli/agent@2.2.0': + "@npmcli/agent@3.0.0": dependencies: agent-base: 7.1.3 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 lru-cache: 10.4.3 - socks-proxy-agent: 8.0.2 + socks-proxy-agent: 8.0.5 transitivePeerDependencies: - supports-color - '@npmcli/arborist@7.5.4': - dependencies: - '@isaacs/string-locale-compare': 1.1.0 - '@npmcli/fs': 3.1.1 - '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/map-workspaces': 3.0.6 - '@npmcli/metavuln-calculator': 7.1.1 - '@npmcli/name-from-folder': 2.0.0 - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.0 - '@npmcli/query': 3.1.0 - '@npmcli/redact': 2.0.1 - '@npmcli/run-script': 8.1.0 - bin-links: 4.0.4 - cacache: 18.0.3 + "@npmcli/agent@4.0.0": + dependencies: + agent-base: 7.1.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.6 + lru-cache: 11.2.4 + socks-proxy-agent: 8.0.5 + transitivePeerDependencies: + - supports-color + + "@npmcli/arborist@9.1.6": + dependencies: + "@isaacs/string-locale-compare": 1.1.0 + "@npmcli/fs": 4.0.0 + "@npmcli/installed-package-contents": 3.0.0 + "@npmcli/map-workspaces": 5.0.3 + "@npmcli/metavuln-calculator": 9.0.3 + "@npmcli/name-from-folder": 3.0.0 + "@npmcli/node-gyp": 4.0.0 + "@npmcli/package-json": 7.0.2 + "@npmcli/query": 4.0.1 + "@npmcli/redact": 3.2.2 + "@npmcli/run-script": 10.0.2 + bin-links: 5.0.0 + cacache: 20.0.3 common-ancestor-path: 1.0.1 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.2 + hosted-git-info: 9.0.2 json-stringify-nice: 1.1.4 - lru-cache: 10.4.3 - minimatch: 9.0.5 - nopt: 7.2.1 - npm-install-checks: 6.3.0 - npm-package-arg: 11.0.2 - npm-pick-manifest: 9.0.1 - npm-registry-fetch: 17.1.0 - pacote: 18.0.6 - parse-conflict-json: 3.0.1 - proc-log: 4.2.0 - proggy: 2.0.0 + lru-cache: 11.2.4 + minimatch: 10.1.1 + nopt: 8.1.0 + npm-install-checks: 7.1.2 + npm-package-arg: 13.0.1 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.0 + pacote: 21.0.4 + parse-conflict-json: 4.0.0 + proc-log: 5.0.0 + proggy: 3.0.0 promise-all-reject-late: 1.0.1 promise-call-limit: 3.0.1 - read-package-json-fast: 3.0.2 - semver: 7.6.3 - ssri: 10.0.6 + semver: 7.7.2 + ssri: 12.0.0 treeverse: 3.0.0 - walk-up-path: 3.0.1 + walk-up-path: 4.0.0 transitivePeerDependencies: - - bluebird - supports-color - '@npmcli/fs@3.1.1': + "@npmcli/fs@4.0.0": dependencies: - semver: 7.6.3 + semver: 7.7.3 - '@npmcli/git@5.0.3': + "@npmcli/fs@5.0.0": dependencies: - '@npmcli/promise-spawn': 7.0.0 + semver: 7.7.3 + + "@npmcli/git@6.0.3": + dependencies: + "@npmcli/promise-spawn": 8.0.3 + ini: 5.0.0 lru-cache: 10.4.3 - npm-pick-manifest: 9.0.1 - proc-log: 3.0.0 - promise-inflight: 1.0.1 + npm-pick-manifest: 10.0.0 + proc-log: 5.0.0 promise-retry: 2.0.1 - semver: 7.6.3 - which: 4.0.0 - transitivePeerDependencies: - - bluebird + semver: 7.7.3 + which: 5.0.0 - '@npmcli/installed-package-contents@2.1.0': + "@npmcli/git@7.0.1": dependencies: - npm-bundled: 3.0.0 - npm-normalize-package-bin: 3.0.1 + "@npmcli/promise-spawn": 9.0.1 + ini: 6.0.0 + lru-cache: 11.2.4 + npm-pick-manifest: 11.0.3 + proc-log: 6.1.0 + promise-retry: 2.0.1 + semver: 7.7.3 + which: 6.0.0 - '@npmcli/map-workspaces@3.0.6': + "@npmcli/installed-package-contents@3.0.0": dependencies: - '@npmcli/name-from-folder': 2.0.0 - glob: 10.4.5 - minimatch: 9.0.5 - read-package-json-fast: 3.0.2 + npm-bundled: 4.0.0 + npm-normalize-package-bin: 4.0.0 - '@npmcli/metavuln-calculator@7.1.1': + "@npmcli/installed-package-contents@4.0.0": dependencies: - cacache: 18.0.3 - json-parse-even-better-errors: 3.0.2 - pacote: 18.0.6 - proc-log: 4.2.0 - semver: 7.6.3 - transitivePeerDependencies: - - bluebird - - supports-color - - '@npmcli/name-from-folder@2.0.0': {} + npm-bundled: 5.0.0 + npm-normalize-package-bin: 5.0.0 - '@npmcli/node-gyp@3.0.0': {} + "@npmcli/map-workspaces@5.0.3": + dependencies: + "@npmcli/name-from-folder": 4.0.0 + "@npmcli/package-json": 7.0.2 + glob: 13.0.0 + minimatch: 10.1.1 - '@npmcli/package-json@5.2.0': + "@npmcli/metavuln-calculator@9.0.3": dependencies: - '@npmcli/git': 5.0.3 - glob: 10.4.5 - hosted-git-info: 7.0.2 - json-parse-even-better-errors: 3.0.2 - normalize-package-data: 6.0.2 - proc-log: 4.2.0 - semver: 7.6.3 + cacache: 20.0.3 + json-parse-even-better-errors: 5.0.0 + pacote: 21.0.4 + proc-log: 6.1.0 + semver: 7.7.3 transitivePeerDependencies: - - bluebird + - supports-color - '@npmcli/promise-spawn@7.0.0': - dependencies: - which: 4.0.0 + "@npmcli/name-from-folder@3.0.0": {} - '@npmcli/query@3.1.0': - dependencies: - postcss-selector-parser: 6.1.0 + "@npmcli/name-from-folder@4.0.0": {} - '@npmcli/redact@2.0.1': {} + "@npmcli/node-gyp@4.0.0": {} - '@npmcli/run-script@8.1.0': - dependencies: - '@npmcli/node-gyp': 3.0.0 - '@npmcli/package-json': 5.2.0 - '@npmcli/promise-spawn': 7.0.0 - node-gyp: 10.0.1 - proc-log: 4.2.0 - which: 4.0.0 - transitivePeerDependencies: - - bluebird - - supports-color + "@npmcli/node-gyp@5.0.0": {} - '@nrwl/devkit@19.8.4(nx@19.8.14(@swc/core@1.9.2))': + "@npmcli/package-json@7.0.2": dependencies: - '@nx/devkit': 19.8.4(nx@19.8.14(@swc/core@1.9.2)) - transitivePeerDependencies: - - nx + "@npmcli/git": 7.0.1 + glob: 11.1.0 + hosted-git-info: 9.0.2 + json-parse-even-better-errors: 5.0.0 + proc-log: 6.1.0 + semver: 7.7.2 + validate-npm-package-license: 3.0.4 - '@nrwl/devkit@19.8.4(nx@19.8.4(@swc/core@1.9.2))': + "@npmcli/promise-spawn@8.0.3": dependencies: - '@nx/devkit': 19.8.4(nx@19.8.4(@swc/core@1.9.2)) - transitivePeerDependencies: - - nx + which: 5.0.0 - '@nrwl/nx-cloud@19.1.0': + "@npmcli/promise-spawn@9.0.1": dependencies: - nx-cloud: 19.1.0 - transitivePeerDependencies: - - debug + which: 6.0.0 - '@nrwl/tao@19.8.14(@swc/core@1.9.2)': + "@npmcli/query@4.0.1": dependencies: - nx: 19.8.14(@swc/core@1.9.2) - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug + postcss-selector-parser: 7.1.1 + + "@npmcli/redact@3.2.2": {} - '@nrwl/tao@19.8.4(@swc/core@1.9.2)': + "@npmcli/run-script@10.0.2": dependencies: - nx: 19.8.4(@swc/core@1.9.2) - tslib: 2.6.2 + "@npmcli/node-gyp": 5.0.0 + "@npmcli/package-json": 7.0.2 + "@npmcli/promise-spawn": 9.0.1 + node-gyp: 11.5.0 + proc-log: 6.1.0 + which: 5.0.0 transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - - debug + - supports-color - '@nrwl/workspace@19.8.4(@swc/core@1.9.2)': + "@nrwl/nx-cloud@19.1.0": dependencies: - '@nx/workspace': 19.8.4(@swc/core@1.9.2) + nx-cloud: 19.1.0 transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' - debug - '@nx/devkit@19.8.4(nx@19.8.14(@swc/core@1.9.2))': - dependencies: - '@nrwl/devkit': 19.8.4(nx@19.8.14(@swc/core@1.9.2)) - ejs: 3.1.9 - enquirer: 2.3.6 - ignore: 5.3.1 - minimatch: 9.0.3 - nx: 19.8.14(@swc/core@1.9.2) - semver: 7.6.3 - tmp: 0.2.1 - tslib: 2.6.2 - yargs-parser: 21.1.1 - - '@nx/devkit@19.8.4(nx@19.8.4(@swc/core@1.9.2))': + "@nx/devkit@22.3.3(nx@22.3.3(@swc/core@1.9.2))": dependencies: - '@nrwl/devkit': 19.8.4(nx@19.8.4(@swc/core@1.9.2)) + "@zkochan/js-yaml": 0.0.7 ejs: 3.1.9 enquirer: 2.3.6 - ignore: 5.3.1 minimatch: 9.0.3 - nx: 19.8.4(@swc/core@1.9.2) - semver: 7.6.3 - tmp: 0.2.1 - tslib: 2.6.2 + nx: 22.3.3(@swc/core@1.9.2) + semver: 7.7.2 + tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/nx-darwin-arm64@19.8.14': - optional: true - - '@nx/nx-darwin-arm64@19.8.4': - optional: true - - '@nx/nx-darwin-x64@19.8.14': - optional: true - - '@nx/nx-darwin-x64@19.8.4': - optional: true - - '@nx/nx-freebsd-x64@19.8.14': - optional: true - - '@nx/nx-freebsd-x64@19.8.4': - optional: true - - '@nx/nx-linux-arm-gnueabihf@19.8.14': + "@nx/nx-darwin-arm64@22.3.3": optional: true - '@nx/nx-linux-arm-gnueabihf@19.8.4': + "@nx/nx-darwin-x64@22.3.3": optional: true - '@nx/nx-linux-arm64-gnu@19.8.14': + "@nx/nx-freebsd-x64@22.3.3": optional: true - '@nx/nx-linux-arm64-gnu@19.8.4': + "@nx/nx-linux-arm-gnueabihf@22.3.3": optional: true - '@nx/nx-linux-arm64-musl@19.8.14': + "@nx/nx-linux-arm64-gnu@22.3.3": optional: true - '@nx/nx-linux-arm64-musl@19.8.4': + "@nx/nx-linux-arm64-musl@22.3.3": optional: true - '@nx/nx-linux-x64-gnu@19.8.14': + "@nx/nx-linux-x64-gnu@22.3.3": optional: true - '@nx/nx-linux-x64-gnu@19.8.4': + "@nx/nx-linux-x64-musl@22.3.3": optional: true - '@nx/nx-linux-x64-musl@19.8.14': + "@nx/nx-win32-arm64-msvc@22.3.3": optional: true - '@nx/nx-linux-x64-musl@19.8.4': + "@nx/nx-win32-x64-msvc@22.3.3": optional: true - '@nx/nx-win32-arm64-msvc@19.8.14': - optional: true - - '@nx/nx-win32-arm64-msvc@19.8.4': - optional: true - - '@nx/nx-win32-x64-msvc@19.8.14': - optional: true - - '@nx/nx-win32-x64-msvc@19.8.4': - optional: true - - '@nx/workspace@19.8.4(@swc/core@1.9.2)': + "@nx/workspace@22.3.3(@swc/core@1.9.2)": dependencies: - '@nrwl/workspace': 19.8.4(@swc/core@1.9.2) - '@nx/devkit': 19.8.4(nx@19.8.4(@swc/core@1.9.2)) + "@nx/devkit": 22.3.3(nx@22.3.3(@swc/core@1.9.2)) + "@zkochan/js-yaml": 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 19.8.4(@swc/core@1.9.2) - tslib: 2.6.2 + nx: 22.3.3(@swc/core@1.9.2) + picomatch: 4.0.2 + semver: 7.7.2 + tslib: 2.8.1 yargs-parser: 21.1.1 transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' + - "@swc-node/register" + - "@swc/core" - debug - '@octokit/auth-token@4.0.0': {} + "@octokit/auth-token@4.0.0": {} - '@octokit/core@5.2.1': + "@octokit/core@5.2.1": dependencies: - '@octokit/auth-token': 4.0.0 - '@octokit/graphql': 7.1.1 - '@octokit/request': 8.4.1 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 + "@octokit/auth-token": 4.0.0 + "@octokit/graphql": 7.1.1 + "@octokit/request": 8.4.1 + "@octokit/request-error": 5.1.1 + "@octokit/types": 13.10.0 before-after-hook: 2.2.3 universal-user-agent: 6.0.0 - '@octokit/endpoint@9.0.6': + "@octokit/endpoint@9.0.6": dependencies: - '@octokit/types': 13.10.0 + "@octokit/types": 13.10.0 universal-user-agent: 6.0.0 - '@octokit/graphql@7.1.1': + "@octokit/graphql@7.1.1": dependencies: - '@octokit/request': 8.4.1 - '@octokit/types': 13.10.0 + "@octokit/request": 8.4.1 + "@octokit/types": 13.10.0 universal-user-agent: 6.0.0 - '@octokit/openapi-types@24.2.0': {} + "@octokit/openapi-types@24.2.0": {} - '@octokit/plugin-enterprise-rest@6.0.1': {} + "@octokit/plugin-enterprise-rest@6.0.1": {} - '@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.1)': + "@octokit/plugin-paginate-rest@11.4.4-cjs.2(@octokit/core@5.2.1)": dependencies: - '@octokit/core': 5.2.1 - '@octokit/types': 13.10.0 + "@octokit/core": 5.2.1 + "@octokit/types": 13.10.0 - '@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.1)': + "@octokit/plugin-request-log@4.0.1(@octokit/core@5.2.1)": dependencies: - '@octokit/core': 5.2.1 + "@octokit/core": 5.2.1 - '@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.1)': + "@octokit/plugin-rest-endpoint-methods@13.3.2-cjs.1(@octokit/core@5.2.1)": dependencies: - '@octokit/core': 5.2.1 - '@octokit/types': 13.10.0 + "@octokit/core": 5.2.1 + "@octokit/types": 13.10.0 - '@octokit/request-error@5.1.1': + "@octokit/request-error@5.1.1": dependencies: - '@octokit/types': 13.10.0 + "@octokit/types": 13.10.0 deprecation: 2.3.1 once: 1.4.0 - '@octokit/request@8.4.1': + "@octokit/request@8.4.1": dependencies: - '@octokit/endpoint': 9.0.6 - '@octokit/request-error': 5.1.1 - '@octokit/types': 13.10.0 + "@octokit/endpoint": 9.0.6 + "@octokit/request-error": 5.1.1 + "@octokit/types": 13.10.0 universal-user-agent: 6.0.0 - '@octokit/rest@20.1.2': + "@octokit/rest@20.1.2": dependencies: - '@octokit/core': 5.2.1 - '@octokit/plugin-paginate-rest': 11.4.4-cjs.2(@octokit/core@5.2.1) - '@octokit/plugin-request-log': 4.0.1(@octokit/core@5.2.1) - '@octokit/plugin-rest-endpoint-methods': 13.3.2-cjs.1(@octokit/core@5.2.1) + "@octokit/core": 5.2.1 + "@octokit/plugin-paginate-rest": 11.4.4-cjs.2(@octokit/core@5.2.1) + "@octokit/plugin-request-log": 4.0.1(@octokit/core@5.2.1) + "@octokit/plugin-rest-endpoint-methods": 13.3.2-cjs.1(@octokit/core@5.2.1) - '@octokit/types@13.10.0': + "@octokit/types@13.10.0": dependencies: - '@octokit/openapi-types': 24.2.0 + "@octokit/openapi-types": 24.2.0 + + "@parcel/watcher-android-arm64@2.5.1": + optional: true - '@pkgjs/parseargs@0.11.0': + "@parcel/watcher-darwin-arm64@2.5.1": optional: true - '@pkgr/core@0.1.1': {} + "@parcel/watcher-darwin-x64@2.5.1": + optional: true - '@pkgr/core@0.2.4': {} + "@parcel/watcher-freebsd-x64@2.5.1": + optional: true - '@polka/url@1.0.0-next.21': {} + "@parcel/watcher-linux-arm-glibc@2.5.1": + optional: true - '@polka/url@1.0.0-next.25': {} + "@parcel/watcher-linux-arm-musl@2.5.1": + optional: true - '@popperjs/core@2.11.8': {} + "@parcel/watcher-linux-arm64-glibc@2.5.1": + optional: true - '@putout/minify@4.7.2': {} + "@parcel/watcher-linux-arm64-musl@2.5.1": + optional: true - '@rollup/rollup-android-arm-eabi@4.50.1': + "@parcel/watcher-linux-x64-glibc@2.5.1": optional: true - '@rollup/rollup-android-arm64@4.50.1': + "@parcel/watcher-linux-x64-musl@2.5.1": optional: true - '@rollup/rollup-darwin-arm64@4.50.1': + "@parcel/watcher-win32-arm64@2.5.1": optional: true - '@rollup/rollup-darwin-x64@4.50.1': + "@parcel/watcher-win32-ia32@2.5.1": optional: true - '@rollup/rollup-freebsd-arm64@4.50.1': + "@parcel/watcher-win32-x64@2.5.1": optional: true - '@rollup/rollup-freebsd-x64@4.50.1': + "@parcel/watcher@2.5.1": + dependencies: + detect-libc: 1.0.3 + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 7.1.1 + optionalDependencies: + "@parcel/watcher-android-arm64": 2.5.1 + "@parcel/watcher-darwin-arm64": 2.5.1 + "@parcel/watcher-darwin-x64": 2.5.1 + "@parcel/watcher-freebsd-x64": 2.5.1 + "@parcel/watcher-linux-arm-glibc": 2.5.1 + "@parcel/watcher-linux-arm-musl": 2.5.1 + "@parcel/watcher-linux-arm64-glibc": 2.5.1 + "@parcel/watcher-linux-arm64-musl": 2.5.1 + "@parcel/watcher-linux-x64-glibc": 2.5.1 + "@parcel/watcher-linux-x64-musl": 2.5.1 + "@parcel/watcher-win32-arm64": 2.5.1 + "@parcel/watcher-win32-ia32": 2.5.1 + "@parcel/watcher-win32-x64": 2.5.1 optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': + "@pkgjs/parseargs@0.11.0": optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.1': + "@pkgr/core@0.2.9": {} + + "@polka/url@1.0.0-next.25": {} + + "@popperjs/core@2.11.8": {} + + "@putout/minify@6.0.0": {} + + "@rollup/rollup-android-arm-eabi@4.50.1": + optional: true + + "@rollup/rollup-android-arm64@4.50.1": + optional: true + + "@rollup/rollup-darwin-arm64@4.50.1": + optional: true + + "@rollup/rollup-darwin-x64@4.50.1": optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.1': + "@rollup/rollup-freebsd-arm64@4.50.1": optional: true - '@rollup/rollup-linux-arm64-musl@4.50.1': + "@rollup/rollup-freebsd-x64@4.50.1": optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': + "@rollup/rollup-linux-arm-gnueabihf@4.50.1": optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.1': + "@rollup/rollup-linux-arm-musleabihf@4.50.1": optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.1': + "@rollup/rollup-linux-arm64-gnu@4.50.1": optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.1': + "@rollup/rollup-linux-arm64-musl@4.50.1": optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.1': + "@rollup/rollup-linux-loongarch64-gnu@4.50.1": optional: true - '@rollup/rollup-linux-x64-gnu@4.50.1': + "@rollup/rollup-linux-ppc64-gnu@4.50.1": optional: true - '@rollup/rollup-linux-x64-musl@4.50.1': + "@rollup/rollup-linux-riscv64-gnu@4.50.1": optional: true - '@rollup/rollup-openharmony-arm64@4.50.1': + "@rollup/rollup-linux-riscv64-musl@4.50.1": optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.1': + "@rollup/rollup-linux-s390x-gnu@4.50.1": optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.1': + "@rollup/rollup-linux-x64-gnu@4.50.1": optional: true - '@rollup/rollup-win32-x64-msvc@4.50.1': + "@rollup/rollup-linux-x64-musl@4.50.1": optional: true - '@shikijs/engine-oniguruma@3.9.1': + "@rollup/rollup-openharmony-arm64@4.50.1": + optional: true + + "@rollup/rollup-win32-arm64-msvc@4.50.1": + optional: true + + "@rollup/rollup-win32-ia32-msvc@4.50.1": + optional: true + + "@rollup/rollup-win32-x64-msvc@4.50.1": + optional: true + + "@rtsao/scc@1.1.0": {} + + "@shikijs/engine-oniguruma@3.20.0": dependencies: - '@shikijs/types': 3.9.1 - '@shikijs/vscode-textmate': 10.0.2 + "@shikijs/types": 3.20.0 + "@shikijs/vscode-textmate": 10.0.2 - '@shikijs/langs@3.9.1': + "@shikijs/langs@3.20.0": dependencies: - '@shikijs/types': 3.9.1 + "@shikijs/types": 3.20.0 - '@shikijs/themes@3.9.1': + "@shikijs/themes@3.20.0": dependencies: - '@shikijs/types': 3.9.1 + "@shikijs/types": 3.20.0 - '@shikijs/types@3.9.1': + "@shikijs/types@3.20.0": dependencies: - '@shikijs/vscode-textmate': 10.0.2 - '@types/hast': 3.0.4 + "@shikijs/vscode-textmate": 10.0.2 + "@types/hast": 3.0.4 - '@shikijs/vscode-textmate@10.0.2': {} + "@shikijs/vscode-textmate@10.0.2": {} - '@sigstore/bundle@2.3.2': + "@sigstore/bundle@4.0.0": dependencies: - '@sigstore/protobuf-specs': 0.3.2 + "@sigstore/protobuf-specs": 0.5.0 - '@sigstore/core@1.1.0': {} + "@sigstore/core@3.1.0": {} - '@sigstore/protobuf-specs@0.3.2': {} + "@sigstore/protobuf-specs@0.5.0": {} - '@sigstore/sign@2.3.2': + "@sigstore/sign@4.1.0": dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 - make-fetch-happen: 13.0.1 - proc-log: 4.2.0 + "@sigstore/bundle": 4.0.0 + "@sigstore/core": 3.1.0 + "@sigstore/protobuf-specs": 0.5.0 + make-fetch-happen: 15.0.3 + proc-log: 6.1.0 promise-retry: 2.0.1 transitivePeerDependencies: - supports-color - '@sigstore/tuf@2.3.4': + "@sigstore/tuf@4.0.1": dependencies: - '@sigstore/protobuf-specs': 0.3.2 - tuf-js: 2.2.1 + "@sigstore/protobuf-specs": 0.5.0 + tuf-js: 4.1.0 transitivePeerDependencies: - supports-color - '@sigstore/verify@1.2.1': + "@sigstore/verify@3.1.0": dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 + "@sigstore/bundle": 4.0.0 + "@sigstore/core": 3.1.0 + "@sigstore/protobuf-specs": 0.5.0 - '@sinclair/typebox@0.27.8': {} + "@sinclair/typebox@0.34.41": {} - '@sindresorhus/is@4.6.0': {} + "@sindresorhus/base62@1.0.0": {} - '@sphinxxxx/color-conversion@2.2.2': {} + "@sindresorhus/is@4.6.0": {} - '@stylistic/eslint-plugin-js@1.7.0(eslint@8.57.1)': + "@so-ric/colorspace@1.1.6": dependencies: - '@types/eslint': 8.56.6 - acorn: 8.11.3 - escape-string-regexp: 4.0.0 - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + color: 5.0.3 + text-hex: 1.0.0 - '@stylistic/eslint-plugin-jsx@1.7.0(eslint@8.57.1)': - dependencies: - '@stylistic/eslint-plugin-js': 1.7.0(eslint@8.57.1) - '@types/eslint': 8.56.6 - eslint: 8.57.1 - estraverse: 5.3.0 - picomatch: 4.0.3 + "@sphinxxxx/color-conversion@2.2.2": {} - '@stylistic/eslint-plugin-plus@1.7.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@types/eslint': 8.56.6 - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript - - '@stylistic/eslint-plugin-ts@1.7.0(eslint@8.57.1)(typescript@5.9.2)': - dependencies: - '@stylistic/eslint-plugin-js': 1.7.0(eslint@8.57.1) - '@types/eslint': 8.56.6 - '@typescript-eslint/utils': 6.21.0(eslint@8.57.1)(typescript@5.9.2) - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript + "@standard-schema/spec@1.1.0": {} - '@stylistic/eslint-plugin@1.7.0(eslint@8.57.1)(typescript@5.9.2)': + "@stylistic/eslint-plugin@5.6.1(eslint@9.39.2(jiti@2.4.2))": dependencies: - '@stylistic/eslint-plugin-js': 1.7.0(eslint@8.57.1) - '@stylistic/eslint-plugin-jsx': 1.7.0(eslint@8.57.1) - '@stylistic/eslint-plugin-plus': 1.7.0(eslint@8.57.1)(typescript@5.9.2) - '@stylistic/eslint-plugin-ts': 1.7.0(eslint@8.57.1)(typescript@5.9.2) - '@types/eslint': 8.56.6 - eslint: 8.57.1 - transitivePeerDependencies: - - supports-color - - typescript + "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.2(jiti@2.4.2)) + "@typescript-eslint/types": 8.51.0 + eslint: 9.39.2(jiti@2.4.2) + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + estraverse: 5.3.0 + picomatch: 4.0.3 - '@swc/core-darwin-arm64@1.9.2': + "@swc/core-darwin-arm64@1.9.2": optional: true - '@swc/core-darwin-x64@1.9.2': + "@swc/core-darwin-x64@1.9.2": optional: true - '@swc/core-linux-arm-gnueabihf@1.9.2': + "@swc/core-linux-arm-gnueabihf@1.9.2": optional: true - '@swc/core-linux-arm64-gnu@1.9.2': + "@swc/core-linux-arm64-gnu@1.9.2": optional: true - '@swc/core-linux-arm64-musl@1.9.2': + "@swc/core-linux-arm64-musl@1.9.2": optional: true - '@swc/core-linux-x64-gnu@1.9.2': + "@swc/core-linux-x64-gnu@1.9.2": optional: true - '@swc/core-linux-x64-musl@1.9.2': + "@swc/core-linux-x64-musl@1.9.2": optional: true - '@swc/core-win32-arm64-msvc@1.9.2': + "@swc/core-win32-arm64-msvc@1.9.2": optional: true - '@swc/core-win32-ia32-msvc@1.9.2': + "@swc/core-win32-ia32-msvc@1.9.2": optional: true - '@swc/core-win32-x64-msvc@1.9.2': + "@swc/core-win32-x64-msvc@1.9.2": optional: true - '@swc/core@1.9.2': + "@swc/core@1.9.2": dependencies: - '@swc/counter': 0.1.3 - '@swc/types': 0.1.15 + "@swc/counter": 0.1.3 + "@swc/types": 0.1.15 optionalDependencies: - '@swc/core-darwin-arm64': 1.9.2 - '@swc/core-darwin-x64': 1.9.2 - '@swc/core-linux-arm-gnueabihf': 1.9.2 - '@swc/core-linux-arm64-gnu': 1.9.2 - '@swc/core-linux-arm64-musl': 1.9.2 - '@swc/core-linux-x64-gnu': 1.9.2 - '@swc/core-linux-x64-musl': 1.9.2 - '@swc/core-win32-arm64-msvc': 1.9.2 - '@swc/core-win32-ia32-msvc': 1.9.2 - '@swc/core-win32-x64-msvc': 1.9.2 + "@swc/core-darwin-arm64": 1.9.2 + "@swc/core-darwin-x64": 1.9.2 + "@swc/core-linux-arm-gnueabihf": 1.9.2 + "@swc/core-linux-arm64-gnu": 1.9.2 + "@swc/core-linux-arm64-musl": 1.9.2 + "@swc/core-linux-x64-gnu": 1.9.2 + "@swc/core-linux-x64-musl": 1.9.2 + "@swc/core-win32-arm64-msvc": 1.9.2 + "@swc/core-win32-ia32-msvc": 1.9.2 + "@swc/core-win32-x64-msvc": 1.9.2 - '@swc/counter@0.1.3': {} + "@swc/counter@0.1.3": {} - '@swc/types@0.1.15': + "@swc/types@0.1.15": dependencies: - '@swc/counter': 0.1.3 + "@swc/counter": 0.1.3 - '@szmarczak/http-timer@4.0.6': + "@szmarczak/http-timer@4.0.6": dependencies: defer-to-connect: 2.0.1 - '@ts-graphviz/adapter@2.0.3': + "@ts-graphviz/adapter@2.0.3": dependencies: - '@ts-graphviz/common': 2.1.2 + "@ts-graphviz/common": 2.1.2 - '@ts-graphviz/ast@2.0.3': + "@ts-graphviz/ast@2.0.3": dependencies: - '@ts-graphviz/common': 2.1.2 + "@ts-graphviz/common": 2.1.2 - '@ts-graphviz/common@2.1.2': {} + "@ts-graphviz/common@2.1.2": {} - '@ts-graphviz/core@2.0.3': + "@ts-graphviz/core@2.0.3": dependencies: - '@ts-graphviz/ast': 2.0.3 - '@ts-graphviz/common': 2.1.2 + "@ts-graphviz/ast": 2.0.3 + "@ts-graphviz/common": 2.1.2 - '@tsconfig/node10@1.0.9': {} + "@tsconfig/node10@1.0.9": {} - '@tsconfig/node12@1.0.11': {} + "@tsconfig/node12@1.0.11": {} - '@tsconfig/node14@1.0.3': {} + "@tsconfig/node14@1.0.3": {} - '@tsconfig/node16@1.0.4': {} + "@tsconfig/node16@1.0.4": {} - '@tsparticles/cli@2.3.3(@swc/core@1.9.2)(@types/eslint@8.56.6)(webpack-cli@6.0.1)': + "@tsparticles/cli@3.0.14(@swc/core@1.9.2)(@types/eslint@8.56.6)(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(jiti@2.4.2)(webpack-cli@6.0.1)": dependencies: - '@tsparticles/eslint-config': 2.3.0(@types/eslint@8.56.6) - '@tsparticles/prettier-config': 2.1.6 - '@tsparticles/tsconfig': 2.3.0 - '@tsparticles/webpack-plugin': 2.3.0(@swc/core@1.9.2)(@types/eslint@8.56.6) - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - commander: 12.0.0 - eslint: 8.57.1 - eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-plugin-jsdoc: 48.5.0(eslint@8.57.1) - eslint-plugin-prettier: 5.4.0(@types/eslint@8.56.6)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) - eslint-plugin-tsdoc: 0.2.17 - fs-extra: 11.2.0 + "@tsparticles/eslint-config": 3.0.9(eslint@9.39.2(jiti@2.4.2)) + "@tsparticles/prettier-config": 3.0.7 + "@tsparticles/tsconfig": 3.0.9 + "@tsparticles/webpack-plugin": 3.0.9(@swc/core@1.9.2)(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(jiti@2.4.2) + commander: 14.0.2 + eslint: 9.39.2(jiti@2.4.2) + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.4.2)) + eslint-plugin-jsdoc: 61.5.0(eslint@9.39.2(jiti@2.4.2)) + eslint-plugin-prettier: 5.5.4(@types/eslint@8.56.6)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.4.2)))(eslint@9.39.2(jiti@2.4.2))(prettier@3.7.4) + eslint-plugin-tsdoc: 0.5.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + fs-extra: 11.3.3 klaw: 4.1.0 - lookpath: 1.2.2 - madge: 6.1.0(typescript@5.9.2) - path-scurry: 1.10.1 - prettier: 3.6.2 - prettier-plugin-multiline-arrays: 3.0.6(prettier@3.6.2) + lookpath: 1.2.3 + madge: 8.0.0(typescript@5.9.3) + path-scurry: 2.0.1 + prettier: 3.7.4 + prettier-plugin-multiline-arrays: 4.1.3(prettier@3.7.4) prompts: 2.4.2 - rimraf: 5.0.7 - typescript: 5.9.2 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) + rimraf: 6.1.2 + typescript: 5.9.3 + typescript-eslint: 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) transitivePeerDependencies: - - '@swc/core' - - '@types/eslint' - - '@webpack-cli/generators' + - "@swc/core" + - "@types/eslint" + - "@typescript-eslint/parser" - bufferutil - esbuild - eslint-import-resolver-typescript - eslint-import-resolver-webpack + - jiti - supports-color - uglify-js - utf-8-validate - webpack-cli - webpack-dev-server - '@tsparticles/eslint-config@2.3.0(@types/eslint@8.56.6)': - dependencies: - '@stylistic/eslint-plugin': 1.7.0(eslint@8.57.1)(typescript@5.9.2) - '@tsparticles/prettier-config': 2.1.6 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - eslint: 8.57.1 - eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1) - eslint-plugin-jsdoc: 48.5.0(eslint@8.57.1) - eslint-plugin-prettier: 5.4.0(@types/eslint@8.56.6)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2) - eslint-plugin-tsdoc: 0.2.17 - prettier: 3.6.2 - typescript: 5.9.2 - transitivePeerDependencies: - - '@types/eslint' - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color + "@tsparticles/eslint-config@3.0.9(eslint@9.39.2(jiti@2.4.2))": + dependencies: + eslint: 9.39.2(jiti@2.4.2) - '@tsparticles/prettier-config@2.1.6': + "@tsparticles/prettier-config@3.0.7": dependencies: - prettier: 3.6.2 - prettier-plugin-multiline-arrays: 3.0.6(prettier@3.6.2) + prettier: 3.7.4 + prettier-plugin-multiline-arrays: 4.1.3(prettier@3.7.4) - '@tsparticles/tsconfig@2.3.0': + "@tsparticles/tsconfig@3.0.9": dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - '@tsparticles/webpack-plugin@2.3.0(@swc/core@1.9.2)(@types/eslint@8.56.6)': + "@tsparticles/webpack-plugin@3.0.9(@swc/core@1.9.2)(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(jiti@2.4.2)": dependencies: - '@babel/core': 7.28.0 - '@babel/preset-env': 7.24.3(@babel/core@7.28.0) - '@stylistic/eslint-plugin': 1.7.0(eslint@8.57.1)(typescript@5.9.2) - '@tsparticles/eslint-config': 2.3.0(@types/eslint@8.56.6) - '@tsparticles/prettier-config': 2.1.6 - '@types/node': 20.14.9 - '@types/webpack-bundle-analyzer': 4.7.0(@swc/core@1.9.2)(webpack-cli@5.1.4) - '@types/webpack-env': 1.18.8 - '@typescript-eslint/eslint-plugin': 7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - babel-loader: 9.2.1(@babel/core@7.28.0)(webpack@5.101.0) - browserslist: 4.25.1 + "@babel/core": 7.28.5 + "@babel/preset-env": 7.28.5(@babel/core@7.28.5) + "@stylistic/eslint-plugin": 5.6.1(eslint@9.39.2(jiti@2.4.2)) + "@tsparticles/eslint-config": 3.0.9(eslint@9.39.2(jiti@2.4.2)) + "@tsparticles/prettier-config": 3.0.7 + "@types/node": 25.0.3 + "@types/webpack-bundle-analyzer": 4.7.0(@swc/core@1.9.2)(webpack-cli@6.0.1) + "@types/webpack-env": 1.18.8 + babel-loader: 10.0.0(@babel/core@7.28.5)(webpack@5.104.1) + browserslist: 4.28.1 copyfiles: 2.4.1 - eslint: 8.57.1 - eslint-config-prettier: 9.1.0(eslint@8.57.1) - eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1) - eslint-plugin-jsdoc: 48.5.0(eslint@8.57.1) - eslint-plugin-tsdoc: 0.2.17 - prettier: 3.6.2 - prettier-plugin-multiline-arrays: 3.0.6(prettier@3.6.2) - rimraf: 5.0.7 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2)(webpack@5.101.0) - typescript: 5.9.2 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@5.1.4) - webpack-bundle-analyzer: 4.10.2 - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + eslint: 9.39.2(jiti@2.4.2) + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.4.2)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.2(jiti@2.4.2)) + eslint-plugin-jsdoc: 61.5.0(eslint@9.39.2(jiti@2.4.2)) + eslint-plugin-tsdoc: 0.5.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + prettier: 3.7.4 + prettier-plugin-multiline-arrays: 4.1.3(prettier@3.7.4) + rimraf: 6.1.2 + terser-webpack-plugin: 5.3.16(@swc/core@1.9.2)(webpack@5.104.1) + typescript: 5.9.3 + typescript-eslint: 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) + webpack-bundle-analyzer: 5.1.0 + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.1.0)(webpack@5.104.1) transitivePeerDependencies: - - '@swc/core' - - '@types/eslint' - - '@webpack-cli/generators' + - "@swc/core" + - "@typescript-eslint/parser" - bufferutil - esbuild - eslint-import-resolver-typescript - eslint-import-resolver-webpack + - jiti - supports-color - uglify-js - utf-8-validate - webpack-dev-server - '@tufjs/canonical-json@2.0.0': {} + "@tufjs/canonical-json@2.0.0": {} - '@tufjs/models@2.0.1': + "@tufjs/models@4.1.0": dependencies: - '@tufjs/canonical-json': 2.0.0 - minimatch: 9.0.5 + "@tufjs/canonical-json": 2.0.0 + minimatch: 10.1.1 - '@tybys/wasm-util@0.9.0': + "@tybys/wasm-util@0.9.0": dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - '@types/body-parser@1.19.2': + "@types/body-parser@1.19.2": dependencies: - '@types/connect': 3.4.35 - '@types/node': 22.15.14 + "@types/connect": 3.4.35 + "@types/node": 25.0.3 - '@types/cacheable-request@6.0.3': + "@types/cacheable-request@6.0.3": dependencies: - '@types/http-cache-semantics': 4.0.1 - '@types/keyv': 3.1.4 - '@types/node': 22.15.14 - '@types/responselike': 1.0.0 + "@types/http-cache-semantics": 4.0.4 + "@types/keyv": 3.1.4 + "@types/node": 25.0.3 + "@types/responselike": 1.0.3 - '@types/chai@5.2.2': + "@types/chai@5.2.2": dependencies: - '@types/deep-eql': 4.0.2 + "@types/deep-eql": 4.0.2 - '@types/connect-livereload@0.6.3': + "@types/connect-livereload@0.6.3": dependencies: - '@types/connect': 3.4.35 + "@types/connect": 3.4.35 - '@types/connect@3.4.35': + "@types/connect@3.4.35": dependencies: - '@types/node': 22.15.14 + "@types/node": 25.0.3 - '@types/conventional-commits-parser@5.0.0': + "@types/conventional-commits-parser@5.0.0": dependencies: - '@types/node': 24.1.0 + "@types/node": 25.0.3 - '@types/deep-eql@4.0.2': {} + "@types/deep-eql@4.0.2": {} - '@types/eslint-scope@3.7.7': + "@types/eslint-scope@3.7.7": dependencies: - '@types/eslint': 8.56.6 - '@types/estree': 1.0.8 + "@types/eslint": 8.56.6 + "@types/estree": 1.0.8 - '@types/eslint@8.56.6': + "@types/eslint@8.56.6": dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 + "@types/estree": 1.0.8 + "@types/json-schema": 7.0.15 - '@types/estree@1.0.8': {} + "@types/estree@1.0.8": {} - '@types/express-serve-static-core@5.0.0': + "@types/express-serve-static-core@5.0.0": dependencies: - '@types/node': 22.15.14 - '@types/qs': 6.9.7 - '@types/range-parser': 1.2.4 - '@types/send': 0.17.1 + "@types/node": 25.0.3 + "@types/qs": 6.9.7 + "@types/range-parser": 1.2.4 + "@types/send": 0.17.1 - '@types/express@5.0.0': + "@types/express@5.0.6": dependencies: - '@types/body-parser': 1.19.2 - '@types/express-serve-static-core': 5.0.0 - '@types/qs': 6.9.7 - '@types/serve-static': 1.15.1 + "@types/body-parser": 1.19.2 + "@types/express-serve-static-core": 5.0.0 + "@types/serve-static": 2.2.0 - '@types/hast@3.0.4': + "@types/hast@3.0.4": dependencies: - '@types/unist': 3.0.3 + "@types/unist": 3.0.3 + + "@types/http-cache-semantics@4.0.4": {} - '@types/http-cache-semantics@4.0.1': {} + "@types/http-errors@2.0.5": {} - '@types/jsdom@21.1.7': + "@types/jsdom@27.0.0": dependencies: - '@types/node': 24.1.0 - '@types/tough-cookie': 4.0.2 - parse5: 7.1.2 + "@types/node": 25.0.3 + "@types/tough-cookie": 4.0.2 + parse5: 7.2.1 - '@types/json-schema@7.0.15': {} + "@types/json-schema@7.0.15": {} - '@types/json5@0.0.29': {} + "@types/json5@0.0.29": {} - '@types/keyv@3.1.4': + "@types/keyv@3.1.4": dependencies: - '@types/node': 22.15.14 + "@types/node": 25.0.3 - '@types/livereload@0.9.5': + "@types/livereload@0.9.5": dependencies: - '@types/ws': 8.5.4 - - '@types/luxon@3.4.2': {} - - '@types/mime@1.3.2': {} + "@types/ws": 8.5.4 - '@types/mime@3.0.1': {} + "@types/luxon@3.7.1": {} - '@types/minimatch@3.0.5': {} + "@types/mime@1.3.2": {} - '@types/minimist@1.2.2': {} + "@types/minimatch@3.0.5": {} - '@types/node@18.19.45': - dependencies: - undici-types: 5.26.5 + "@types/minimist@1.2.2": {} - '@types/node@20.14.9': + "@types/node@18.19.45": dependencies: undici-types: 5.26.5 - '@types/node@22.13.9': - dependencies: - undici-types: 6.20.0 - - '@types/node@22.15.14': + "@types/node@22.19.3": dependencies: undici-types: 6.21.0 - '@types/node@22.7.5': + "@types/node@25.0.3": dependencies: - undici-types: 6.19.8 + undici-types: 7.16.0 - '@types/node@24.1.0': - dependencies: - undici-types: 7.8.0 + "@types/normalize-package-data@2.4.1": {} - '@types/normalize-package-data@2.4.1': {} + "@types/qs@6.9.7": {} - '@types/qs@6.9.7': {} + "@types/range-parser@1.2.4": {} - '@types/range-parser@1.2.4': {} + "@types/relateurl@0.2.33": {} - '@types/responselike@1.0.0': + "@types/responselike@1.0.3": dependencies: - '@types/node': 22.15.14 - - '@types/semver@7.5.8': {} + "@types/node": 25.0.3 - '@types/send@0.17.1': + "@types/send@0.17.1": dependencies: - '@types/mime': 1.3.2 - '@types/node': 22.15.14 + "@types/mime": 1.3.2 + "@types/node": 25.0.3 - '@types/serve-static@1.15.1': + "@types/serve-static@2.2.0": dependencies: - '@types/mime': 3.0.1 - '@types/node': 22.15.14 + "@types/http-errors": 2.0.5 + "@types/node": 25.0.3 - '@types/stylus@0.48.41': + "@types/stylus@0.48.43": dependencies: - '@types/node': 22.7.5 + "@types/node": 25.0.3 - '@types/tough-cookie@4.0.2': {} + "@types/tough-cookie@4.0.2": {} - '@types/triple-beam@1.3.2': {} + "@types/triple-beam@1.3.2": {} - '@types/unist@3.0.3': {} + "@types/unist@3.0.3": {} - '@types/webpack-bundle-analyzer@4.7.0(@swc/core@1.9.2)(webpack-cli@5.1.4)': + "@types/webpack-bundle-analyzer@4.7.0(@swc/core@1.9.2)(webpack-cli@6.0.1)": dependencies: - '@types/node': 24.1.0 - tapable: 2.2.1 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@5.1.4) + "@types/node": 25.0.3 + tapable: 2.3.0 + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) transitivePeerDependencies: - - '@swc/core' + - "@swc/core" - esbuild - uglify-js - webpack-cli - '@types/webpack-env@1.18.8': {} + "@types/webpack-env@1.18.8": {} - '@types/ws@8.5.4': + "@types/ws@8.5.4": dependencies: - '@types/node': 22.15.14 + "@types/node": 25.0.3 - '@types/yauzl@2.10.3': + "@types/yauzl@2.10.3": dependencies: - '@types/node': 22.15.14 + "@types/node": 25.0.3 optional: true - '@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1)(typescript@5.9.2)': + "@typescript-eslint/eslint-plugin@8.51.0(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3)": dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/type-utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 7.18.0 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.1 + "@eslint-community/regexpp": 4.12.1 + "@typescript-eslint/parser": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + "@typescript-eslint/scope-manager": 8.51.0 + "@typescript-eslint/type-utils": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + "@typescript-eslint/utils": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.51.0 + eslint: 9.39.2(jiti@2.4.2) + ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 + ts-api-utils: 2.3.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2)': + "@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3)": dependencies: - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.6 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.9.2 + "@typescript-eslint/scope-manager": 8.51.0 + "@typescript-eslint/types": 8.51.0 + "@typescript-eslint/typescript-estree": 8.51.0(typescript@5.9.3) + "@typescript-eslint/visitor-keys": 8.51.0 + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.39.2(jiti@2.4.2) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@6.21.0': - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - - '@typescript-eslint/scope-manager@7.18.0': + "@typescript-eslint/project-service@8.46.4(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 + "@typescript-eslint/tsconfig-utils": 8.50.1(typescript@5.9.3) + "@typescript-eslint/types": 8.50.1 + debug: 4.4.3(supports-color@5.5.0) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': + "@typescript-eslint/project-service@8.51.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) - '@typescript-eslint/utils': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - debug: 4.3.7 - eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 + "@typescript-eslint/tsconfig-utils": 8.51.0(typescript@5.9.3) + "@typescript-eslint/types": 8.51.0 + debug: 4.4.3(supports-color@5.5.0) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@4.33.0': {} - - '@typescript-eslint/types@5.62.0': {} + "@typescript-eslint/scope-manager@8.46.4": + dependencies: + "@typescript-eslint/types": 8.46.4 + "@typescript-eslint/visitor-keys": 8.46.4 - '@typescript-eslint/types@6.21.0': {} + "@typescript-eslint/scope-manager@8.51.0": + dependencies: + "@typescript-eslint/types": 8.51.0 + "@typescript-eslint/visitor-keys": 8.51.0 - '@typescript-eslint/types@7.14.1': {} + "@typescript-eslint/tsconfig-utils@8.46.4(typescript@5.9.3)": + dependencies: + typescript: 5.9.3 - '@typescript-eslint/types@7.18.0': {} + "@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)": + dependencies: + typescript: 5.9.3 - '@typescript-eslint/typescript-estree@4.33.0(typescript@3.9.10)': + "@typescript-eslint/tsconfig-utils@8.51.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 4.33.0 - '@typescript-eslint/visitor-keys': 4.33.0 - debug: 4.4.0 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@3.9.10) - optionalDependencies: - typescript: 3.9.10 - transitivePeerDependencies: - - supports-color + typescript: 5.9.3 - '@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5)': + "@typescript-eslint/type-utils@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 5.62.0 - '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.4.0 - globby: 11.1.0 - is-glob: 4.0.3 - semver: 7.6.3 - tsutils: 3.21.0(typescript@4.9.5) - optionalDependencies: - typescript: 4.9.5 + "@typescript-eslint/types": 8.51.0 + "@typescript-eslint/typescript-estree": 8.51.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + debug: 4.4.3(supports-color@5.5.0) + eslint: 9.39.2(jiti@2.4.2) + ts-api-utils: 2.3.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@6.21.0(typescript@5.9.2)': + "@typescript-eslint/types@7.18.0": {} + + "@typescript-eslint/types@8.46.4": {} + + "@typescript-eslint/types@8.50.0": {} + + "@typescript-eslint/types@8.50.1": {} + + "@typescript-eslint/types@8.51.0": {} + + "@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.4.0 + "@typescript-eslint/types": 7.18.0 + "@typescript-eslint/visitor-keys": 7.18.0 + debug: 4.4.3(supports-color@5.5.0) globby: 11.1.0 is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.9.2) + minimatch: 9.0.5 + semver: 7.7.3 + ts-api-utils: 1.3.0(typescript@5.9.3) optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.14.1(typescript@5.9.2)': + "@typescript-eslint/typescript-estree@8.46.4(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 7.14.1 - '@typescript-eslint/visitor-keys': 7.14.1 - debug: 4.4.0 - globby: 11.1.0 + "@typescript-eslint/project-service": 8.46.4(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.46.4(typescript@5.9.3) + "@typescript-eslint/types": 8.46.4 + "@typescript-eslint/visitor-keys": 8.46.4 + debug: 4.4.3(supports-color@5.5.0) + fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 + semver: 7.7.3 + ts-api-utils: 2.1.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@7.18.0(typescript@5.9.2)': + "@typescript-eslint/typescript-estree@8.51.0(typescript@5.9.3)": dependencies: - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/visitor-keys': 7.18.0 - debug: 4.3.7 - globby: 11.1.0 - is-glob: 4.0.3 + "@typescript-eslint/project-service": 8.51.0(typescript@5.9.3) + "@typescript-eslint/tsconfig-utils": 8.51.0(typescript@5.9.3) + "@typescript-eslint/types": 8.51.0 + "@typescript-eslint/visitor-keys": 8.51.0 + debug: 4.4.3(supports-color@5.5.0) minimatch: 9.0.5 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.9.2) - optionalDependencies: - typescript: 5.9.2 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.3.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@6.21.0(eslint@8.57.1)(typescript@5.9.2)': + "@typescript-eslint/utils@8.46.4(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.2) - eslint: 8.57.1 - semver: 7.6.3 + "@eslint-community/eslint-utils": 4.7.0(eslint@9.39.2(jiti@2.4.2)) + "@typescript-eslint/scope-manager": 8.46.4 + "@typescript-eslint/types": 8.46.4 + "@typescript-eslint/typescript-estree": 8.46.4(typescript@5.9.3) + eslint: 9.39.2(jiti@2.4.2) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/utils@7.18.0(eslint@8.57.1)(typescript@5.9.2)': + "@typescript-eslint/utils@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3)": dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@typescript-eslint/scope-manager': 7.18.0 - '@typescript-eslint/types': 7.18.0 - '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.9.2) - eslint: 8.57.1 + "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.2(jiti@2.4.2)) + "@typescript-eslint/scope-manager": 8.51.0 + "@typescript-eslint/types": 8.51.0 + "@typescript-eslint/typescript-estree": 8.51.0(typescript@5.9.3) + eslint: 9.39.2(jiti@2.4.2) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - - typescript - - '@typescript-eslint/visitor-keys@4.33.0': - dependencies: - '@typescript-eslint/types': 4.33.0 - eslint-visitor-keys: 2.1.0 - - '@typescript-eslint/visitor-keys@5.62.0': - dependencies: - '@typescript-eslint/types': 5.62.0 - eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@6.21.0': + "@typescript-eslint/visitor-keys@7.18.0": dependencies: - '@typescript-eslint/types': 6.21.0 + "@typescript-eslint/types": 7.18.0 eslint-visitor-keys: 3.4.3 - '@typescript-eslint/visitor-keys@7.14.1': + "@typescript-eslint/visitor-keys@8.46.4": dependencies: - '@typescript-eslint/types': 7.14.1 - eslint-visitor-keys: 3.4.3 + "@typescript-eslint/types": 8.46.4 + eslint-visitor-keys: 4.2.1 - '@typescript-eslint/visitor-keys@7.18.0': + "@typescript-eslint/visitor-keys@8.51.0": dependencies: - '@typescript-eslint/types': 7.18.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} + "@typescript-eslint/types": 8.51.0 + eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@3.2.4(vitest@3.2.4)': + "@vitest/coverage-v8@4.0.16(vitest@4.0.16)": dependencies: - '@ampproject/remapping': 2.3.0 - '@bcoe/v8-coverage': 1.0.2 - ast-v8-to-istanbul: 0.3.3 - debug: 4.4.1 + "@bcoe/v8-coverage": 1.0.2 + "@vitest/utils": 4.0.16 + ast-v8-to-istanbul: 0.3.9 istanbul-lib-coverage: 3.2.2 istanbul-lib-report: 3.0.1 istanbul-lib-source-maps: 5.0.6 - istanbul-reports: 3.1.7 - magic-string: 0.30.17 - magicast: 0.3.5 - std-env: 3.9.0 - test-exclude: 7.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.1.0)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0(canvas@3.1.2))(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) + istanbul-reports: 3.2.0 + magicast: 0.5.1 + obug: 2.1.1 + std-env: 3.10.0 + tinyrainbow: 3.0.3 + vitest: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@27.4.0(canvas@3.2.0))(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/expect@3.2.4': + "@vitest/expect@4.0.16": dependencies: - '@types/chai': 5.2.2 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - tinyrainbow: 2.0.0 + "@standard-schema/spec": 1.1.0 + "@types/chai": 5.2.2 + "@vitest/spy": 4.0.16 + "@vitest/utils": 4.0.16 + chai: 6.2.1 + tinyrainbow: 3.0.3 - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0))': + "@vitest/mocker@4.0.16(vite@6.3.6(@types/node@25.0.3)(jiti@2.4.2)(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1))": dependencies: - '@vitest/spy': 3.2.4 + "@vitest/spy": 4.0.16 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.21 optionalDependencies: - vite: 7.1.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) + vite: 6.3.6(@types/node@25.0.3)(jiti@2.4.2)(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1) - '@vitest/pretty-format@3.2.4': + "@vitest/pretty-format@4.0.16": dependencies: - tinyrainbow: 2.0.0 + tinyrainbow: 3.0.3 - '@vitest/runner@3.2.4': + "@vitest/runner@4.0.16": dependencies: - '@vitest/utils': 3.2.4 + "@vitest/utils": 4.0.16 pathe: 2.0.3 - strip-literal: 3.0.0 - '@vitest/snapshot@3.2.4': + "@vitest/snapshot@4.0.16": dependencies: - '@vitest/pretty-format': 3.2.4 - magic-string: 0.30.17 + "@vitest/pretty-format": 4.0.16 + magic-string: 0.30.21 pathe: 2.0.3 - '@vitest/spy@3.2.4': - dependencies: - tinyspy: 4.0.3 + "@vitest/spy@4.0.16": {} - '@vitest/ui@3.2.4(vitest@3.2.4)': + "@vitest/ui@4.0.16(vitest@4.0.16)": dependencies: - '@vitest/utils': 3.2.4 + "@vitest/utils": 4.0.16 fflate: 0.8.2 flatted: 3.3.3 pathe: 2.0.3 - sirv: 3.0.1 - tinyglobby: 0.2.14 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.1.0)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0(canvas@3.1.2))(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) + sirv: 3.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vitest: 4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@27.4.0(canvas@3.2.0))(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1) - '@vitest/utils@3.2.4': + "@vitest/utils@4.0.16": dependencies: - '@vitest/pretty-format': 3.2.4 - loupe: 3.2.0 - tinyrainbow: 2.0.0 + "@vitest/pretty-format": 4.0.16 + tinyrainbow: 3.0.3 - '@vue/compiler-core@3.4.35': + "@vue/compiler-core@3.4.35": dependencies: - '@babel/parser': 7.27.2 - '@vue/shared': 3.4.35 + "@babel/parser": 7.28.3 + "@vue/shared": 3.4.35 entities: 4.5.0 estree-walker: 2.0.2 source-map-js: 1.2.1 - '@vue/compiler-dom@3.4.35': + "@vue/compiler-dom@3.4.35": dependencies: - '@vue/compiler-core': 3.4.35 - '@vue/shared': 3.4.35 + "@vue/compiler-core": 3.4.35 + "@vue/shared": 3.4.35 - '@vue/compiler-sfc@3.4.35': + "@vue/compiler-sfc@3.4.35": dependencies: - '@babel/parser': 7.27.2 - '@vue/compiler-core': 3.4.35 - '@vue/compiler-dom': 3.4.35 - '@vue/compiler-ssr': 3.4.35 - '@vue/shared': 3.4.35 + "@babel/parser": 7.28.3 + "@vue/compiler-core": 3.4.35 + "@vue/compiler-dom": 3.4.35 + "@vue/compiler-ssr": 3.4.35 + "@vue/shared": 3.4.35 estree-walker: 2.0.2 magic-string: 0.30.17 postcss: 8.5.6 source-map-js: 1.2.1 - '@vue/compiler-ssr@3.4.35': + "@vue/compiler-ssr@3.4.35": dependencies: - '@vue/compiler-dom': 3.4.35 - '@vue/shared': 3.4.35 + "@vue/compiler-dom": 3.4.35 + "@vue/shared": 3.4.35 - '@vue/shared@3.4.35': {} + "@vue/shared@3.4.35": {} - '@webassemblyjs/ast@1.14.1': + "@webassemblyjs/ast@1.14.1": dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} + "@webassemblyjs/helper-numbers": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 - '@webassemblyjs/helper-buffer@1.14.1': {} + "@webassemblyjs/floating-point-hex-parser@1.13.2": {} - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 + "@webassemblyjs/helper-api-error@1.13.2": {} - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + "@webassemblyjs/helper-buffer@1.14.1": {} - '@webassemblyjs/helper-wasm-section@1.14.1': + "@webassemblyjs/helper-numbers@1.13.2": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 + "@webassemblyjs/floating-point-hex-parser": 1.13.2 + "@webassemblyjs/helper-api-error": 1.13.2 + "@xtuc/long": 4.2.2 - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 + "@webassemblyjs/helper-wasm-bytecode@1.13.2": {} - '@webassemblyjs/leb128@1.13.2': + "@webassemblyjs/helper-wasm-section@1.14.1": dependencies: - '@xtuc/long': 4.2.2 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/wasm-gen": 1.14.1 - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': + "@webassemblyjs/ieee754@1.13.2": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 + "@xtuc/ieee754": 1.2.0 - '@webassemblyjs/wasm-gen@1.14.1': + "@webassemblyjs/leb128@1.13.2": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 + "@xtuc/long": 4.2.2 - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 + "@webassemblyjs/utf8@1.13.2": {} - '@webassemblyjs/wasm-parser@1.14.1': + "@webassemblyjs/wasm-edit@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/helper-wasm-section": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-opt": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 + "@webassemblyjs/wast-printer": 1.14.1 - '@webassemblyjs/wast-printer@1.14.1': + "@webassemblyjs/wasm-gen@1.14.1": dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 - '@webpack-cli/configtest@2.1.1(webpack-cli@5.1.4)(webpack@5.101.0)': + "@webassemblyjs/wasm-opt@1.14.1": dependencies: - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-buffer": 1.14.1 + "@webassemblyjs/wasm-gen": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 - '@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': + "@webassemblyjs/wasm-parser@1.14.1": dependencies: - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/helper-api-error": 1.13.2 + "@webassemblyjs/helper-wasm-bytecode": 1.13.2 + "@webassemblyjs/ieee754": 1.13.2 + "@webassemblyjs/leb128": 1.13.2 + "@webassemblyjs/utf8": 1.13.2 - '@webpack-cli/info@2.0.2(webpack-cli@5.1.4)(webpack@5.101.0)': + "@webassemblyjs/wast-printer@1.14.1": dependencies: - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + "@webassemblyjs/ast": 1.14.1 + "@xtuc/long": 4.2.2 - '@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': + "@webpack-cli/configtest@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)": dependencies: - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.1.0)(webpack@5.104.1) - '@webpack-cli/serve@2.0.5(webpack-cli@5.1.4)(webpack@5.101.0)': + "@webpack-cli/info@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)": dependencies: - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.1.0)(webpack@5.104.1) - '@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.101.0)': + "@webpack-cli/serve@3.0.1(webpack-cli@6.0.1)(webpack@5.104.1)": dependencies: - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.1.0)(webpack@5.104.1) - '@xtuc/ieee754@1.2.0': {} + "@xtuc/ieee754@1.2.0": {} - '@xtuc/long@4.2.2': {} + "@xtuc/long@4.2.2": {} - '@yarnpkg/lockfile@1.1.0': {} + "@yarnpkg/lockfile@1.1.0": {} - '@yarnpkg/parsers@3.0.0-rc.46': + "@yarnpkg/parsers@3.0.2": dependencies: js-yaml: 3.14.1 - tslib: 2.6.2 + tslib: 2.8.1 - '@zkochan/js-yaml@0.0.7': + "@zkochan/js-yaml@0.0.7": dependencies: argparse: 2.0.1 @@ -11794,37 +13596,37 @@ snapshots: abbrev@1.1.1: {} - abbrev@2.0.0: {} + abbrev@3.0.1: {} abort-controller@3.0.0: dependencies: event-target-shim: 5.0.1 - accepts@1.3.8: + accepts@2.0.0: dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 + mime-types: 3.0.2 + negotiator: 1.0.0 - ace-builds@1.31.1: {} - - ace-builds@1.32.2: {} + ace-builds@1.43.5: {} acorn-import-phases@1.0.4(acorn@8.15.0): dependencies: acorn: 8.15.0 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.12.1 + acorn: 8.15.0 acorn-walk@8.2.0: {} + acorn-walk@8.3.4: + dependencies: + acorn: 8.15.0 + acorn@7.4.1: {} acorn@8.10.0: {} - acorn@8.11.3: {} - acorn@8.12.1: {} acorn@8.15.0: {} @@ -11863,10 +13665,6 @@ snapshots: ansi-colors@4.1.3: {} - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - ansi-regex@5.0.1: {} ansi-regex@6.0.1: {} @@ -11879,6 +13677,8 @@ snapshots: ansi-styles@6.2.1: {} + ansi-styles@6.2.3: {} + any-promise@1.3.0: {} anymatch@3.1.3: @@ -11900,58 +13700,61 @@ snapshots: argparse@2.0.1: {} - array-buffer-byte-length@1.0.0: + array-buffer-byte-length@1.0.2: dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.2 + call-bound: 1.0.4 + is-array-buffer: 3.0.5 array-differ@3.0.0: {} - array-flatten@1.1.1: {} - array-ify@1.0.0: {} - array-includes@3.1.7: + array-includes@3.1.9: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 - get-intrinsic: 1.2.4 - is-string: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + is-string: 1.1.1 + math-intrinsics: 1.1.0 array-union@2.1.0: {} - array.prototype.findlastindex@1.2.3: + array.prototype.findlastindex@1.2.6: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-shim-unscopables: 1.1.0 - array.prototype.flat@1.3.2: + array.prototype.flat@1.3.3: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.0 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 - array.prototype.flatmap@1.3.2: + array.prototype.flatmap@1.3.3: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 - es-shim-unscopables: 1.0.0 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-shim-unscopables: 1.1.0 - arraybuffer.prototype.slice@1.0.2: + arraybuffer.prototype.slice@1.0.4: dependencies: - array-buffer-byte-length: 1.0.0 - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.2 - is-shared-array-buffer: 1.0.2 + array-buffer-byte-length: 1.0.2 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + is-array-buffer: 3.0.5 arrify@1.0.1: {} @@ -11961,27 +13764,31 @@ snapshots: assert-never@1.3.0: {} - assertion-error@2.0.1: {} - - ast-module-types@2.7.1: {} - - ast-module-types@3.0.0: {} - - ast-module-types@4.0.0: {} - ast-module-types@6.0.0: {} - ast-v8-to-istanbul@0.3.3: + ast-v8-to-istanbul@0.3.9: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/trace-mapping": 0.3.31 estree-walker: 3.0.3 js-tokens: 9.0.1 + async-function@1.0.0: {} + async@3.2.4: {} asynckit@0.4.0: {} - available-typed-arrays@1.0.5: {} + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.1.0 + + axios@1.13.2: + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug axios@1.7.4: dependencies: @@ -11991,59 +13798,59 @@ snapshots: transitivePeerDependencies: - debug - babel-loader@10.0.0(@babel/core@7.28.0)(webpack@5.101.0): + babel-loader@10.0.0(@babel/core@7.28.5)(webpack@5.104.1): dependencies: - '@babel/core': 7.28.0 + "@babel/core": 7.28.5 find-up: 5.0.0 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) - babel-loader@9.2.1(@babel/core@7.28.0)(webpack@5.101.0): + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.0 - find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - - babel-plugin-polyfill-corejs2@0.4.10(@babel/core@7.28.0): - dependencies: - '@babel/compat-data': 7.24.1 - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.28.0) + "@babel/compat-data": 7.28.5 + "@babel/core": 7.28.5 + "@babel/helper-define-polyfill-provider": 0.6.5(@babel/core@7.28.5) semver: 6.3.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-corejs3@0.10.4(@babel/core@7.28.0): + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.28.0) - core-js-compat: 3.36.1 + "@babel/core": 7.28.5 + "@babel/helper-define-polyfill-provider": 0.6.5(@babel/core@7.28.5) + core-js-compat: 3.45.1 transitivePeerDependencies: - supports-color - babel-plugin-polyfill-regenerator@0.6.1(@babel/core@7.28.0): + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.5): dependencies: - '@babel/core': 7.28.0 - '@babel/helper-define-polyfill-provider': 0.6.1(@babel/core@7.28.0) + "@babel/core": 7.28.5 + "@babel/helper-define-polyfill-provider": 0.6.5(@babel/core@7.28.5) transitivePeerDependencies: - supports-color babel-walk@3.0.0-canary-5: dependencies: - '@babel/types': 7.27.1 + "@babel/types": 7.28.2 balanced-match@1.0.2: {} base64-js@1.5.1: {} + baseline-browser-mapping@2.9.11: {} + before-after-hook@2.2.3: {} - bin-links@4.0.4: + bidi-js@1.0.3: dependencies: - cmd-shim: 6.0.3 - npm-normalize-package-bin: 3.0.1 - read-cmd-shim: 4.0.0 - write-file-atomic: 5.0.1 + require-from-string: 2.0.2 + + bin-links@5.0.0: + dependencies: + cmd-shim: 7.0.0 + npm-normalize-package-bin: 4.0.0 + proc-log: 5.0.0 + read-cmd-shim: 5.0.0 + write-file-atomic: 6.0.0 binary-extensions@2.2.0: {} @@ -12053,29 +13860,26 @@ snapshots: inherits: 2.0.4 readable-stream: 3.6.2 - body-parser@1.20.3: + body-parser@2.2.1: dependencies: bytes: 3.1.2 content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 + debug: 4.4.3(supports-color@5.5.0) http-errors: 2.0.0 - iconv-lite: 0.4.24 + iconv-lite: 0.7.1 on-finished: 2.4.1 - qs: 6.13.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 + qs: 6.14.0 + raw-body: 3.0.2 + type-is: 2.0.1 transitivePeerDependencies: - supports-color boolean@3.2.0: optional: true - bootstrap@5.3.2(@popperjs/core@2.11.8): + bootstrap@5.3.8(@popperjs/core@2.11.8): dependencies: - '@popperjs/core': 2.11.8 + "@popperjs/core": 2.11.8 brace-expansion@1.1.11: dependencies: @@ -12090,16 +13894,15 @@ snapshots: dependencies: fill-range: 7.0.1 - browser-or-node@2.1.1: {} - browser-or-node@3.0.0: {} - browserslist@4.25.1: + browserslist@4.28.1: dependencies: - caniuse-lite: 1.0.30001731 - electron-to-chromium: 1.5.193 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.1) + baseline-browser-mapping: 2.9.11 + caniuse-lite: 1.0.30001761 + electron-to-chromium: 1.5.267 + node-releases: 2.0.27 + update-browserslist-db: 1.2.3(browserslist@4.28.1) buffer-crc32@0.2.13: {} @@ -12114,11 +13917,9 @@ snapshots: bytes@3.1.2: {} - cac@6.7.14: {} - - cacache@18.0.3: + cacache@19.0.1: dependencies: - '@npmcli/fs': 3.1.1 + "@npmcli/fs": 4.0.0 fs-minipass: 3.0.2 glob: 10.4.5 lru-cache: 10.4.3 @@ -12126,23 +13927,42 @@ snapshots: minipass-collect: 2.0.1 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - p-map: 4.0.0 - ssri: 10.0.6 - tar: 6.2.1 - unique-filename: 3.0.0 + p-map: 7.0.4 + ssri: 12.0.0 + tar: 7.5.2 + unique-filename: 4.0.0 + + cacache@20.0.3: + dependencies: + "@npmcli/fs": 5.0.0 + fs-minipass: 3.0.2 + glob: 13.0.0 + lru-cache: 11.2.4 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 7.0.4 + ssri: 13.0.0 + unique-filename: 5.0.0 cacheable-lookup@5.0.4: {} - cacheable-request@7.0.2: + cacheable-request@7.0.4: dependencies: clone-response: 1.0.3 get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.2 + http-cache-semantics: 4.2.0 + keyv: 4.5.4 lowercase-keys: 2.0.0 normalize-url: 6.1.0 responselike: 2.0.1 + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + call-bind@1.0.7: dependencies: es-define-property: 1.0.0 @@ -12151,12 +13971,24 @@ snapshots: get-intrinsic: 1.2.4 set-function-length: 1.2.2 + call-bind@1.0.8: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + get-intrinsic: 1.3.0 + set-function-length: 1.2.2 + + call-bound@1.0.4: + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + callsites@3.1.0: {} camel-case@4.1.2: dependencies: pascal-case: 3.1.2 - tslib: 2.6.2 + tslib: 2.8.1 camelcase-keys@6.2.2: dependencies: @@ -12166,20 +13998,20 @@ snapshots: camelcase@5.3.1: {} - caniuse-lite@1.0.30001731: {} + caniuse-lite@1.0.30001761: {} - canvas@3.1.2: + canvas@3.2.0: dependencies: node-addon-api: 7.1.1 prebuild-install: 7.1.3 - chai@5.2.0: + capital-case@1.0.4: dependencies: - assertion-error: 2.0.1 - check-error: 2.1.1 - deep-eql: 5.0.2 - loupe: 3.1.3 - pathval: 2.0.0 + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 + + chai@6.2.1: {} chalk@4.1.0: dependencies: @@ -12193,13 +14025,26 @@ snapshots: chalk@5.3.0: {} + change-case@4.1.2: + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.8.1 + character-parser@2.2.0: dependencies: is-regex: 1.1.4 - chardet@0.7.0: {} - - check-error@2.1.1: {} + chardet@2.1.1: {} chokidar@3.5.3: dependencies: @@ -12213,17 +14058,23 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + chownr@1.1.4: {} chownr@2.0.0: {} + chownr@3.0.0: {} + chrome-trace-event@1.0.3: {} ci-info@3.8.0: {} ci-info@4.0.0: {} - clean-css@5.3.2: + clean-css@5.3.3: dependencies: source-map: 0.6.1 @@ -12237,7 +14088,7 @@ snapshots: cli-spinners@2.9.0: {} - cli-width@3.0.0: {} + cli-width@4.1.0: {} cliui@7.0.4: dependencies: @@ -12271,37 +14122,33 @@ snapshots: cmd-shim@6.0.3: {} - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 + cmd-shim@7.0.0: {} color-convert@2.0.1: dependencies: color-name: 1.1.4 - color-name@1.1.3: {} + color-convert@3.1.3: + dependencies: + color-name: 2.1.0 color-name@1.1.4: {} - color-string@1.9.1: + color-name@2.1.0: {} + + color-string@2.1.4: dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 + color-name: 2.1.0 color-support@1.1.3: {} - color@3.2.1: + color@5.0.3: dependencies: - color-convert: 1.9.3 - color-string: 1.9.1 + color-convert: 3.1.3 + color-string: 2.1.4 colorette@2.0.20: {} - colorspace@1.1.4: - dependencies: - color: 3.2.1 - text-hex: 1.0.0 - columnify@1.6.0: dependencies: strip-ansi: 6.0.1 @@ -12311,26 +14158,22 @@ snapshots: dependencies: delayed-stream: 1.0.0 - commander@10.0.1: {} - commander@12.0.0: {} commander@12.1.0: {} commander@13.1.0: {} + commander@14.0.2: {} + commander@2.20.3: {} commander@7.2.0: {} - commander@9.5.0: {} - comment-parser@1.4.1: {} common-ancestor-path@1.0.1: {} - common-path-prefix@3.0.0: {} - commondir@1.0.1: {} compare-func@2.0.0: @@ -12347,12 +14190,11 @@ snapshots: readable-stream: 3.6.2 typedarray: 0.0.6 - concurrently@9.0.0: + concurrently@9.2.1: dependencies: chalk: 4.1.2 - lodash: 4.17.21 - rxjs: 7.8.1 - shell-quote: 1.8.1 + rxjs: 7.8.2 + shell-quote: 1.8.3 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -12361,14 +14203,18 @@ snapshots: console-control-strings@1.1.0: {} - constantinople@4.0.1: + constant-case@3.0.4: dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + no-case: 3.0.4 + tslib: 2.8.1 + upper-case: 2.0.2 - content-disposition@0.5.4: + constantinople@4.0.1: dependencies: - safe-buffer: 5.2.1 + "@babel/parser": 7.28.0 + "@babel/types": 7.28.2 + + content-disposition@1.0.1: {} content-type@1.0.5: {} @@ -12437,9 +14283,9 @@ snapshots: convert-source-map@2.0.0: {} - cookie-signature@1.0.6: {} + cookie-signature@1.2.2: {} - cookie@0.6.0: {} + cookie@0.7.2: {} copyfiles@2.4.1: dependencies: @@ -12451,37 +14297,33 @@ snapshots: untildify: 4.0.0 yargs: 16.2.0 - core-js-compat@3.35.1: - dependencies: - browserslist: 4.25.1 - - core-js-compat@3.36.1: + core-js-compat@3.45.1: dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.1.0(@types/node@24.1.0)(cosmiconfig@9.0.0(typescript@5.9.2))(typescript@5.9.2): + cosmiconfig-typescript-loader@6.1.0(@types/node@25.0.3)(cosmiconfig@9.0.0(typescript@5.9.3))(typescript@5.9.3): dependencies: - '@types/node': 24.1.0 - cosmiconfig: 9.0.0(typescript@5.9.2) + "@types/node": 25.0.3 + cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.4.2 - typescript: 5.9.2 + typescript: 5.9.3 - cosmiconfig@9.0.0(typescript@5.9.2): + cosmiconfig@9.0.0(typescript@5.9.3): dependencies: env-paths: 2.2.1 import-fresh: 3.3.0 - js-yaml: 4.1.0 + js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 create-require@1.1.1: {} - cross-env@10.0.0: + cross-env@10.1.0: dependencies: - '@epic-web/invariant': 1.0.0 + "@epic-web/invariant": 1.0.0 cross-spawn: 7.0.6 cross-spawn@7.0.3: @@ -12498,35 +14340,53 @@ snapshots: css-b64-images@0.2.5: {} + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + cssesc@3.0.0: {} - cssstyle@4.2.1: + cssstyle@5.3.5: dependencies: - '@asamuzakjp/css-color': 2.8.3 - rrweb-cssom: 0.8.0 + "@asamuzakjp/css-color": 4.1.1 + "@csstools/css-syntax-patches-for-csstree": 1.0.21 + css-tree: 3.1.0 dargs@7.0.0: {} dargs@8.1.0: {} - data-urls@5.0.0: + data-urls@6.0.0: dependencies: whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 + whatwg-url: 15.1.0 - dateformat@3.0.3: {} + data-view-buffer@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 - debounce@1.2.1: {} + data-view-byte-length@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 - debug@2.6.9: + data-view-byte-offset@1.0.1: dependencies: - ms: 2.0.0 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-data-view: 1.0.2 + + dateformat@3.0.3: {} + + debounce@1.2.1: {} - debug@3.2.7(supports-color@5.5.0): + debug@3.2.7: dependencies: ms: 2.1.3 - optionalDependencies: - supports-color: 5.5.0 debug@4.3.4: dependencies: @@ -12536,17 +14396,15 @@ snapshots: dependencies: ms: 2.1.2 - debug@4.3.7: - dependencies: - ms: 2.1.3 - - debug@4.4.0: + debug@4.4.1: dependencies: ms: 2.1.3 - debug@4.4.1: + debug@4.4.3(supports-color@5.5.0): dependencies: ms: 2.1.3 + optionalDependencies: + supports-color: 5.5.0 decamelize-keys@1.1.1: dependencies: @@ -12555,7 +14413,7 @@ snapshots: decamelize@1.2.0: {} - decimal.js@10.5.0: {} + decimal.js@10.6.0: {} decompress-response@6.0.0: dependencies: @@ -12569,6 +14427,8 @@ snapshots: deep-is@0.1.4: {} + deepcopy-esm@2.1.1: {} + defaults@1.0.4: dependencies: clone: 1.0.4 @@ -12579,12 +14439,13 @@ snapshots: dependencies: es-define-property: 1.0.0 es-errors: 1.3.0 - gopd: 1.0.1 + gopd: 1.2.0 define-lazy-prop@2.0.0: {} - define-properties@1.2.0: + define-properties@1.2.1: dependencies: + define-data-property: 1.1.4 has-property-descriptors: 1.0.2 object-keys: 1.1.1 @@ -12597,47 +14458,23 @@ snapshots: commander: 12.0.0 filing-cabinet: 5.0.2 precinct: 12.1.2 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - dependency-tree@9.0.0: - dependencies: - commander: 2.20.3 - debug: 4.4.0 - filing-cabinet: 3.3.1 - precinct: 9.2.1 - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - supports-color deprecation@2.3.1: {} - destroy@1.2.0: {} - detect-indent@5.0.0: {} detect-libc@1.0.3: {} detect-libc@2.0.1: {} + detect-libc@2.1.2: {} + detect-node@2.1.0: optional: true - detective-amd@3.1.2: - dependencies: - ast-module-types: 3.0.0 - escodegen: 2.1.0 - get-amd-module-type: 3.0.2 - node-source-walk: 4.3.0 - - detective-amd@4.2.0: - dependencies: - ast-module-types: 4.0.0 - escodegen: 2.1.0 - get-amd-module-type: 4.1.0 - node-source-walk: 5.0.2 - detective-amd@6.0.0: dependencies: ast-module-types: 6.0.0 @@ -12645,143 +14482,58 @@ snapshots: get-amd-module-type: 6.0.0 node-source-walk: 7.0.0 - detective-cjs@3.1.3: - dependencies: - ast-module-types: 3.0.0 - node-source-walk: 4.3.0 - - detective-cjs@4.1.0: - dependencies: - ast-module-types: 4.0.0 - node-source-walk: 5.0.2 - detective-cjs@6.0.0: dependencies: ast-module-types: 6.0.0 node-source-walk: 7.0.0 - detective-es6@2.2.2: - dependencies: - node-source-walk: 4.3.0 - - detective-es6@3.0.1: - dependencies: - node-source-walk: 5.0.2 - detective-es6@5.0.0: dependencies: node-source-walk: 7.0.0 - detective-less@1.0.2: - dependencies: - debug: 4.4.0 - gonzales-pe: 4.3.0 - node-source-walk: 4.3.0 - transitivePeerDependencies: - - supports-color - - detective-postcss@4.0.0: - dependencies: - debug: 4.4.0 - is-url: 1.2.4 - postcss: 8.5.6 - postcss-values-parser: 2.0.1 - transitivePeerDependencies: - - supports-color - - detective-postcss@6.1.3: - dependencies: - is-url: 1.2.4 - postcss: 8.5.6 - postcss-values-parser: 6.0.2(postcss@8.5.6) - detective-postcss@7.0.0(postcss@8.5.6): dependencies: is-url: 1.2.4 postcss: 8.5.6 postcss-values-parser: 6.0.2(postcss@8.5.6) - detective-sass@3.0.2: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 4.3.0 - - detective-sass@4.1.3: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 5.0.2 - detective-sass@6.0.0: dependencies: gonzales-pe: 4.3.0 node-source-walk: 7.0.0 - detective-scss@2.0.2: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 4.3.0 - - detective-scss@3.1.1: - dependencies: - gonzales-pe: 4.3.0 - node-source-walk: 5.0.2 - detective-scss@5.0.0: dependencies: gonzales-pe: 4.3.0 node-source-walk: 7.0.0 - detective-stylus@1.0.3: {} - - detective-stylus@2.0.1: {} - - detective-stylus@3.0.0: {} - detective-stylus@5.0.0: {} - detective-typescript@13.0.0(typescript@5.9.2): + detective-typescript@13.0.0(typescript@5.9.3): dependencies: - '@typescript-eslint/typescript-estree': 7.14.1(typescript@5.9.2) + "@typescript-eslint/typescript-estree": 7.18.0(typescript@5.9.3) ast-module-types: 6.0.0 node-source-walk: 7.0.0 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - detective-typescript@7.0.2: - dependencies: - '@typescript-eslint/typescript-estree': 4.33.0(typescript@3.9.10) - ast-module-types: 2.7.1 - node-source-walk: 4.3.0 - typescript: 3.9.10 - transitivePeerDependencies: - - supports-color - - detective-typescript@9.1.1: - dependencies: - '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - ast-module-types: 4.0.0 - node-source-walk: 5.0.2 - typescript: 4.9.5 + typescript: 5.9.3 transitivePeerDependencies: - supports-color - detective-vue2@2.0.3(typescript@5.9.2): + detective-vue2@2.0.3(typescript@5.9.3): dependencies: - '@vue/compiler-sfc': 3.4.35 + "@vue/compiler-sfc": 3.4.35 detective-es6: 5.0.0 detective-sass: 6.0.0 detective-scss: 5.0.0 detective-stylus: 5.0.0 - detective-typescript: 13.0.0(typescript@5.9.2) - typescript: 5.9.2 + detective-typescript: 13.0.0(typescript@5.9.3) + typescript: 5.9.3 transitivePeerDependencies: - supports-color - diff-sequences@29.6.3: {} - diff@4.0.2: {} + diff@8.0.2: {} + dir-glob@3.0.1: dependencies: path-type: 4.0.0 @@ -12790,16 +14542,12 @@ snapshots: dependencies: esutils: 2.0.3 - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - doctypes@1.1.0: {} dot-case@3.0.4: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 dot-prop@5.3.0: dependencies: @@ -12811,11 +14559,15 @@ snapshots: dotenv@10.0.0: {} - dotenv@16.3.1: {} - dotenv@16.4.5: {} - duplexer@0.1.2: {} + dotenv@17.2.3: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 eastasianwidth@0.2.0: {} @@ -12825,12 +14577,12 @@ snapshots: dependencies: jake: 10.8.7 - electron-to-chromium@1.5.193: {} + electron-to-chromium@1.5.267: {} - electron@35.0.0: + electron@39.2.7: dependencies: - '@electron/get': 2.0.2 - '@types/node': 22.13.9 + "@electron/get": 2.0.3 + "@types/node": 22.19.3 extract-zip: 2.0.1 transitivePeerDependencies: - supports-color @@ -12845,8 +14597,6 @@ snapshots: enabled@2.0.0: {} - encodeurl@1.0.2: {} - encodeurl@2.0.0: {} encoding@0.1.13: @@ -12858,6 +14608,10 @@ snapshots: dependencies: once: 1.4.0 + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -12866,7 +14620,7 @@ snapshots: enhanced-resolve@5.18.2: dependencies: graceful-fs: 4.2.11 - tapable: 2.2.1 + tapable: 2.3.0 enquirer@2.3.6: dependencies: @@ -12874,9 +14628,11 @@ snapshots: entities@4.5.0: {} - env-paths@2.2.1: {} + entities@6.0.1: {} + + entities@7.0.0: {} - envinfo@7.10.0: {} + env-paths@2.2.1: {} envinfo@7.13.0: {} @@ -12888,131 +14644,156 @@ snapshots: dependencies: is-arrayish: 0.2.1 - es-abstract@1.22.3: - dependencies: - array-buffer-byte-length: 1.0.0 - arraybuffer.prototype.slice: 1.0.2 - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - es-set-tostringtag: 2.0.1 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.0 - globalthis: 1.0.3 - gopd: 1.0.1 + es-abstract@1.24.0: + dependencies: + array-buffer-byte-length: 1.0.2 + arraybuffer.prototype.slice: 1.0.4 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + data-view-buffer: 1.0.2 + data-view-byte-length: 1.0.2 + data-view-byte-offset: 1.0.1 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + es-to-primitive: 1.3.0 + function.prototype.name: 1.1.8 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + get-symbol-description: 1.1.0 + globalthis: 1.0.4 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.0 - internal-slot: 1.0.5 - is-array-buffer: 3.0.2 + has-proto: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + internal-slot: 1.1.0 + is-array-buffer: 3.0.5 is-callable: 1.2.7 - is-negative-zero: 2.0.2 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.2 - is-string: 1.0.7 - is-typed-array: 1.1.12 - is-weakref: 1.0.2 - object-inspect: 1.13.3 + is-data-view: 1.0.2 + is-negative-zero: 2.0.3 + is-regex: 1.2.1 + is-set: 2.0.3 + is-shared-array-buffer: 1.0.4 + is-string: 1.1.1 + is-typed-array: 1.1.15 + is-weakref: 1.1.1 + math-intrinsics: 1.1.0 + object-inspect: 1.13.4 object-keys: 1.1.1 - object.assign: 4.1.4 - regexp.prototype.flags: 1.5.1 - safe-array-concat: 1.0.1 - safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.8 - string.prototype.trimend: 1.0.7 - string.prototype.trimstart: 1.0.7 - typed-array-buffer: 1.0.0 - typed-array-byte-length: 1.0.0 - typed-array-byte-offset: 1.0.0 - typed-array-length: 1.0.4 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.13 + object.assign: 4.1.7 + own-keys: 1.0.1 + regexp.prototype.flags: 1.5.4 + safe-array-concat: 1.1.3 + safe-push-apply: 1.0.0 + safe-regex-test: 1.1.0 + set-proto: 1.0.0 + stop-iteration-iterator: 1.1.0 + string.prototype.trim: 1.2.10 + string.prototype.trimend: 1.0.9 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.3 + typed-array-byte-length: 1.0.3 + typed-array-byte-offset: 1.0.4 + typed-array-length: 1.0.7 + unbox-primitive: 1.1.0 + which-typed-array: 1.1.19 es-define-property@1.0.0: dependencies: get-intrinsic: 1.2.4 + es-define-property@1.0.1: {} + es-errors@1.3.0: {} es-module-lexer@1.7.0: {} - es-set-tostringtag@2.0.1: + es-module-lexer@2.0.0: {} + + es-object-atoms@1.1.1: dependencies: - get-intrinsic: 1.2.4 - has: 1.0.3 + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 has-tostringtag: 1.0.2 + hasown: 2.0.2 - es-shim-unscopables@1.0.0: + es-shim-unscopables@1.1.0: dependencies: - has: 1.0.3 + hasown: 2.0.2 - es-to-primitive@1.2.1: + es-to-primitive@1.3.0: dependencies: is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 + is-date-object: 1.1.0 + is-symbol: 1.1.1 es6-error@4.1.1: optional: true - esbuild@0.24.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 - esbuild@0.25.9: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.9 - '@esbuild/android-arm': 0.25.9 - '@esbuild/android-arm64': 0.25.9 - '@esbuild/android-x64': 0.25.9 - '@esbuild/darwin-arm64': 0.25.9 - '@esbuild/darwin-x64': 0.25.9 - '@esbuild/freebsd-arm64': 0.25.9 - '@esbuild/freebsd-x64': 0.25.9 - '@esbuild/linux-arm': 0.25.9 - '@esbuild/linux-arm64': 0.25.9 - '@esbuild/linux-ia32': 0.25.9 - '@esbuild/linux-loong64': 0.25.9 - '@esbuild/linux-mips64el': 0.25.9 - '@esbuild/linux-ppc64': 0.25.9 - '@esbuild/linux-riscv64': 0.25.9 - '@esbuild/linux-s390x': 0.25.9 - '@esbuild/linux-x64': 0.25.9 - '@esbuild/netbsd-arm64': 0.25.9 - '@esbuild/netbsd-x64': 0.25.9 - '@esbuild/openbsd-arm64': 0.25.9 - '@esbuild/openbsd-x64': 0.25.9 - '@esbuild/openharmony-arm64': 0.25.9 - '@esbuild/sunos-x64': 0.25.9 - '@esbuild/win32-arm64': 0.25.9 - '@esbuild/win32-ia32': 0.25.9 - '@esbuild/win32-x64': 0.25.9 + "@esbuild/aix-ppc64": 0.25.9 + "@esbuild/android-arm": 0.25.9 + "@esbuild/android-arm64": 0.25.9 + "@esbuild/android-x64": 0.25.9 + "@esbuild/darwin-arm64": 0.25.9 + "@esbuild/darwin-x64": 0.25.9 + "@esbuild/freebsd-arm64": 0.25.9 + "@esbuild/freebsd-x64": 0.25.9 + "@esbuild/linux-arm": 0.25.9 + "@esbuild/linux-arm64": 0.25.9 + "@esbuild/linux-ia32": 0.25.9 + "@esbuild/linux-loong64": 0.25.9 + "@esbuild/linux-mips64el": 0.25.9 + "@esbuild/linux-ppc64": 0.25.9 + "@esbuild/linux-riscv64": 0.25.9 + "@esbuild/linux-s390x": 0.25.9 + "@esbuild/linux-x64": 0.25.9 + "@esbuild/netbsd-arm64": 0.25.9 + "@esbuild/netbsd-x64": 0.25.9 + "@esbuild/openbsd-arm64": 0.25.9 + "@esbuild/openbsd-x64": 0.25.9 + "@esbuild/openharmony-arm64": 0.25.9 + "@esbuild/sunos-x64": 0.25.9 + "@esbuild/win32-arm64": 0.25.9 + "@esbuild/win32-ia32": 0.25.9 + "@esbuild/win32-x64": 0.25.9 + + esbuild@0.27.2: + optionalDependencies: + "@esbuild/aix-ppc64": 0.27.2 + "@esbuild/android-arm": 0.27.2 + "@esbuild/android-arm64": 0.27.2 + "@esbuild/android-x64": 0.27.2 + "@esbuild/darwin-arm64": 0.27.2 + "@esbuild/darwin-x64": 0.27.2 + "@esbuild/freebsd-arm64": 0.27.2 + "@esbuild/freebsd-x64": 0.27.2 + "@esbuild/linux-arm": 0.27.2 + "@esbuild/linux-arm64": 0.27.2 + "@esbuild/linux-ia32": 0.27.2 + "@esbuild/linux-loong64": 0.27.2 + "@esbuild/linux-mips64el": 0.27.2 + "@esbuild/linux-ppc64": 0.27.2 + "@esbuild/linux-riscv64": 0.27.2 + "@esbuild/linux-s390x": 0.27.2 + "@esbuild/linux-x64": 0.27.2 + "@esbuild/netbsd-arm64": 0.27.2 + "@esbuild/netbsd-x64": 0.27.2 + "@esbuild/openbsd-arm64": 0.27.2 + "@esbuild/openbsd-x64": 0.27.2 + "@esbuild/openharmony-arm64": 0.27.2 + "@esbuild/sunos-x64": 0.27.2 + "@esbuild/win32-arm64": 0.27.2 + "@esbuild/win32-ia32": 0.27.2 + "@esbuild/win32-x64": 0.27.2 escalade@3.1.1: {} @@ -13032,198 +14813,160 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.1.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-config-prettier@9.1.0(eslint@8.57.1): + eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.4.2)): dependencies: - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) eslint-import-resolver-node@0.3.9: dependencies: - debug: 3.2.7(supports-color@5.5.0) - is-core-module: 2.13.1 - resolve: 1.22.8 + debug: 3.2.7 + is-core-module: 2.16.1 + resolve: 1.22.10 transitivePeerDependencies: - supports-color - eslint-module-utils@2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.4.2)): dependencies: - debug: 3.2.7(supports-color@5.5.0) + debug: 3.2.7 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) - eslint: 8.57.1 + "@typescript-eslint/parser": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 transitivePeerDependencies: - supports-color - eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.2(jiti@2.4.2)): dependencies: - array-includes: 3.1.7 - array.prototype.findlastindex: 1.2.3 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7(supports-color@5.5.0) + "@rtsao/scc": 1.1.0 + array-includes: 3.1.9 + array.prototype.findlastindex: 1.2.6 + array.prototype.flat: 1.3.3 + array.prototype.flatmap: 1.3.3 + debug: 3.2.7 doctrine: 2.1.0 - eslint: 8.57.1 + eslint: 9.39.2(jiti@2.4.2) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.9.2))(eslint-import-resolver-node@0.3.9)(eslint@8.57.1) - hasown: 2.0.0 - is-core-module: 2.13.1 + eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint@9.39.2(jiti@2.4.2)) + hasown: 2.0.2 + is-core-module: 2.16.1 is-glob: 4.0.3 minimatch: 3.1.2 - object.fromentries: 2.0.7 - object.groupby: 1.0.1 - object.values: 1.1.7 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.1 semver: 6.3.1 + string.prototype.trimend: 1.0.9 tsconfig-paths: 3.15.0 optionalDependencies: - '@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.9.2) + "@typescript-eslint/parser": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@48.5.0(eslint@8.57.1): - dependencies: - '@es-joy/jsdoccomment': 0.43.1 - are-docs-informative: 0.0.2 - comment-parser: 1.4.1 - debug: 4.4.0 - escape-string-regexp: 4.0.0 - eslint: 8.57.1 - esquery: 1.5.0 - parse-imports: 2.1.0 - semver: 7.6.3 - spdx-expression-parse: 4.0.0 - synckit: 0.9.0 - transitivePeerDependencies: - - supports-color - - eslint-plugin-jsdoc@50.6.11(eslint@8.57.1): + eslint-plugin-jsdoc@61.5.0(eslint@9.39.2(jiti@2.4.2)): dependencies: - '@es-joy/jsdoccomment': 0.49.0 + "@es-joy/jsdoccomment": 0.76.0 + "@es-joy/resolve.exports": 1.2.0 are-docs-informative: 0.0.2 comment-parser: 1.4.1 - debug: 4.4.0 + debug: 4.4.3(supports-color@5.5.0) escape-string-regexp: 4.0.0 - eslint: 8.57.1 - espree: 10.1.0 + eslint: 9.39.2(jiti@2.4.2) + espree: 10.4.0 esquery: 1.6.0 + html-entities: 2.6.0 + object-deep-merge: 2.0.0 parse-imports-exports: 0.2.4 - semver: 7.6.3 + semver: 7.7.3 spdx-expression-parse: 4.0.0 + to-valid-identifier: 1.0.0 transitivePeerDependencies: - supports-color - eslint-plugin-prettier@5.4.0(@types/eslint@8.56.6)(eslint-config-prettier@10.1.2(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): - dependencies: - eslint: 8.57.1 - prettier: 3.6.2 - prettier-linter-helpers: 1.0.0 - synckit: 0.11.4 - optionalDependencies: - '@types/eslint': 8.56.6 - eslint-config-prettier: 10.1.2(eslint@8.57.1) - - eslint-plugin-prettier@5.4.0(@types/eslint@8.56.6)(eslint-config-prettier@9.1.0(eslint@8.57.1))(eslint@8.57.1)(prettier@3.6.2): + eslint-plugin-prettier@5.5.4(@types/eslint@8.56.6)(eslint-config-prettier@10.1.8(eslint@9.39.2(jiti@2.4.2)))(eslint@9.39.2(jiti@2.4.2))(prettier@3.7.4): dependencies: - eslint: 8.57.1 - prettier: 3.6.2 + eslint: 9.39.2(jiti@2.4.2) + prettier: 3.7.4 prettier-linter-helpers: 1.0.0 - synckit: 0.11.4 + synckit: 0.11.11 optionalDependencies: - '@types/eslint': 8.56.6 - eslint-config-prettier: 9.1.0(eslint@8.57.1) - - eslint-plugin-tsdoc@0.2.17: - dependencies: - '@microsoft/tsdoc': 0.14.2 - '@microsoft/tsdoc-config': 0.16.2 + "@types/eslint": 8.56.6 + eslint-config-prettier: 10.1.8(eslint@9.39.2(jiti@2.4.2)) - eslint-plugin-tsdoc@0.4.0: + eslint-plugin-tsdoc@0.5.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3): dependencies: - '@microsoft/tsdoc': 0.15.1 - '@microsoft/tsdoc-config': 0.17.1 + "@microsoft/tsdoc": 0.16.0 + "@microsoft/tsdoc-config": 0.18.0 + "@typescript-eslint/utils": 8.46.4(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + transitivePeerDependencies: + - eslint + - supports-color + - typescript eslint-scope@5.1.1: dependencies: esrecurse: 4.3.0 estraverse: 4.3.0 - eslint-scope@7.2.2: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-visitor-keys@2.1.0: {} - eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.0.0: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 + eslint-visitor-keys@4.2.1: {} + + eslint@9.39.2(jiti@2.4.2): + dependencies: + "@eslint-community/eslint-utils": 4.9.0(eslint@9.39.2(jiti@2.4.2)) + "@eslint-community/regexpp": 4.12.1 + "@eslint/config-array": 0.21.1 + "@eslint/config-helpers": 0.4.2 + "@eslint/core": 0.17.0 + "@eslint/eslintrc": 3.3.1 + "@eslint/js": 9.39.2 + "@eslint/plugin-kit": 0.4.1 + "@humanfs/node": 0.16.6 + "@humanwhocodes/module-importer": 1.0.1 + "@humanwhocodes/retry": 0.4.3 + "@types/estree": 1.0.8 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.6 - doctrine: 3.0.0 + cross-spawn: 7.0.6 + debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 + file-entry-cache: 8.0.0 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 - graphemer: 1.4.0 ignore: 5.3.1 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 + optionalDependencies: + jiti: 2.4.2 transitivePeerDependencies: - supports-color - espree@10.1.0: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.0.0 - - espree@9.6.1: + espree@10.4.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} - esquery@1.5.0: - dependencies: - estraverse: 5.3.0 - esquery@1.6.0: dependencies: estraverse: 5.3.0 @@ -13240,7 +14983,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 esutils@2.0.3: {} @@ -13254,7 +14997,7 @@ snapshots: execa@5.0.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 get-stream: 6.0.1 human-signals: 2.1.0 is-stream: 2.0.1 @@ -13266,67 +15009,55 @@ snapshots: expand-template@2.0.3: {} - expect-type@0.15.0: {} - - expect-type@1.1.0: {} - - expect-type@1.2.1: {} + expect-type@1.3.0: {} exponential-backoff@3.1.1: {} - express-rate-limit@7.1.4(express@4.20.0): + express-rate-limit@8.2.1(express@5.2.1): dependencies: - express: 4.20.0 + express: 5.2.1 + ip-address: 10.0.1 - express@4.20.0: + express@5.2.1: dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.3 - content-disposition: 0.5.4 + accepts: 2.0.0 + body-parser: 2.2.1 + content-disposition: 1.0.1 content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 + cookie: 0.7.2 + cookie-signature: 1.2.2 + debug: 4.4.3(supports-color@5.5.0) depd: 2.0.0 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 + finalhandler: 2.1.1 + fresh: 2.0.0 http-errors: 2.0.0 - merge-descriptors: 1.0.3 - methods: 1.1.2 + merge-descriptors: 2.0.0 + mime-types: 3.0.2 on-finished: 2.4.1 + once: 1.4.0 parseurl: 1.3.3 - path-to-regexp: 0.1.10 proxy-addr: 2.0.7 - qs: 6.11.0 + qs: 6.14.0 range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.19.0 - serve-static: 1.16.0 - setprototypeof: 1.2.0 + router: 2.2.0 + send: 1.2.1 + serve-static: 2.2.1 statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 + type-is: 2.0.1 vary: 1.1.2 transitivePeerDependencies: - supports-color - external-editor@3.1.0: - dependencies: - chardet: 0.7.0 - iconv-lite: 0.4.24 - tmp: 0.0.33 - extract-zip@2.0.1: dependencies: - debug: 4.3.7 + debug: 4.4.3(supports-color@5.5.0) get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: - '@types/yauzl': 2.10.3 + "@types/yauzl": 2.10.3 transitivePeerDependencies: - supports-color @@ -13336,8 +15067,8 @@ snapshots: fast-glob@3.3.2: dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 + "@nodelib/fs.stat": 2.0.5 + "@nodelib/fs.walk": 1.2.8 glob-parent: 5.1.2 merge2: 1.4.1 micromatch: 4.0.5 @@ -13368,9 +15099,9 @@ snapshots: dependencies: escape-string-regexp: 1.0.5 - file-entry-cache@6.0.1: + file-entry-cache@8.0.0: dependencies: - flat-cache: 3.0.4 + flat-cache: 4.0.1 filelist@1.0.4: dependencies: @@ -13384,24 +15115,6 @@ snapshots: strip-outer: 1.0.1 trim-repeated: 1.0.0 - filing-cabinet@3.3.1: - dependencies: - app-module-path: 2.2.0 - commander: 2.20.3 - debug: 4.4.0 - enhanced-resolve: 5.17.1 - is-relative-path: 1.0.2 - module-definition: 3.4.0 - module-lookup-amd: 7.0.1 - resolve: 1.22.8 - resolve-dependency-path: 2.0.0 - sass-lookup: 3.0.0 - stylus-lookup: 3.0.2 - tsconfig-paths: 3.15.0 - typescript: 3.9.10 - transitivePeerDependencies: - - supports-color - filing-cabinet@5.0.2: dependencies: app-module-path: 2.2.0 @@ -13414,21 +15127,20 @@ snapshots: sass-lookup: 6.0.1 stylus-lookup: 6.0.0 tsconfig-paths: 4.2.0 - typescript: 5.9.2 + typescript: 5.9.3 fill-range@7.0.1: dependencies: to-regex-range: 5.0.1 - finalhandler@1.2.0: + finalhandler@2.1.1: dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 + debug: 4.4.3(supports-color@5.5.0) + encodeurl: 2.0.0 escape-html: 1.0.3 on-finished: 2.4.1 parseurl: 1.3.3 statuses: 2.0.1 - unpipe: 1.0.0 transitivePeerDependencies: - supports-color @@ -13438,11 +15150,6 @@ snapshots: make-dir: 3.1.0 pkg-dir: 4.2.0 - find-cache-dir@4.0.0: - dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - find-up@2.1.0: dependencies: locate-path: 2.0.0 @@ -13457,35 +15164,31 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - find-up@6.3.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - find-up@7.0.0: dependencies: locate-path: 7.2.0 path-exists: 5.0.0 unicorn-magic: 0.1.0 - flat-cache@3.0.4: + find-up@8.0.0: dependencies: - flatted: 3.3.1 - rimraf: 3.0.2 + locate-path: 8.0.0 + unicorn-magic: 0.3.0 - flat@5.0.2: {} + flat-cache@4.0.1: + dependencies: + flatted: 3.3.3 + keyv: 4.5.4 - flatted@3.3.1: {} + flat@5.0.2: {} flatted@3.3.3: {} - flatten@1.0.3: {} - fn.name@1.1.0: {} follow-redirects@1.15.6: {} - for-each@0.3.3: + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -13494,15 +15197,28 @@ snapshots: cross-spawn: 7.0.3 signal-exit: 4.1.0 + foreground-child@3.3.1: + dependencies: + cross-spawn: 7.0.6 + signal-exit: 4.1.0 + form-data@4.0.0: dependencies: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + forwarded@0.2.0: {} - fresh@0.5.2: {} + fresh@2.0.0: {} front-matter@4.0.2: dependencies: @@ -13510,13 +15226,7 @@ snapshots: fs-constants@1.0.0: {} - fs-extra@11.1.1: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - fs-extra@11.2.0: + fs-extra@11.3.3: dependencies: graceful-fs: 4.2.11 jsonfile: 6.1.0 @@ -13543,27 +15253,19 @@ snapshots: function-bind@1.1.2: {} - function.prototype.name@1.1.6: + function.prototype.name@1.1.8: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 functions-have-names: 1.2.3 + hasown: 2.0.2 + is-callable: 1.2.7 functions-have-names@1.2.3: {} gensync@1.0.0-beta.2: {} - get-amd-module-type@3.0.2: - dependencies: - ast-module-types: 3.0.0 - node-source-walk: 4.3.0 - - get-amd-module-type@4.1.0: - dependencies: - ast-module-types: 4.0.0 - node-source-walk: 5.0.2 - get-amd-module-type@6.0.0: dependencies: ast-module-types: 6.0.0 @@ -13581,29 +15283,48 @@ snapshots: has-symbols: 1.0.3 hasown: 2.0.2 + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + get-own-enumerable-property-symbols@3.0.2: {} get-pkg-repo@4.2.1: dependencies: - '@hutson/parse-repository-url': 3.0.2 + "@hutson/parse-repository-url": 3.0.2 hosted-git-info: 4.1.0 through2: 2.0.5 yargs: 16.2.0 get-port@5.1.1: {} + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + get-stream@5.2.0: dependencies: - pump: 3.0.0 + pump: 3.0.3 get-stream@6.0.0: {} get-stream@6.0.1: {} - get-symbol-description@1.0.0: + get-symbol-description@1.1.0: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 gh-pages@6.3.0: dependencies: @@ -13612,7 +15333,7 @@ snapshots: email-addresses: 5.0.0 filenamify: 4.3.0 find-cache-dir: 3.3.2 - fs-extra: 11.2.0 + fs-extra: 11.3.3 globby: 11.1.0 git-raw-commits@3.0.0: @@ -13671,7 +15392,7 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 1.11.1 - glob@11.0.0: + glob@11.0.2: dependencies: foreground-child: 3.1.1 jackspeak: 4.0.1 @@ -13680,15 +15401,21 @@ snapshots: package-json-from-dist: 1.0.0 path-scurry: 2.0.0 - glob@11.0.2: + glob@11.1.0: dependencies: - foreground-child: 3.1.1 - jackspeak: 4.0.1 - minimatch: 10.0.1 + foreground-child: 3.3.1 + jackspeak: 4.1.1 + minimatch: 10.1.1 minipass: 7.1.2 package-json-from-dist: 1.0.0 path-scurry: 2.0.0 + glob@13.0.0: + dependencies: + minimatch: 10.1.1 + minipass: 7.1.2 + path-scurry: 2.0.0 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -13711,7 +15438,7 @@ snapshots: es6-error: 4.1.1 matcher: 3.0.0 roarr: 2.15.4 - semver: 7.6.3 + semver: 7.7.3 serialize-error: 7.0.1 optional: true @@ -13719,15 +15446,12 @@ snapshots: dependencies: ini: 4.1.1 - globals@11.12.0: {} - - globals@13.20.0: - dependencies: - type-fest: 0.20.2 + globals@14.0.0: {} - globalthis@1.0.3: + globalthis@1.0.4: dependencies: - define-properties: 1.2.0 + define-properties: 1.2.1 + gopd: 1.2.0 globby@11.1.0: dependencies: @@ -13742,18 +15466,16 @@ snapshots: dependencies: minimist: 1.2.8 - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 + gopd@1.2.0: {} got@11.8.6: dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.0 + "@sindresorhus/is": 4.6.0 + "@szmarczak/http-timer": 4.0.6 + "@types/cacheable-request": 6.0.3 + "@types/responselike": 1.0.3 cacheable-lookup: 5.0.4 - cacheable-request: 7.0.2 + cacheable-request: 7.0.4 decompress-response: 6.0.0 http2-wrapper: 1.0.3 lowercase-keys: 2.0.0 @@ -13762,12 +15484,6 @@ snapshots: graceful-fs@4.2.11: {} - graphemer@1.4.0: {} - - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - handlebars@4.7.7: dependencies: minimist: 1.2.8 @@ -13791,11 +15507,13 @@ snapshots: has-proto@1.0.3: {} + has-proto@1.2.0: + dependencies: + dunder-proto: 1.0.1 + has-symbols@1.0.3: {} - has-tostringtag@1.0.0: - dependencies: - has-symbols: 1.0.3 + has-symbols@1.1.0: {} has-tostringtag@1.0.2: dependencies: @@ -13803,19 +15521,16 @@ snapshots: has-unicode@2.0.1: {} - has@1.0.3: - dependencies: - function-bind: 1.1.2 - - hasown@2.0.0: + hasown@2.0.2: dependencies: function-bind: 1.1.2 - hasown@2.0.2: + header-case@2.0.4: dependencies: - function-bind: 1.1.2 + capital-case: 1.0.4 + tslib: 2.8.1 - helmet@8.0.0: {} + helmet@8.1.0: {} hosted-git-info@2.8.9: {} @@ -13823,28 +15538,40 @@ snapshots: dependencies: lru-cache: 6.0.0 - hosted-git-info@7.0.2: + hosted-git-info@8.1.0: dependencies: lru-cache: 10.4.3 - html-encoding-sniffer@4.0.0: + hosted-git-info@9.0.2: dependencies: - whatwg-encoding: 3.1.1 + lru-cache: 11.2.4 + + html-encoding-sniffer@6.0.0: + dependencies: + "@exodus/bytes": 1.6.0 + transitivePeerDependencies: + - "@exodus/crypto" + + html-entities@2.6.0: {} html-escaper@2.0.2: {} - html-minifier-terser@7.2.0: + html-minifier-next@4.16.4(@swc/core@1.9.2): dependencies: - camel-case: 4.1.2 - clean-css: 5.3.2 - commander: 10.0.1 - entities: 4.5.0 - param-case: 3.0.4 + "@types/relateurl": 0.2.33 + change-case: 4.1.2 + commander: 14.0.2 + entities: 7.0.0 + lightningcss: 1.30.2 relateurl: 0.2.7 - terser: 5.36.0 + terser: 5.44.1 + optionalDependencies: + "@swc/core": 1.9.2 http-cache-semantics@4.1.1: {} + http-cache-semantics@4.2.0: {} + http-errors@2.0.0: dependencies: depd: 2.0.0 @@ -13853,10 +15580,18 @@ snapshots: statuses: 2.0.1 toidentifier: 1.0.1 + http-errors@2.0.1: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.2 + toidentifier: 1.0.1 + http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -13868,7 +15603,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -13876,11 +15611,12 @@ snapshots: husky@9.1.7: {} - iconv-lite@0.4.24: + iconv-lite@0.6.3: dependencies: safer-buffer: 2.1.2 + optional: true - iconv-lite@0.6.3: + iconv-lite@0.7.1: dependencies: safer-buffer: 2.1.2 @@ -13888,13 +15624,15 @@ snapshots: ignore-by-default@1.0.1: {} - ignore-walk@6.0.4: + ignore-walk@8.0.0: dependencies: - minimatch: 9.0.5 + minimatch: 10.1.1 ignore@5.3.1: {} - immutable@4.3.0: {} + ignore@7.0.5: {} + + immutable@5.1.4: {} import-fresh@3.3.0: dependencies: @@ -13912,8 +15650,6 @@ snapshots: indent-string@4.0.0: {} - indexes-of@1.0.1: {} - inflight@1.0.6: dependencies: once: 1.4.0 @@ -13927,59 +15663,63 @@ snapshots: ini@4.1.3: {} - init-package-json@6.0.3: + ini@5.0.0: {} + + ini@6.0.0: {} + + init-package-json@8.2.2: dependencies: - '@npmcli/package-json': 5.2.0 - npm-package-arg: 11.0.2 - promzard: 1.0.0 - read: 3.0.1 - semver: 7.6.3 + "@npmcli/package-json": 7.0.2 + npm-package-arg: 13.0.1 + promzard: 2.0.0 + read: 4.1.0 + semver: 7.7.2 validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.1 - transitivePeerDependencies: - - bluebird + validate-npm-package-name: 6.0.2 - inquirer@8.2.5: + inquirer@12.9.6(@types/node@25.0.3): dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-width: 3.0.0 - external-editor: 3.1.0 - figures: 3.2.0 - lodash: 4.17.21 - mute-stream: 0.0.8 - ora: 5.4.1 - run-async: 2.4.1 - rxjs: 7.8.1 - string-width: 4.2.3 - strip-ansi: 6.0.1 - through: 2.3.8 - wrap-ansi: 7.0.0 + "@inquirer/ansi": 1.0.2 + "@inquirer/core": 10.3.2(@types/node@25.0.3) + "@inquirer/prompts": 7.10.1(@types/node@25.0.3) + "@inquirer/type": 3.0.10(@types/node@25.0.3) + mute-stream: 2.0.0 + run-async: 4.0.6 + rxjs: 7.8.2 + optionalDependencies: + "@types/node": 25.0.3 - internal-slot@1.0.5: + internal-slot@1.1.0: dependencies: - get-intrinsic: 1.2.4 - has: 1.0.3 - side-channel: 1.0.6 + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.1.0 interpret@3.1.1: {} - ip@2.0.0: {} + ip-address@10.0.1: {} + + ip-address@10.1.0: {} ipaddr.js@1.9.1: {} - is-array-buffer@3.0.2: + is-array-buffer@3.0.5: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-typed-array: 1.1.12 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} + is-async-function@2.1.1: + dependencies: + async-function: 1.0.0 + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 - is-bigint@1.0.4: + is-bigint@1.1.0: dependencies: has-bigints: 1.0.2 @@ -13987,9 +15727,9 @@ snapshots: dependencies: binary-extensions: 2.2.0 - is-boolean-object@1.1.2: + is-boolean-object@1.2.2: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-callable@1.2.7: {} @@ -13998,16 +15738,23 @@ snapshots: dependencies: ci-info: 3.8.0 - is-core-module@2.13.1: + is-core-module@2.15.1: dependencies: - hasown: 2.0.0 + hasown: 2.0.2 - is-core-module@2.15.1: + is-core-module@2.16.1: dependencies: hasown: 2.0.2 - is-date-object@1.0.5: + is-data-view@1.0.2: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + is-typed-array: 1.1.15 + + is-date-object@1.1.0: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-docker@2.2.1: {} @@ -14019,20 +15766,32 @@ snapshots: is-extglob@2.1.1: {} + is-finalizationregistry@1.1.1: + dependencies: + call-bound: 1.0.4 + is-fullwidth-code-point@3.0.0: {} + is-generator-function@1.1.0: + dependencies: + call-bound: 1.0.4 + get-proto: 1.0.1 + has-tostringtag: 1.0.2 + safe-regex-test: 1.1.0 + is-glob@4.0.3: dependencies: is-extglob: 2.1.1 is-interactive@1.0.0: {} - is-lambda@1.0.1: {} + is-map@2.0.3: {} - is-negative-zero@2.0.2: {} + is-negative-zero@2.0.3: {} - is-number-object@1.0.7: + is-number-object@1.1.1: dependencies: + call-bound: 1.0.4 has-tostringtag: 1.0.2 is-number@7.0.0: {} @@ -14041,8 +15800,6 @@ snapshots: is-obj@2.0.0: {} - is-path-inside@3.0.3: {} - is-plain-obj@1.1.0: {} is-plain-object@2.0.4: @@ -14053,18 +15810,27 @@ snapshots: is-promise@2.2.2: {} + is-promise@4.0.0: {} + is-regex@1.1.4: dependencies: call-bind: 1.0.7 has-tostringtag: 1.0.2 + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + is-regexp@1.0.0: {} - is-relative-path@1.0.2: {} + is-set@2.0.3: {} - is-shared-array-buffer@1.0.2: + is-shared-array-buffer@1.0.4: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 is-ssh@1.4.0: dependencies: @@ -14074,13 +15840,16 @@ snapshots: is-stream@2.0.1: {} - is-string@1.0.7: + is-string@1.1.1: dependencies: - has-tostringtag: 1.0.0 + call-bound: 1.0.4 + has-tostringtag: 1.0.2 - is-symbol@1.0.4: + is-symbol@1.1.1: dependencies: - has-symbols: 1.0.3 + call-bound: 1.0.4 + has-symbols: 1.1.0 + safe-regex-test: 1.1.0 is-text-path@1.0.1: dependencies: @@ -14090,9 +15859,9 @@ snapshots: dependencies: text-extensions: 2.4.0 - is-typed-array@1.1.12: + is-typed-array@1.1.15: dependencies: - which-typed-array: 1.1.13 + which-typed-array: 1.1.19 is-unicode-supported@0.1.0: {} @@ -14100,9 +15869,16 @@ snapshots: is-url@1.2.4: {} - is-weakref@1.0.2: + is-weakmap@2.0.2: {} + + is-weakref@1.1.1: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 + + is-weakset@2.0.4: + dependencies: + call-bound: 1.0.4 + get-intrinsic: 1.3.0 is-wsl@2.2.0: dependencies: @@ -14130,28 +15906,32 @@ snapshots: istanbul-lib-source-maps@5.0.6: dependencies: - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/trace-mapping": 0.3.29 debug: 4.4.1 istanbul-lib-coverage: 3.2.2 transitivePeerDependencies: - supports-color - istanbul-reports@3.1.7: + istanbul-reports@3.2.0: dependencies: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 jackspeak@3.4.3: dependencies: - '@isaacs/cliui': 8.0.2 + "@isaacs/cliui": 8.0.2 optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + "@pkgjs/parseargs": 0.11.0 jackspeak@4.0.1: dependencies: - '@isaacs/cliui': 8.0.2 + "@isaacs/cliui": 8.0.2 optionalDependencies: - '@pkgjs/parseargs': 0.11.0 + "@pkgjs/parseargs": 0.11.0 + + jackspeak@4.1.1: + dependencies: + "@isaacs/cliui": 8.0.2 jake@10.8.7: dependencies: @@ -14162,18 +15942,16 @@ snapshots: javascript-natural-sort@0.7.1: {} - jest-diff@29.6.0: + jest-diff@30.2.0: dependencies: + "@jest/diff-sequences": 30.0.1 + "@jest/get-type": 30.1.0 chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.4.3 - pretty-format: 29.7.0 - - jest-get-type@29.4.3: {} + pretty-format: 30.2.0 jest-worker@27.5.1: dependencies: - '@types/node': 24.1.0 + "@types/node": 25.0.3 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -14200,45 +15978,46 @@ snapshots: dependencies: argparse: 2.0.1 - jsdoc-type-pratt-parser@4.0.0: {} + js-yaml@4.1.1: + dependencies: + argparse: 2.0.1 - jsdoc-type-pratt-parser@4.1.0: {} + jsdoc-type-pratt-parser@6.10.0: {} - jsdom-global@3.0.2(jsdom@26.1.0(canvas@3.1.2)): + jsdom-global@3.0.2(jsdom@27.4.0(canvas@3.2.0)): dependencies: - jsdom: 26.1.0(canvas@3.1.2) + jsdom: 27.4.0(canvas@3.2.0) - jsdom@26.1.0(canvas@3.1.2): + jsdom@27.4.0(canvas@3.2.0): dependencies: - cssstyle: 4.2.1 - data-urls: 5.0.0 - decimal.js: 10.5.0 - html-encoding-sniffer: 4.0.0 + "@acemir/cssom": 0.9.29 + "@asamuzakjp/dom-selector": 6.7.6 + "@exodus/bytes": 1.6.0 + cssstyle: 5.3.5 + data-urls: 6.0.0 + decimal.js: 10.6.0 + html-encoding-sniffer: 6.0.0 http-proxy-agent: 7.0.2 https-proxy-agent: 7.0.6 is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.16 - parse5: 7.2.1 - rrweb-cssom: 0.8.0 + parse5: 8.0.0 saxes: 6.0.0 symbol-tree: 3.2.4 - tough-cookie: 5.1.2 + tough-cookie: 6.0.0 w3c-xmlserializer: 5.0.0 - webidl-conversions: 7.0.0 - whatwg-encoding: 3.1.1 + webidl-conversions: 8.0.0 whatwg-mimetype: 4.0.0 - whatwg-url: 14.2.0 - ws: 8.18.0 + whatwg-url: 15.1.0 + ws: 8.18.3 xml-name-validator: 5.0.0 optionalDependencies: - canvas: 3.1.2 + canvas: 3.2.0 transitivePeerDependencies: + - "@exodus/crypto" - bufferutil - supports-color - utf-8-validate - jsesc@0.5.0: {} - jsesc@3.0.2: {} json-buffer@3.0.1: {} @@ -14247,7 +16026,9 @@ snapshots: json-parse-even-better-errors@2.3.1: {} - json-parse-even-better-errors@3.0.2: {} + json-parse-even-better-errors@4.0.0: {} + + json-parse-even-better-errors@5.0.0: {} json-schema-traverse@0.4.1: {} @@ -14269,17 +16050,16 @@ snapshots: jsonc-parser@3.2.0: {} - jsoneditor@10.0.0: + jsoneditor@10.4.2: dependencies: - ace-builds: 1.32.2 + ace-builds: 1.43.5 ajv: 6.12.6 javascript-natural-sort: 0.7.1 jmespath: 0.16.0 json-source-map: 0.6.1 - jsonrepair: 3.5.0 - mobius1-selectr: 2.4.13 + jsonrepair: 3.13.1 picomodal: 3.0.0 - vanilla-picker: 2.12.2 + vanilla-picker: 2.12.3 jsonfile@4.0.0: optionalDependencies: @@ -14293,7 +16073,7 @@ snapshots: jsonparse@1.3.1: {} - jsonrepair@3.5.0: {} + jsonrepair@3.13.1: {} jstransformer@1.0.0: dependencies: @@ -14304,7 +16084,7 @@ snapshots: just-diff@6.0.2: {} - keyv@4.5.2: + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -14316,19 +16096,18 @@ snapshots: kuler@2.0.0: {} - lerna@8.2.3(@swc/core@1.9.2)(encoding@0.1.13): + lerna@9.0.3(@swc/core@1.9.2)(@types/node@25.0.3): dependencies: - '@lerna/create': 8.2.3(@swc/core@1.9.2)(encoding@0.1.13)(typescript@5.9.2) - '@npmcli/arborist': 7.5.4 - '@npmcli/package-json': 5.2.0 - '@npmcli/run-script': 8.1.0 - '@nx/devkit': 19.8.4(nx@19.8.14(@swc/core@1.9.2)) - '@octokit/plugin-enterprise-rest': 6.0.1 - '@octokit/rest': 20.1.2 + "@lerna/create": 9.0.3(@swc/core@1.9.2)(@types/node@25.0.3)(typescript@5.9.3) + "@npmcli/arborist": 9.1.6 + "@npmcli/package-json": 7.0.2 + "@npmcli/run-script": 10.0.2 + "@nx/devkit": 22.3.3(nx@22.3.3(@swc/core@1.9.2)) + "@octokit/plugin-enterprise-rest": 6.0.1 + "@octokit/rest": 20.1.2 aproba: 2.0.0 byte-size: 8.1.1 chalk: 4.1.0 - clone-deep: 4.0.1 cmd-shim: 6.0.3 color-support: 1.1.3 columnify: 1.6.0 @@ -14336,75 +16115,72 @@ snapshots: conventional-changelog-angular: 7.0.0 conventional-changelog-core: 5.0.1 conventional-recommended-bump: 7.0.1 - cosmiconfig: 9.0.0(typescript@5.9.2) + cosmiconfig: 9.0.0(typescript@5.9.3) dedent: 1.5.3 envinfo: 7.13.0 execa: 5.0.0 - fs-extra: 11.2.0 + fs-extra: 11.3.3 get-port: 5.1.1 get-stream: 6.0.0 git-url-parse: 14.0.0 glob-parent: 6.0.2 - graceful-fs: 4.2.11 has-unicode: 2.0.1 import-local: 3.1.0 ini: 1.3.8 - init-package-json: 6.0.3 - inquirer: 8.2.5 + init-package-json: 8.2.2 + inquirer: 12.9.6(@types/node@25.0.3) is-ci: 3.0.1 is-stream: 2.0.0 - jest-diff: 29.6.0 - js-yaml: 4.1.0 - libnpmaccess: 8.0.6 - libnpmpublish: 9.0.9 + jest-diff: 30.2.0 + js-yaml: 4.1.1 + libnpmaccess: 10.0.3 + libnpmpublish: 11.1.2 load-json-file: 6.2.0 - lodash: 4.17.21 make-dir: 4.0.0 + make-fetch-happen: 15.0.2 minimatch: 3.0.5 multimatch: 5.0.0 - node-fetch: 2.6.7(encoding@0.1.13) - npm-package-arg: 11.0.2 - npm-packlist: 8.0.2 - npm-registry-fetch: 17.1.0 - nx: 19.8.14(@swc/core@1.9.2) + npm-package-arg: 13.0.1 + npm-packlist: 10.0.3 + npm-registry-fetch: 19.1.0 + nx: 22.3.3(@swc/core@1.9.2) p-map: 4.0.0 p-map-series: 2.1.0 p-pipe: 3.1.0 p-queue: 6.6.2 p-reduce: 2.1.0 p-waterfall: 2.1.1 - pacote: 18.0.6 + pacote: 21.0.1 pify: 5.0.0 read-cmd-shim: 4.0.0 resolve-from: 5.0.0 rimraf: 4.4.1 - semver: 7.6.3 + semver: 7.7.2 set-blocking: 2.0.0 signal-exit: 3.0.7 slash: 3.0.0 - ssri: 10.0.6 + ssri: 12.0.0 string-width: 4.2.3 tar: 6.2.1 temp-dir: 1.0.0 through: 2.3.8 tinyglobby: 0.2.12 - typescript: 5.9.2 + typescript: 5.9.3 upath: 2.0.1 - uuid: 10.0.0 + uuid: 11.1.0 validate-npm-package-license: 3.0.4 - validate-npm-package-name: 5.0.1 + validate-npm-package-name: 6.0.2 wide-align: 1.1.5 write-file-atomic: 5.0.1 write-pkg: 4.0.0 yargs: 17.7.2 yargs-parser: 21.1.1 transitivePeerDependencies: - - '@swc-node/register' - - '@swc/core' + - "@swc-node/register" + - "@swc/core" + - "@types/node" - babel-plugin-macros - - bluebird - debug - - encoding - supports-color levn@0.4.1: @@ -14412,56 +16188,89 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 - libnpmaccess@8.0.6: + libnpmaccess@10.0.3: dependencies: - npm-package-arg: 11.0.2 - npm-registry-fetch: 17.1.0 + npm-package-arg: 13.0.1 + npm-registry-fetch: 19.1.0 transitivePeerDependencies: - supports-color - libnpmpublish@9.0.9: + libnpmpublish@11.1.2: dependencies: + "@npmcli/package-json": 7.0.2 ci-info: 4.0.0 - normalize-package-data: 6.0.2 - npm-package-arg: 11.0.2 - npm-registry-fetch: 17.1.0 - proc-log: 4.2.0 - semver: 7.6.3 - sigstore: 2.3.1 - ssri: 10.0.6 + npm-package-arg: 13.0.1 + npm-registry-fetch: 19.1.0 + proc-log: 5.0.0 + semver: 7.7.2 + sigstore: 4.1.0 + ssri: 12.0.0 transitivePeerDependencies: - supports-color + lightningcss-android-arm64@1.30.2: + optional: true + lightningcss-darwin-arm64@1.28.1: optional: true + lightningcss-darwin-arm64@1.30.2: + optional: true + lightningcss-darwin-x64@1.28.1: optional: true + lightningcss-darwin-x64@1.30.2: + optional: true + lightningcss-freebsd-x64@1.28.1: optional: true + lightningcss-freebsd-x64@1.30.2: + optional: true + lightningcss-linux-arm-gnueabihf@1.28.1: optional: true + lightningcss-linux-arm-gnueabihf@1.30.2: + optional: true + lightningcss-linux-arm64-gnu@1.28.1: optional: true + lightningcss-linux-arm64-gnu@1.30.2: + optional: true + lightningcss-linux-arm64-musl@1.28.1: optional: true + lightningcss-linux-arm64-musl@1.30.2: + optional: true + lightningcss-linux-x64-gnu@1.28.1: optional: true + lightningcss-linux-x64-gnu@1.30.2: + optional: true + lightningcss-linux-x64-musl@1.28.1: optional: true + lightningcss-linux-x64-musl@1.30.2: + optional: true + lightningcss-win32-arm64-msvc@1.28.1: optional: true + lightningcss-win32-arm64-msvc@1.30.2: + optional: true + lightningcss-win32-x64-msvc@1.28.1: optional: true + lightningcss-win32-x64-msvc@1.30.2: + optional: true + lightningcss@1.28.1: dependencies: detect-libc: 1.0.3 @@ -14477,6 +16286,22 @@ snapshots: lightningcss-win32-arm64-msvc: 1.28.1 lightningcss-win32-x64-msvc: 1.28.1 + lightningcss@1.30.2: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.30.2 + lightningcss-darwin-arm64: 1.30.2 + lightningcss-darwin-x64: 1.30.2 + lightningcss-freebsd-x64: 1.30.2 + lightningcss-linux-arm-gnueabihf: 1.30.2 + lightningcss-linux-arm64-gnu: 1.30.2 + lightningcss-linux-arm64-musl: 1.30.2 + lightningcss-linux-x64-gnu: 1.30.2 + lightningcss-linux-x64-musl: 1.30.2 + lightningcss-win32-arm64-msvc: 1.30.2 + lightningcss-win32-x64-msvc: 1.30.2 + lines-and-columns@1.2.4: {} lines-and-columns@2.0.3: {} @@ -14485,14 +16310,14 @@ snapshots: dependencies: uc.micro: 2.1.0 - livereload-js@3.4.1: {} + livereload-js@4.0.2: {} - livereload@0.9.3: + livereload@0.10.3: dependencies: - chokidar: 3.5.3 - livereload-js: 3.4.1 + chokidar: 4.0.3 + livereload-js: 4.0.2 opts: 2.0.2 - ws: 7.5.9 + ws: 8.18.3 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -14511,7 +16336,7 @@ snapshots: strip-bom: 4.0.0 type-fest: 0.6.0 - loader-runner@4.3.0: {} + loader-runner@4.3.1: {} locate-path@2.0.0: dependencies: @@ -14530,6 +16355,10 @@ snapshots: dependencies: p-locate: 6.0.0 + locate-path@8.0.0: + dependencies: + p-locate: 6.0.0 + lodash.camelcase@4.3.0: {} lodash.debounce@4.0.8: {} @@ -14559,24 +16388,20 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - logform@2.5.1: + logform@2.7.0: dependencies: - '@colors/colors': 1.5.0 - '@types/triple-beam': 1.3.2 + "@colors/colors": 1.6.0 + "@types/triple-beam": 1.3.2 fecha: 4.2.3 ms: 2.1.3 - safe-stable-stringify: 2.4.3 + safe-stable-stringify: 2.5.0 triple-beam: 1.4.0 - lookpath@1.2.2: {} - - loupe@3.1.3: {} - - loupe@3.2.0: {} + lookpath@1.2.3: {} lower-case@2.0.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 lowercase-keys@2.0.0: {} @@ -14586,6 +16411,8 @@ snapshots: lru-cache@11.0.0: {} + lru-cache@11.2.4: {} + lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -14596,38 +16423,9 @@ snapshots: lunr@2.3.9: {} - luxon@3.5.0: {} - - madge@6.1.0(typescript@5.9.2): - dependencies: - chalk: 4.1.2 - commander: 7.2.0 - commondir: 1.0.1 - debug: 4.4.0 - dependency-tree: 9.0.0 - detective-amd: 4.2.0 - detective-cjs: 4.1.0 - detective-es6: 3.0.1 - detective-less: 1.0.2 - detective-postcss: 6.1.3 - detective-sass: 4.1.3 - detective-scss: 3.1.1 - detective-stylus: 2.0.1 - detective-typescript: 9.1.1 - ora: 5.4.1 - pluralize: 8.0.0 - precinct: 8.3.1 - pretty-ms: 7.0.1 - rc: 1.2.8 - stream-to-array: 2.3.0 - ts-graphviz: 1.8.1 - walkdir: 0.4.1 - optionalDependencies: - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color + luxon@3.7.2: {} - madge@8.0.0(typescript@5.9.2): + madge@8.0.0(typescript@5.9.3): dependencies: chalk: 4.1.2 commander: 7.2.0 @@ -14642,18 +16440,22 @@ snapshots: ts-graphviz: 2.1.2 walkdir: 0.4.1 optionalDependencies: - typescript: 5.9.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color magic-string@0.30.17: dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 + "@jridgewell/sourcemap-codec": 1.5.0 + + magic-string@0.30.21: + dependencies: + "@jridgewell/sourcemap-codec": 1.5.5 - magicast@0.3.5: + magicast@0.5.1: dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + "@babel/parser": 7.28.5 + "@babel/types": 7.28.5 source-map-js: 1.2.1 make-dir@2.1.0: @@ -14667,24 +16469,55 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.6.3 + semver: 7.7.2 make-error@1.3.6: {} - make-fetch-happen@13.0.1: + make-fetch-happen@14.0.3: + dependencies: + "@npmcli/agent": 3.0.0 + cacache: 19.0.1 + http-cache-semantics: 4.1.1 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + + make-fetch-happen@15.0.2: + dependencies: + "@npmcli/agent": 4.0.0 + cacache: 20.0.3 + http-cache-semantics: 4.1.1 + minipass: 7.1.2 + minipass-fetch: 4.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 1.0.0 + proc-log: 5.0.0 + promise-retry: 2.0.1 + ssri: 12.0.0 + transitivePeerDependencies: + - supports-color + + make-fetch-happen@15.0.3: dependencies: - '@npmcli/agent': 2.2.0 - cacache: 18.0.3 + "@npmcli/agent": 4.0.0 + cacache: 20.0.3 http-cache-semantics: 4.1.1 - is-lambda: 1.0.1 minipass: 7.1.2 - minipass-fetch: 3.0.3 + minipass-fetch: 5.0.0 minipass-flush: 1.0.5 minipass-pipeline: 1.2.4 - negotiator: 0.6.4 - proc-log: 4.2.0 + negotiator: 1.0.0 + proc-log: 6.1.0 promise-retry: 2.0.1 - ssri: 10.0.6 + ssri: 13.0.0 transitivePeerDependencies: - supports-color @@ -14706,15 +16539,19 @@ snapshots: escape-string-regexp: 4.0.0 optional: true + math-intrinsics@1.1.0: {} + + mdn-data@2.12.2: {} + mdurl@2.0.0: {} - media-typer@0.3.0: {} + media-typer@1.1.0: {} meow@12.1.1: {} meow@8.1.2: dependencies: - '@types/minimist': 1.2.2 + "@types/minimist": 1.2.2 camelcase-keys: 6.2.2 decamelize-keys: 1.1.1 hard-rejection: 2.1.0 @@ -14726,14 +16563,12 @@ snapshots: type-fest: 0.18.1 yargs-parser: 20.2.9 - merge-descriptors@1.0.3: {} + merge-descriptors@2.0.0: {} merge-stream@2.0.0: {} merge2@1.4.1: {} - methods@1.1.2: {} - micromatch@4.0.5: dependencies: braces: 3.0.2 @@ -14741,11 +16576,15 @@ snapshots: mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: dependencies: mime-db: 1.52.0 - mime@1.6.0: {} + mime-types@3.0.2: + dependencies: + mime-db: 1.54.0 mimic-fn@2.1.0: {} @@ -14755,31 +16594,35 @@ snapshots: min-indent@1.0.1: {} - minify@13.0.0: + minify@15.0.0: dependencies: - '@putout/minify': 4.7.2 - '@swc/core': 1.9.2 - clean-css: 5.3.2 + "@putout/minify": 6.0.0 + "@swc/core": 1.9.2 + clean-css: 5.3.3 css-b64-images: 0.2.5 - debug: 4.3.7 - esbuild: 0.24.2 - find-up: 7.0.0 - html-minifier-terser: 7.2.0 + debug: 4.4.3(supports-color@5.5.0) + esbuild: 0.27.2 + find-up: 8.0.0 + html-minifier-next: 4.16.4(@swc/core@1.9.2) lightningcss: 1.28.1 montag: 1.2.1 readjson: 2.2.2 simport: 1.2.0 - terser: 5.36.0 - try-catch: 3.0.1 - try-to-catch: 3.0.1 + terser: 5.44.1 + try-catch: 4.0.7 + try-to-catch: 4.0.3 transitivePeerDependencies: - - '@swc/helpers' + - "@swc/helpers" - supports-color minimatch@10.0.1: dependencies: brace-expansion: 2.0.1 + minimatch@10.1.1: + dependencies: + "@isaacs/brace-expansion": 5.0.0 + minimatch@3.0.5: dependencies: brace-expansion: 1.1.11 @@ -14816,11 +16659,19 @@ snapshots: dependencies: minipass: 7.1.2 - minipass-fetch@3.0.3: + minipass-fetch@4.0.1: dependencies: - minipass: 5.0.0 + minipass: 7.1.2 minipass-sized: 1.0.3 - minizlib: 2.1.2 + minizlib: 3.1.0 + optionalDependencies: + encoding: 0.1.13 + + minipass-fetch@5.0.0: + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 3.1.0 optionalDependencies: encoding: 0.1.13 @@ -14844,8 +16695,6 @@ snapshots: minipass@5.0.0: {} - minipass@7.0.4: {} - minipass@7.1.2: {} minizlib@2.1.2: @@ -14853,39 +16702,21 @@ snapshots: minipass: 3.3.6 yallist: 4.0.0 + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + mkdirp-classic@0.5.3: {} mkdirp@1.0.4: {} - mobius1-selectr@2.4.13: {} - modify-values@1.0.1: {} - module-definition@3.4.0: - dependencies: - ast-module-types: 3.0.0 - node-source-walk: 4.3.0 - - module-definition@4.1.0: - dependencies: - ast-module-types: 4.0.0 - node-source-walk: 5.0.2 - module-definition@6.0.0: dependencies: ast-module-types: 6.0.0 node-source-walk: 7.0.0 - module-lookup-amd@7.0.1: - dependencies: - commander: 2.20.3 - debug: 4.4.0 - glob: 7.2.3 - requirejs: 2.3.6 - requirejs-config-file: 4.0.0 - transitivePeerDependencies: - - supports-color - module-lookup-amd@9.0.2: dependencies: commander: 12.1.0 @@ -14899,23 +16730,19 @@ snapshots: mrmime@2.0.0: {} - ms@2.0.0: {} - ms@2.1.2: {} ms@2.1.3: {} multimatch@5.0.0: dependencies: - '@types/minimatch': 3.0.5 + "@types/minimatch": 3.0.5 array-differ: 3.0.0 array-union: 2.1.0 arrify: 2.0.1 minimatch: 3.1.2 - mute-stream@0.0.8: {} - - mute-stream@1.0.0: {} + mute-stream@2.0.0: {} nanoid@3.3.11: {} @@ -14923,74 +16750,58 @@ snapshots: natural-compare@1.4.0: {} - negotiator@0.6.3: {} - - negotiator@0.6.4: {} + negotiator@1.0.0: {} neo-async@2.6.2: {} no-case@3.0.4: dependencies: lower-case: 2.0.2 - tslib: 2.6.2 + tslib: 2.8.1 node-abi@3.74.0: dependencies: - semver: 7.6.3 + semver: 7.7.3 node-addon-api@7.1.1: {} - node-fetch@2.6.12(encoding@0.1.13): - dependencies: - whatwg-url: 5.0.0 - optionalDependencies: - encoding: 0.1.13 - - node-fetch@2.6.7(encoding@0.1.13): + node-fetch@2.7.0(encoding@0.1.13): dependencies: whatwg-url: 5.0.0 optionalDependencies: encoding: 0.1.13 - node-gyp@10.0.1: + node-gyp@11.5.0: dependencies: env-paths: 2.2.1 exponential-backoff: 3.1.1 - glob: 10.4.5 graceful-fs: 4.2.11 - make-fetch-happen: 13.0.1 - nopt: 7.2.1 - proc-log: 3.0.0 - semver: 7.6.3 - tar: 6.2.1 - which: 4.0.0 + make-fetch-happen: 14.0.3 + nopt: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + tar: 7.5.2 + tinyglobby: 0.2.15 + which: 5.0.0 transitivePeerDependencies: - supports-color node-machine-id@1.1.12: {} - node-releases@2.0.19: {} - - node-source-walk@4.3.0: - dependencies: - '@babel/parser': 7.27.2 - - node-source-walk@5.0.2: - dependencies: - '@babel/parser': 7.27.2 + node-releases@2.0.27: {} node-source-walk@7.0.0: dependencies: - '@babel/parser': 7.27.2 + "@babel/parser": 7.28.3 - nodemon@3.0.1: + nodemon@3.1.11: dependencies: chokidar: 3.5.3 - debug: 3.2.7(supports-color@5.5.0) + debug: 4.4.3(supports-color@5.5.0) ignore-by-default: 1.0.1 minimatch: 3.1.2 pstree.remy: 1.1.8 - semver: 7.5.4 + semver: 7.7.3 simple-update-notifier: 2.0.0 supports-color: 5.5.0 touch: 3.1.0 @@ -15005,72 +16816,91 @@ snapshots: dependencies: abbrev: 1.1.1 - nopt@7.2.1: + nopt@8.1.0: dependencies: - abbrev: 2.0.0 + abbrev: 3.0.1 normalize-package-data@2.5.0: dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.8 + resolve: 1.22.10 semver: 5.7.2 validate-npm-package-license: 3.0.4 normalize-package-data@3.0.3: dependencies: hosted-git-info: 4.1.0 - is-core-module: 2.15.1 - semver: 7.6.3 - validate-npm-package-license: 3.0.4 - - normalize-package-data@6.0.2: - dependencies: - hosted-git-info: 7.0.2 - semver: 7.6.3 + is-core-module: 2.16.1 + semver: 7.7.3 validate-npm-package-license: 3.0.4 normalize-path@3.0.0: {} normalize-url@6.1.0: {} - npm-bundled@3.0.0: + npm-bundled@4.0.0: dependencies: - npm-normalize-package-bin: 3.0.1 + npm-normalize-package-bin: 4.0.0 - npm-install-checks@6.3.0: + npm-bundled@5.0.0: dependencies: - semver: 7.6.3 + npm-normalize-package-bin: 5.0.0 - npm-normalize-package-bin@3.0.1: {} + npm-install-checks@7.1.2: + dependencies: + semver: 7.7.3 + + npm-install-checks@8.0.0: + dependencies: + semver: 7.7.3 + + npm-normalize-package-bin@4.0.0: {} + + npm-normalize-package-bin@5.0.0: {} + + npm-package-arg@12.0.2: + dependencies: + hosted-git-info: 8.1.0 + proc-log: 5.0.0 + semver: 7.7.3 + validate-npm-package-name: 6.0.2 + + npm-package-arg@13.0.1: + dependencies: + hosted-git-info: 9.0.2 + proc-log: 5.0.0 + semver: 7.7.2 + validate-npm-package-name: 6.0.2 - npm-package-arg@11.0.2: + npm-packlist@10.0.3: dependencies: - hosted-git-info: 7.0.2 - proc-log: 4.2.0 - semver: 7.6.3 - validate-npm-package-name: 5.0.1 + ignore-walk: 8.0.0 + proc-log: 6.1.0 - npm-packlist@8.0.2: + npm-pick-manifest@10.0.0: dependencies: - ignore-walk: 6.0.4 + npm-install-checks: 7.1.2 + npm-normalize-package-bin: 4.0.0 + npm-package-arg: 12.0.2 + semver: 7.7.3 - npm-pick-manifest@9.0.1: + npm-pick-manifest@11.0.3: dependencies: - npm-install-checks: 6.3.0 - npm-normalize-package-bin: 3.0.1 - npm-package-arg: 11.0.2 - semver: 7.6.3 + npm-install-checks: 8.0.0 + npm-normalize-package-bin: 5.0.0 + npm-package-arg: 13.0.1 + semver: 7.7.3 - npm-registry-fetch@17.1.0: + npm-registry-fetch@19.1.0: dependencies: - '@npmcli/redact': 2.0.1 + "@npmcli/redact": 3.2.2 jsonparse: 1.3.1 - make-fetch-happen: 13.0.1 + make-fetch-happen: 15.0.2 minipass: 7.1.2 - minipass-fetch: 3.0.3 - minizlib: 2.1.2 - npm-package-arg: 11.0.2 - proc-log: 4.2.0 + minipass-fetch: 4.0.1 + minizlib: 3.1.0 + npm-package-arg: 13.0.1 + proc-log: 5.0.0 transitivePeerDependencies: - supports-color @@ -15078,15 +16908,13 @@ snapshots: dependencies: path-key: 3.1.1 - nwsapi@2.2.16: {} - nx-cloud@19.1.0: dependencies: - '@nrwl/nx-cloud': 19.1.0 + "@nrwl/nx-cloud": 19.1.0 axios: 1.7.4 chalk: 4.1.2 dotenv: 10.0.0 - fs-extra: 11.2.0 + fs-extra: 11.3.3 ini: 4.1.3 node-machine-id: 1.1.12 open: 8.4.2 @@ -15095,65 +16923,13 @@ snapshots: transitivePeerDependencies: - debug - nx@19.8.14(@swc/core@1.9.2): - dependencies: - '@napi-rs/wasm-runtime': 0.2.4 - '@nrwl/tao': 19.8.14(@swc/core@1.9.2) - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.7 - axios: 1.7.4 - chalk: 4.1.2 - cli-cursor: 3.1.0 - cli-spinners: 2.6.1 - cliui: 8.0.1 - dotenv: 16.4.5 - dotenv-expand: 11.0.6 - enquirer: 2.3.6 - figures: 3.2.0 - flat: 5.0.2 - front-matter: 4.0.2 - ignore: 5.3.1 - jest-diff: 29.6.0 - jsonc-parser: 3.2.0 - lines-and-columns: 2.0.3 - minimatch: 9.0.3 - node-machine-id: 1.1.12 - npm-run-path: 4.0.1 - open: 8.4.2 - ora: 5.3.0 - semver: 7.6.3 - string-width: 4.2.3 - strong-log-transformer: 2.1.0 - tar-stream: 2.2.0 - tmp: 0.2.1 - tsconfig-paths: 4.2.0 - tslib: 2.6.2 - yargs: 17.7.2 - yargs-parser: 21.1.1 - optionalDependencies: - '@nx/nx-darwin-arm64': 19.8.14 - '@nx/nx-darwin-x64': 19.8.14 - '@nx/nx-freebsd-x64': 19.8.14 - '@nx/nx-linux-arm-gnueabihf': 19.8.14 - '@nx/nx-linux-arm64-gnu': 19.8.14 - '@nx/nx-linux-arm64-musl': 19.8.14 - '@nx/nx-linux-x64-gnu': 19.8.14 - '@nx/nx-linux-x64-musl': 19.8.14 - '@nx/nx-win32-arm64-msvc': 19.8.14 - '@nx/nx-win32-x64-msvc': 19.8.14 - '@swc/core': 1.9.2 - transitivePeerDependencies: - - debug - - nx@19.8.4(@swc/core@1.9.2): + nx@22.3.3(@swc/core@1.9.2): dependencies: - '@napi-rs/wasm-runtime': 0.2.4 - '@nrwl/tao': 19.8.4(@swc/core@1.9.2) - '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.0-rc.46 - '@zkochan/js-yaml': 0.0.7 - axios: 1.7.4 + "@napi-rs/wasm-runtime": 0.2.4 + "@yarnpkg/lockfile": 1.1.0 + "@yarnpkg/parsers": 3.0.2 + "@zkochan/js-yaml": 0.0.7 + axios: 1.13.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -15164,8 +16940,8 @@ snapshots: figures: 3.2.0 flat: 5.0.2 front-matter: 4.0.2 - ignore: 5.3.1 - jest-diff: 29.6.0 + ignore: 7.0.5 + jest-diff: 30.2.0 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 minimatch: 9.0.3 @@ -15173,61 +16949,70 @@ snapshots: npm-run-path: 4.0.1 open: 8.4.2 ora: 5.3.0 - semver: 7.6.3 + resolve.exports: 2.0.3 + semver: 7.7.2 string-width: 4.2.3 - strong-log-transformer: 2.1.0 tar-stream: 2.2.0 tmp: 0.2.1 + tree-kill: 1.2.2 tsconfig-paths: 4.2.0 - tslib: 2.6.2 + tslib: 2.8.1 + yaml: 2.8.1 yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 19.8.4 - '@nx/nx-darwin-x64': 19.8.4 - '@nx/nx-freebsd-x64': 19.8.4 - '@nx/nx-linux-arm-gnueabihf': 19.8.4 - '@nx/nx-linux-arm64-gnu': 19.8.4 - '@nx/nx-linux-arm64-musl': 19.8.4 - '@nx/nx-linux-x64-gnu': 19.8.4 - '@nx/nx-linux-x64-musl': 19.8.4 - '@nx/nx-win32-arm64-msvc': 19.8.4 - '@nx/nx-win32-x64-msvc': 19.8.4 - '@swc/core': 1.9.2 + "@nx/nx-darwin-arm64": 22.3.3 + "@nx/nx-darwin-x64": 22.3.3 + "@nx/nx-freebsd-x64": 22.3.3 + "@nx/nx-linux-arm-gnueabihf": 22.3.3 + "@nx/nx-linux-arm64-gnu": 22.3.3 + "@nx/nx-linux-arm64-musl": 22.3.3 + "@nx/nx-linux-x64-gnu": 22.3.3 + "@nx/nx-linux-x64-musl": 22.3.3 + "@nx/nx-win32-arm64-msvc": 22.3.3 + "@nx/nx-win32-x64-msvc": 22.3.3 + "@swc/core": 1.9.2 transitivePeerDependencies: - debug object-assign@4.1.1: {} - object-inspect@1.13.3: {} + object-deep-merge@2.0.0: {} + + object-inspect@1.13.4: {} object-keys@1.1.1: {} - object.assign@4.1.4: + object.assign@4.1.7: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + has-symbols: 1.1.0 object-keys: 1.1.1 - object.fromentries@2.0.7: + object.fromentries@2.0.8: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 - object.groupby@1.0.1: + object.groupby@1.0.3: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 - get-intrinsic: 1.2.4 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 - object.values@1.1.7: + object.values@1.2.1: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + + obug@2.1.1: {} on-finished@2.4.1: dependencies: @@ -15255,7 +17040,7 @@ snapshots: optionator@0.9.3: dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 + "@aashutoshrathi/word-wrap": 1.2.6 deep-is: 0.1.4 fast-levenshtein: 2.0.6 levn: 0.4.1 @@ -15287,7 +17072,11 @@ snapshots: strip-ansi: 6.0.1 wcwidth: 1.0.1 - os-tmpdir@1.0.2: {} + own-keys@1.0.1: + dependencies: + get-intrinsic: 1.3.0 + object-keys: 1.1.1 + safe-push-apply: 1.0.0 p-cancelable@2.1.1: {} @@ -15331,6 +17120,8 @@ snapshots: dependencies: aggregate-error: 3.1.0 + p-map@7.0.4: {} + p-pipe@3.1.0: {} p-queue@6.6.2: @@ -15354,41 +17145,64 @@ snapshots: package-json-from-dist@1.0.0: {} - pacote@18.0.6: + package-json-from-dist@1.0.1: {} + + pacote@21.0.1: dependencies: - '@npmcli/git': 5.0.3 - '@npmcli/installed-package-contents': 2.1.0 - '@npmcli/package-json': 5.2.0 - '@npmcli/promise-spawn': 7.0.0 - '@npmcli/run-script': 8.1.0 - cacache: 18.0.3 + "@npmcli/git": 6.0.3 + "@npmcli/installed-package-contents": 3.0.0 + "@npmcli/package-json": 7.0.2 + "@npmcli/promise-spawn": 8.0.3 + "@npmcli/run-script": 10.0.2 + cacache: 20.0.3 fs-minipass: 3.0.2 minipass: 7.1.2 - npm-package-arg: 11.0.2 - npm-packlist: 8.0.2 - npm-pick-manifest: 9.0.1 - npm-registry-fetch: 17.1.0 - proc-log: 4.2.0 + npm-package-arg: 13.0.1 + npm-packlist: 10.0.3 + npm-pick-manifest: 10.0.0 + npm-registry-fetch: 19.1.0 + proc-log: 5.0.0 promise-retry: 2.0.1 - sigstore: 2.3.1 - ssri: 10.0.6 - tar: 6.2.1 + sigstore: 4.1.0 + ssri: 12.0.0 + tar: 7.5.2 + transitivePeerDependencies: + - supports-color + + pacote@21.0.4: + dependencies: + "@npmcli/git": 7.0.1 + "@npmcli/installed-package-contents": 4.0.0 + "@npmcli/package-json": 7.0.2 + "@npmcli/promise-spawn": 9.0.1 + "@npmcli/run-script": 10.0.2 + cacache: 20.0.3 + fs-minipass: 3.0.2 + minipass: 7.1.2 + npm-package-arg: 13.0.1 + npm-packlist: 10.0.3 + npm-pick-manifest: 11.0.3 + npm-registry-fetch: 19.1.0 + proc-log: 6.1.0 + promise-retry: 2.0.1 + sigstore: 4.1.0 + ssri: 13.0.0 + tar: 7.5.2 transitivePeerDependencies: - - bluebird - supports-color param-case@3.0.4: dependencies: dot-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 parent-module@1.0.1: dependencies: callsites: 3.1.0 - parse-conflict-json@3.0.1: + parse-conflict-json@4.0.0: dependencies: - json-parse-even-better-errors: 3.0.2 + json-parse-even-better-errors: 4.0.0 just-diff: 6.0.2 just-diff-apply: 5.5.0 @@ -15396,11 +17210,6 @@ snapshots: dependencies: parse-statements: 1.0.11 - parse-imports@2.1.0: - dependencies: - es-module-lexer: 1.7.0 - slashes: 3.0.12 - parse-json@4.0.0: dependencies: error-ex: 1.3.2 @@ -15408,7 +17217,7 @@ snapshots: parse-json@5.2.0: dependencies: - '@babel/code-frame': 7.27.1 + "@babel/code-frame": 7.27.1 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -15425,20 +17234,25 @@ snapshots: dependencies: parse-path: 7.0.0 - parse5@7.1.2: + parse5@7.2.1: dependencies: entities: 4.5.0 - parse5@7.2.1: + parse5@8.0.0: dependencies: - entities: 4.5.0 + entities: 6.0.1 parseurl@1.3.3: {} pascal-case@3.1.2: dependencies: no-case: 3.0.4 - tslib: 2.6.2 + tslib: 2.8.1 + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 path-equal@1.2.5: {} @@ -15454,11 +17268,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.10.1: - dependencies: - lru-cache: 10.2.2 - minipass: 7.0.4 - path-scurry@1.11.1: dependencies: lru-cache: 10.2.2 @@ -15469,7 +17278,12 @@ snapshots: lru-cache: 11.0.0 minipass: 7.1.2 - path-to-regexp@0.1.10: {} + path-scurry@2.0.1: + dependencies: + lru-cache: 11.2.4 + minipass: 7.1.2 + + path-to-regexp@8.3.0: {} path-type@3.0.0: dependencies: @@ -15479,12 +17293,8 @@ snapshots: pathe@2.0.3: {} - pathval@2.0.0: {} - pend@1.2.0: {} - picocolors@1.0.0: {} - picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -15507,23 +17317,15 @@ snapshots: dependencies: find-up: 4.1.0 - pkg-dir@7.0.0: - dependencies: - find-up: 6.3.0 - pluralize@8.0.0: {} - postcss-selector-parser@6.1.0: + possible-typed-array-names@1.1.0: {} + + postcss-selector-parser@7.1.1: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss-values-parser@2.0.1: - dependencies: - flatten: 1.0.3 - indexes-of: 1.0.1 - uniq: 1.0.1 - postcss-values-parser@6.0.2(postcss@8.5.6): dependencies: color-name: 1.1.4 @@ -15554,7 +17356,7 @@ snapshots: precinct@12.1.2: dependencies: - '@dependents/detective-less': 5.0.0 + "@dependents/detective-less": 5.0.0 commander: 12.1.0 detective-amd: 6.0.0 detective-cjs: 6.0.0 @@ -15563,47 +17365,12 @@ snapshots: detective-sass: 6.0.0 detective-scss: 5.0.0 detective-stylus: 5.0.0 - detective-typescript: 13.0.0(typescript@5.9.2) - detective-vue2: 2.0.3(typescript@5.9.2) + detective-typescript: 13.0.0(typescript@5.9.3) + detective-vue2: 2.0.3(typescript@5.9.3) module-definition: 6.0.0 node-source-walk: 7.0.0 postcss: 8.5.6 - typescript: 5.9.2 - transitivePeerDependencies: - - supports-color - - precinct@8.3.1: - dependencies: - commander: 2.20.3 - debug: 4.4.0 - detective-amd: 3.1.2 - detective-cjs: 3.1.3 - detective-es6: 2.2.2 - detective-less: 1.0.2 - detective-postcss: 4.0.0 - detective-sass: 3.0.2 - detective-scss: 2.0.2 - detective-stylus: 1.0.3 - detective-typescript: 7.0.2 - module-definition: 3.4.0 - node-source-walk: 4.3.0 - transitivePeerDependencies: - - supports-color - - precinct@9.2.1: - dependencies: - '@dependents/detective-less': 3.0.2 - commander: 9.5.0 - detective-amd: 4.2.0 - detective-cjs: 4.1.0 - detective-es6: 3.0.1 - detective-postcss: 6.1.3 - detective-sass: 4.1.3 - detective-scss: 3.1.1 - detective-stylus: 3.0.0 - detective-typescript: 9.1.1 - module-definition: 4.1.0 - node-source-walk: 5.0.2 + typescript: 5.9.3 transitivePeerDependencies: - supports-color @@ -15613,37 +17380,31 @@ snapshots: dependencies: fast-diff: 1.3.0 - prettier-plugin-multiline-arrays@3.0.6(prettier@3.6.2): - dependencies: - '@augment-vir/common': 28.2.4 - prettier: 3.6.2 - proxy-vir: 1.0.0 - - prettier-plugin-multiline-arrays@4.0.3(prettier@3.6.2): + prettier-plugin-multiline-arrays@4.1.3(prettier@3.7.4): dependencies: - '@augment-vir/common': 31.17.1 - prettier: 3.6.2 + "@augment-vir/common": 31.54.4 + prettier: 3.7.4 proxy-vir: 2.0.1 - prettier@3.6.2: {} + prettier@3.7.4: {} - pretty-format@29.7.0: + pretty-format@30.2.0: dependencies: - '@jest/schemas': 29.6.3 + "@jest/schemas": 30.0.5 ansi-styles: 5.2.0 - react-is: 18.2.0 + react-is: 18.3.1 pretty-ms@7.0.1: dependencies: parse-ms: 2.1.0 - proc-log@3.0.0: {} + proc-log@5.0.0: {} - proc-log@4.2.0: {} + proc-log@6.1.0: {} process-nextick-args@2.0.1: {} - proggy@2.0.0: {} + proggy@3.0.0: {} progress@2.0.3: {} @@ -15651,8 +17412,6 @@ snapshots: promise-call-limit@3.0.1: {} - promise-inflight@1.0.1: {} - promise-retry@2.0.1: dependencies: err-code: 2.0.3 @@ -15667,9 +17426,9 @@ snapshots: kleur: 3.0.3 sisteransi: 1.0.5 - promzard@1.0.0: + promzard@2.0.0: dependencies: - read: 2.1.0 + read: 4.1.0 protocols@2.0.1: {} @@ -15680,14 +17439,10 @@ snapshots: proxy-from-env@1.1.0: {} - proxy-vir@1.0.0: - dependencies: - '@augment-vir/common': 23.4.0 - proxy-vir@2.0.1: dependencies: - '@augment-vir/assert': 31.2.0 - '@augment-vir/common': 31.17.1 + "@augment-vir/assert": 31.54.4 + "@augment-vir/common": 31.54.4 pstree.remy@1.1.8: {} @@ -15760,20 +17515,21 @@ snapshots: pump@3.0.0: dependencies: - end-of-stream: 1.4.4 + end-of-stream: 1.4.5 + once: 1.4.0 + + pump@3.0.3: + dependencies: + end-of-stream: 1.4.5 once: 1.4.0 punycode.js@2.3.1: {} punycode@2.3.1: {} - qs@6.11.0: - dependencies: - side-channel: 1.0.6 - - qs@6.13.0: + qs@6.14.0: dependencies: - side-channel: 1.0.6 + side-channel: 1.1.0 queue-microtask@1.2.3: {} @@ -15789,11 +17545,11 @@ snapshots: range-parser@1.2.1: {} - raw-body@2.5.2: + raw-body@3.0.2: dependencies: bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 + http-errors: 2.0.1 + iconv-lite: 0.7.1 unpipe: 1.0.0 rc@1.2.8: @@ -15803,14 +17559,11 @@ snapshots: minimist: 1.2.8 strip-json-comments: 2.0.1 - react-is@18.2.0: {} + react-is@18.3.1: {} read-cmd-shim@4.0.0: {} - read-package-json-fast@3.0.2: - dependencies: - json-parse-even-better-errors: 3.0.2 - npm-normalize-package-bin: 3.0.1 + read-cmd-shim@5.0.0: {} read-pkg-up@3.0.0: dependencies: @@ -15831,18 +17584,14 @@ snapshots: read-pkg@5.2.0: dependencies: - '@types/normalize-package-data': 2.4.1 + "@types/normalize-package-data": 2.4.1 normalize-package-data: 2.5.0 parse-json: 5.2.0 type-fest: 0.6.0 - read@2.1.0: - dependencies: - mute-stream: 1.0.0 - - read@3.0.1: + read@4.1.0: dependencies: - mute-stream: 1.0.0 + mute-stream: 2.0.0 readable-stream@1.0.34: dependencies: @@ -15871,6 +17620,8 @@ snapshots: dependencies: picomatch: 2.3.1 + readdirp@4.1.2: {} + readjson@2.2.2: dependencies: jju: 1.4.0 @@ -15885,36 +17636,46 @@ snapshots: indent-string: 4.0.0 strip-indent: 3.0.0 - regenerate-unicode-properties@10.1.0: + reflect.getprototypeof@1.0.10: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + which-builtin-type: 1.2.1 + + regenerate-unicode-properties@10.2.0: dependencies: regenerate: 1.4.2 regenerate@1.4.2: {} - regenerator-runtime@0.13.11: {} - - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.21.5 - - regexp.prototype.flags@1.5.1: + regexp.prototype.flags@1.5.4: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - set-function-name: 2.0.1 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-errors: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + set-function-name: 2.0.2 - regexpu-core@5.3.2: + regexpu-core@6.2.0: dependencies: - '@babel/regjsgen': 0.8.0 regenerate: 1.4.2 - regenerate-unicode-properties: 10.1.0 - regjsparser: 0.9.1 + regenerate-unicode-properties: 10.2.0 + regjsgen: 0.8.0 + regjsparser: 0.12.0 unicode-match-property-ecmascript: 2.0.0 unicode-match-property-value-ecmascript: 2.1.0 - regjsparser@0.9.1: + regjsgen@0.8.0: {} + + regjsparser@0.12.0: dependencies: - jsesc: 0.5.0 + jsesc: 3.0.2 relateurl@0.2.7: {} @@ -15927,28 +17688,29 @@ snapshots: esprima: 4.0.1 stringify-object: 3.3.0 - requirejs@2.3.6: {} - requirejs@2.3.7: {} + reserved-identifiers@1.2.0: {} + resolve-alpn@1.2.1: {} resolve-cwd@3.0.0: dependencies: resolve-from: 5.0.0 - resolve-dependency-path@2.0.0: {} - resolve-dependency-path@4.0.0: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve@1.19.0: + resolve.exports@2.0.3: {} + + resolve@1.22.10: dependencies: - is-core-module: 2.15.1 + is-core-module: 2.16.1 path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 resolve@1.22.8: dependencies: @@ -15977,112 +17739,106 @@ snapshots: dependencies: glob: 9.3.5 - rimraf@5.0.7: - dependencies: - glob: 10.4.5 - - rimraf@6.0.1: + rimraf@6.1.2: dependencies: - glob: 11.0.0 - package-json-from-dist: 1.0.0 + glob: 13.0.0 + package-json-from-dist: 1.0.1 roarr@2.15.4: dependencies: boolean: 3.2.0 detect-node: 2.1.0 - globalthis: 1.0.3 + globalthis: 1.0.4 json-stringify-safe: 5.0.1 semver-compare: 1.0.0 - sprintf-js: 1.1.2 + sprintf-js: 1.1.3 optional: true rollup@4.50.1: dependencies: - '@types/estree': 1.0.8 + "@types/estree": 1.0.8 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.50.1 - '@rollup/rollup-android-arm64': 4.50.1 - '@rollup/rollup-darwin-arm64': 4.50.1 - '@rollup/rollup-darwin-x64': 4.50.1 - '@rollup/rollup-freebsd-arm64': 4.50.1 - '@rollup/rollup-freebsd-x64': 4.50.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.50.1 - '@rollup/rollup-linux-arm-musleabihf': 4.50.1 - '@rollup/rollup-linux-arm64-gnu': 4.50.1 - '@rollup/rollup-linux-arm64-musl': 4.50.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.50.1 - '@rollup/rollup-linux-ppc64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-gnu': 4.50.1 - '@rollup/rollup-linux-riscv64-musl': 4.50.1 - '@rollup/rollup-linux-s390x-gnu': 4.50.1 - '@rollup/rollup-linux-x64-gnu': 4.50.1 - '@rollup/rollup-linux-x64-musl': 4.50.1 - '@rollup/rollup-openharmony-arm64': 4.50.1 - '@rollup/rollup-win32-arm64-msvc': 4.50.1 - '@rollup/rollup-win32-ia32-msvc': 4.50.1 - '@rollup/rollup-win32-x64-msvc': 4.50.1 + "@rollup/rollup-android-arm-eabi": 4.50.1 + "@rollup/rollup-android-arm64": 4.50.1 + "@rollup/rollup-darwin-arm64": 4.50.1 + "@rollup/rollup-darwin-x64": 4.50.1 + "@rollup/rollup-freebsd-arm64": 4.50.1 + "@rollup/rollup-freebsd-x64": 4.50.1 + "@rollup/rollup-linux-arm-gnueabihf": 4.50.1 + "@rollup/rollup-linux-arm-musleabihf": 4.50.1 + "@rollup/rollup-linux-arm64-gnu": 4.50.1 + "@rollup/rollup-linux-arm64-musl": 4.50.1 + "@rollup/rollup-linux-loongarch64-gnu": 4.50.1 + "@rollup/rollup-linux-ppc64-gnu": 4.50.1 + "@rollup/rollup-linux-riscv64-gnu": 4.50.1 + "@rollup/rollup-linux-riscv64-musl": 4.50.1 + "@rollup/rollup-linux-s390x-gnu": 4.50.1 + "@rollup/rollup-linux-x64-gnu": 4.50.1 + "@rollup/rollup-linux-x64-musl": 4.50.1 + "@rollup/rollup-openharmony-arm64": 4.50.1 + "@rollup/rollup-win32-arm64-msvc": 4.50.1 + "@rollup/rollup-win32-ia32-msvc": 4.50.1 + "@rollup/rollup-win32-x64-msvc": 4.50.1 fsevents: 2.3.3 - rrweb-cssom@0.8.0: {} + router@2.2.0: + dependencies: + debug: 4.4.3(supports-color@5.5.0) + depd: 2.0.0 + is-promise: 4.0.0 + parseurl: 1.3.3 + path-to-regexp: 8.3.0 + transitivePeerDependencies: + - supports-color - run-async@2.4.1: {} + run-async@4.0.6: {} run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 - run-time-assertions@1.0.0: - dependencies: - '@augment-vir/common': 23.4.0 - expect-type: 0.15.0 - type-fest: 4.30.2 - - run-time-assertions@1.5.1: - dependencies: - '@augment-vir/common': 28.2.4 - expect-type: 0.15.0 - type-fest: 4.20.1 - - rxjs@7.8.1: + rxjs@7.8.2: dependencies: - tslib: 2.6.2 + tslib: 2.8.1 - safe-array-concat@1.0.1: + safe-array-concat@1.1.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + get-intrinsic: 1.3.0 + has-symbols: 1.1.0 isarray: 2.0.5 safe-buffer@5.1.2: {} safe-buffer@5.2.1: {} - safe-regex-test@1.0.0: + safe-push-apply@1.0.0: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-regex: 1.1.4 + es-errors: 1.3.0 + isarray: 2.0.5 - safe-stable-stringify@2.4.3: {} + safe-regex-test@1.1.0: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + is-regex: 1.2.1 safe-stable-stringify@2.5.0: {} safer-buffer@2.1.2: {} - sass-lookup@3.0.0: - dependencies: - commander: 2.20.3 - sass-lookup@6.0.1: dependencies: commander: 12.1.0 - sass@1.69.5: + sass@1.97.1: dependencies: - chokidar: 3.5.3 - immutable: 4.3.0 - source-map-js: 1.0.2 + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + "@parcel/watcher": 2.5.1 sax@1.4.1: {} @@ -16090,16 +17846,16 @@ snapshots: dependencies: xmlchars: 2.2.0 - schema-utils@4.2.0: + schema-utils@4.3.2: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) - schema-utils@4.3.2: + schema-utils@4.3.3: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 ajv: 8.12.0 ajv-formats: 2.1.1(ajv@8.12.0) ajv-keywords: 5.1.0(ajv@8.12.0) @@ -16111,52 +17867,36 @@ snapshots: semver@6.3.1: {} - semver@7.5.4: - dependencies: - lru-cache: 6.0.0 + semver@7.7.2: {} - semver@7.6.3: {} + semver@7.7.3: {} - send@0.18.0: + send@1.2.1: dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 + debug: 4.4.3(supports-color@5.5.0) + encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 + fresh: 2.0.0 + http-errors: 2.0.1 + mime-types: 3.0.2 ms: 2.1.3 on-finished: 2.4.1 range-parser: 1.2.1 - statuses: 2.0.1 + statuses: 2.0.2 transitivePeerDependencies: - supports-color - send@0.19.0: + sentence-case@3.0.4: dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color + no-case: 3.0.4 + tslib: 2.8.1 + upper-case-first: 2.0.2 - seq-logging@2.1.1(encoding@0.1.13): + seq-logging@3.0.0(encoding@0.1.13): dependencies: abort-controller: 3.0.0 - node-fetch: 2.6.12(encoding@0.1.13) + node-fetch: 2.7.0(encoding@0.1.13) transitivePeerDependencies: - encoding @@ -16169,12 +17909,12 @@ snapshots: dependencies: randombytes: 2.1.0 - serve-static@1.16.0: + serve-static@2.2.1: dependencies: - encodeurl: 1.0.2 + encodeurl: 2.0.0 escape-html: 1.0.3 parseurl: 1.3.3 - send: 0.18.0 + send: 1.2.1 transitivePeerDependencies: - supports-color @@ -16186,15 +17926,22 @@ snapshots: es-errors: 1.3.0 function-bind: 1.1.2 get-intrinsic: 1.2.4 - gopd: 1.0.1 + gopd: 1.2.0 has-property-descriptors: 1.0.2 - set-function-name@2.0.1: + set-function-name@2.0.2: dependencies: define-data-property: 1.1.4 + es-errors: 1.3.0 functions-have-names: 1.2.3 has-property-descriptors: 1.0.2 + set-proto@1.0.0: + dependencies: + dunder-proto: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + setprototypeof@1.2.0: {} shallow-clone@3.0.1: @@ -16207,14 +17954,35 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.1: {} + shell-quote@1.8.3: {} - side-channel@1.0.6: + side-channel-list@1.0.0: dependencies: - call-bind: 1.0.7 es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.3 + object-inspect: 1.13.4 + + side-channel-map@1.0.1: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + + side-channel-weakmap@1.0.2: + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + + side-channel@1.1.0: + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 siginfo@2.0.0: {} @@ -16222,14 +17990,14 @@ snapshots: signal-exit@4.1.0: {} - sigstore@2.3.1: + sigstore@4.1.0: dependencies: - '@sigstore/bundle': 2.3.2 - '@sigstore/core': 1.1.0 - '@sigstore/protobuf-specs': 0.3.2 - '@sigstore/sign': 2.3.2 - '@sigstore/tuf': 2.3.4 - '@sigstore/verify': 1.2.1 + "@sigstore/bundle": 4.0.0 + "@sigstore/core": 3.1.0 + "@sigstore/protobuf-specs": 0.5.0 + "@sigstore/sign": 4.1.0 + "@sigstore/tuf": 4.0.1 + "@sigstore/verify": 3.1.0 transitivePeerDependencies: - supports-color @@ -16241,13 +18009,9 @@ snapshots: once: 1.4.0 simple-concat: 1.0.1 - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - simple-update-notifier@2.0.0: dependencies: - semver: 7.5.4 + semver: 7.7.3 simport@1.2.0: dependencies: @@ -16256,13 +18020,13 @@ snapshots: sirv@2.0.3: dependencies: - '@polka/url': 1.0.0-next.21 + "@polka/url": 1.0.0-next.25 mrmime: 1.0.1 totalist: 3.0.1 - sirv@3.0.1: + sirv@3.0.2: dependencies: - '@polka/url': 1.0.0-next.25 + "@polka/url": 1.0.0-next.25 mrmime: 2.0.0 totalist: 3.0.1 @@ -16270,29 +18034,30 @@ snapshots: slash@3.0.0: {} - slashes@3.0.12: {} - smart-buffer@4.2.0: {} - socks-proxy-agent@8.0.2: + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.8.1 + + socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 - socks: 2.7.1 + debug: 4.4.3(supports-color@5.5.0) + socks: 2.8.7 transitivePeerDependencies: - supports-color - socks@2.7.1: + socks@2.8.7: dependencies: - ip: 2.0.0 + ip-address: 10.1.0 smart-buffer: 4.2.0 sort-keys@2.0.0: dependencies: is-plain-obj: 1.1.0 - source-map-js@1.0.2: {} - source-map-js@1.2.1: {} source-map-support@0.5.21: @@ -16335,10 +18100,14 @@ snapshots: sprintf-js@1.0.3: {} - sprintf-js@1.1.2: + sprintf-js@1.1.3: optional: true - ssri@10.0.6: + ssri@12.0.0: + dependencies: + minipass: 7.1.2 + + ssri@13.0.0: dependencies: minipass: 7.1.2 @@ -16350,7 +18119,14 @@ snapshots: statuses@2.0.1: {} - std-env@3.9.0: {} + statuses@2.0.2: {} + + std-env@3.10.0: {} + + stop-iteration-iterator@1.1.0: + dependencies: + es-errors: 1.3.0 + internal-slot: 1.1.0 stream-to-array@2.3.0: dependencies: @@ -16374,23 +18150,28 @@ snapshots: get-east-asian-width: 1.3.0 strip-ansi: 7.1.0 - string.prototype.trim@1.2.8: + string.prototype.trim@1.2.10: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-data-property: 1.1.4 + define-properties: 1.2.1 + es-abstract: 1.24.0 + es-object-atoms: 1.1.1 + has-property-descriptors: 1.0.2 - string.prototype.trimend@1.0.7: + string.prototype.trimend@1.0.9: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 + call-bind: 1.0.8 + call-bound: 1.0.4 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 - string.prototype.trimstart@1.0.7: + string.prototype.trimstart@1.0.8: dependencies: - call-bind: 1.0.7 - define-properties: 1.2.0 - es-abstract: 1.22.3 + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 string_decoder@0.10.31: {} @@ -16430,34 +18211,17 @@ snapshots: strip-json-comments@3.1.1: {} - strip-literal@3.0.0: - dependencies: - js-tokens: 9.0.1 - strip-outer@1.0.1: dependencies: escape-string-regexp: 1.0.5 - strong-log-transformer@2.1.0: - dependencies: - duplexer: 0.1.2 - minimist: 1.2.8 - through: 2.3.8 - - stylus-lookup@3.0.2: - dependencies: - commander: 2.20.3 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - stylus-lookup@6.0.0: dependencies: commander: 12.1.0 stylus@0.64.0: dependencies: - '@adobe/css-tools': 4.3.3 + "@adobe/css-tools": 4.3.3 debug: 4.3.6 glob: 10.4.5 sax: 1.4.1 @@ -16467,7 +18231,7 @@ snapshots: sumchecker@3.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.3(supports-color@5.5.0) transitivePeerDependencies: - supports-color @@ -16487,23 +18251,21 @@ snapshots: symbol-tree@3.2.4: {} - synckit@0.11.4: + synckit@0.11.11: dependencies: - '@pkgr/core': 0.2.4 - tslib: 2.8.1 + "@pkgr/core": 0.2.9 - synckit@0.9.0: - dependencies: - '@pkgr/core': 0.1.1 - tslib: 2.6.2 + tagged-tag@1.0.0: {} tapable@2.2.1: {} + tapable@2.3.0: {} + tar-fs@2.1.2: dependencies: chownr: 1.1.4 mkdirp-classic: 0.5.3 - pump: 3.0.0 + pump: 3.0.3 tar-stream: 2.2.0 tar-stream@2.2.0: @@ -16523,31 +18285,40 @@ snapshots: mkdirp: 1.0.4 yallist: 4.0.0 + tar@7.5.2: + dependencies: + "@isaacs/fs-minipass": 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + temp-dir@1.0.0: {} - terser-webpack-plugin@5.3.14(@swc/core@1.9.2)(webpack@5.101.0): + terser-webpack-plugin@5.3.16(@swc/core@1.9.2)(webpack@5.104.1): dependencies: - '@jridgewell/trace-mapping': 0.3.25 + "@jridgewell/trace-mapping": 0.3.29 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) optionalDependencies: - '@swc/core': 1.9.2 + "@swc/core": 1.9.2 terser@5.36.0: dependencies: - '@jridgewell/source-map': 0.3.5 + "@jridgewell/source-map": 0.3.5 acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 - test-exclude@7.0.1: + terser@5.44.1: dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 10.4.5 - minimatch: 9.0.5 + "@jridgewell/source-map": 0.3.5 + acorn: 8.15.0 + commander: 2.20.3 + source-map-support: 0.5.21 text-extensions@1.9.0: {} @@ -16555,8 +18326,6 @@ snapshots: text-hex@1.0.0: {} - text-table@0.2.0: {} - through2@2.0.5: dependencies: readable-stream: 2.3.8 @@ -16566,16 +18335,11 @@ snapshots: tinybench@2.9.0: {} - tinyexec@0.3.2: {} - tinyexec@1.0.1: {} - tinyglobby@0.2.12: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + tinyexec@1.0.2: {} - tinyglobby@0.2.14: + tinyglobby@0.2.12: dependencies: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 @@ -16585,21 +18349,13 @@ snapshots: fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 - tinypool@1.1.1: {} - - tinyrainbow@2.0.0: {} + tinyrainbow@3.0.3: {} - tinyspy@4.0.3: {} + tldts-core@7.0.19: {} - tldts-core@6.1.50: {} - - tldts@6.1.50: - dependencies: - tldts-core: 6.1.50 - - tmp@0.0.33: + tldts@7.0.19: dependencies: - os-tmpdir: 1.0.2 + tldts-core: 7.0.19 tmp@0.2.1: dependencies: @@ -16609,6 +18365,11 @@ snapshots: dependencies: is-number: 7.0.0 + to-valid-identifier@1.0.0: + dependencies: + "@sindresorhus/base62": 1.0.0 + reserved-identifiers: 1.2.0 + toidentifier@1.0.1: {} token-stream@1.0.0: {} @@ -16619,13 +18380,13 @@ snapshots: dependencies: nopt: 1.0.10 - tough-cookie@5.1.2: + tough-cookie@6.0.0: dependencies: - tldts: 6.1.50 + tldts: 7.0.19 tr46@0.0.3: {} - tr46@5.1.1: + tr46@6.0.0: dependencies: punycode: 2.3.1 @@ -16643,40 +18404,50 @@ snapshots: try-catch@3.0.1: {} + try-catch@4.0.7: {} + try-to-catch@3.0.1: {} - ts-api-utils@1.3.0(typescript@5.9.2): + try-to-catch@4.0.3: {} + + ts-api-utils@1.3.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + + ts-api-utils@2.1.0(typescript@5.9.3): dependencies: - typescript: 5.9.2 + typescript: 5.9.3 - ts-graphviz@1.8.1: {} + ts-api-utils@2.3.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 ts-graphviz@2.1.2: dependencies: - '@ts-graphviz/adapter': 2.0.3 - '@ts-graphviz/ast': 2.0.3 - '@ts-graphviz/common': 2.1.2 - '@ts-graphviz/core': 2.0.3 + "@ts-graphviz/adapter": 2.0.3 + "@ts-graphviz/ast": 2.0.3 + "@ts-graphviz/common": 2.1.2 + "@ts-graphviz/core": 2.0.3 ts-json-schema-generator@2.4.0: dependencies: - '@types/json-schema': 7.0.15 + "@types/json-schema": 7.0.15 commander: 13.1.0 glob: 11.0.2 json5: 2.2.3 normalize-path: 3.0.0 safe-stable-stringify: 2.5.0 tslib: 2.8.1 - typescript: 5.9.2 + typescript: 5.9.3 ts-node@10.9.2(@swc/core@1.9.2)(@types/node@18.19.45)(typescript@5.5.4): dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.45 + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.9 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 18.19.45 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 @@ -16687,31 +18458,31 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.9.2 + "@swc/core": 1.9.2 - ts-node@10.9.2(@swc/core@1.9.2)(@types/node@24.1.0)(typescript@5.9.2): + ts-node@10.9.2(@swc/core@1.9.2)(@types/node@25.0.3)(typescript@5.9.3): dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 24.1.0 + "@cspotcode/source-map-support": 0.8.1 + "@tsconfig/node10": 1.0.9 + "@tsconfig/node12": 1.0.11 + "@tsconfig/node14": 1.0.3 + "@tsconfig/node16": 1.0.4 + "@types/node": 25.0.3 acorn: 8.10.0 acorn-walk: 8.2.0 arg: 4.1.3 create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - typescript: 5.9.2 + typescript: 5.9.3 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.9.2 + "@swc/core": 1.9.2 tsconfig-paths@3.15.0: dependencies: - '@types/json5': 0.0.29 + "@types/json5": 0.0.29 json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 @@ -16722,27 +18493,13 @@ snapshots: minimist: 1.2.8 strip-bom: 3.0.0 - tslib@1.14.1: {} - - tslib@2.6.2: {} - tslib@2.8.1: {} - tsutils@3.21.0(typescript@3.9.10): - dependencies: - tslib: 1.14.1 - typescript: 3.9.10 - - tsutils@3.21.0(typescript@4.9.5): - dependencies: - tslib: 1.14.1 - typescript: 4.9.5 - - tuf-js@2.2.1: + tuf-js@4.1.0: dependencies: - '@tufjs/models': 2.0.1 - debug: 4.4.0 - make-fetch-happen: 13.0.1 + "@tufjs/models": 4.1.0 + debug: 4.4.3(supports-color@5.5.0) + make-fetch-happen: 15.0.2 transitivePeerDependencies: - supports-color @@ -16759,147 +18516,148 @@ snapshots: type-fest@0.18.1: {} - type-fest@0.20.2: {} - - type-fest@0.21.3: {} - type-fest@0.4.1: {} type-fest@0.6.0: {} type-fest@0.8.1: {} - type-fest@4.10.3: {} - - type-fest@4.20.1: {} - - type-fest@4.30.2: {} - - type-fest@4.41.0: {} + type-fest@5.3.1: + dependencies: + tagged-tag: 1.0.0 - type-is@1.6.18: + type-is@2.0.1: dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 + content-type: 1.0.5 + media-typer: 1.1.0 + mime-types: 3.0.2 - typed-array-buffer@1.0.0: + typed-array-buffer@1.0.3: dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - is-typed-array: 1.1.12 + call-bound: 1.0.4 + es-errors: 1.3.0 + is-typed-array: 1.1.15 - typed-array-byte-length@1.0.0: + typed-array-byte-length@1.0.3: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - has-proto: 1.0.3 - is-typed-array: 1.1.12 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 - typed-array-byte-offset@1.0.0: + typed-array-byte-offset@1.0.4: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - for-each: 0.3.3 - has-proto: 1.0.3 - is-typed-array: 1.1.12 + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + has-proto: 1.2.0 + is-typed-array: 1.1.15 + reflect.getprototypeof: 1.0.10 - typed-array-length@1.0.4: + typed-array-length@1.0.7: dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - is-typed-array: 1.1.12 + call-bind: 1.0.8 + for-each: 0.3.5 + gopd: 1.2.0 + is-typed-array: 1.1.15 + possible-typed-array-names: 1.1.0 + reflect.getprototypeof: 1.0.10 - typed-event-target@4.0.4: + typed-event-target@4.1.0: dependencies: - '@augment-vir/assert': 31.17.1 - '@augment-vir/common': 31.17.1 - '@augment-vir/core': 31.17.1 + "@augment-vir/assert": 31.54.4 + "@augment-vir/common": 31.54.4 + "@augment-vir/core": 31.54.4 typedarray@0.0.6: {} - typedoc-plugin-carbon-ads@1.6.0(typedoc@0.28.9(typescript@5.9.2)): + typedoc-plugin-carbon-ads@1.6.0(typedoc@0.28.15(typescript@5.9.3)): dependencies: - typedoc: 0.28.9(typescript@5.9.2) - typescript: 5.9.2 + typedoc: 0.28.15(typescript@5.9.3) + typescript: 5.9.3 - typedoc-plugin-clarity@1.6.0(typedoc@0.28.9(typescript@5.9.2)): + typedoc-plugin-clarity@1.6.0(typedoc@0.28.15(typescript@5.9.3)): dependencies: - typedoc: 0.28.9(typescript@5.9.2) - typescript: 5.9.2 + typedoc: 0.28.15(typescript@5.9.3) + typescript: 5.9.3 - typedoc-plugin-coverage@4.0.1(typedoc@0.28.9(typescript@5.9.2)): + typedoc-plugin-coverage@4.0.2(typedoc@0.28.15(typescript@5.9.3)): dependencies: - typedoc: 0.28.9(typescript@5.9.2) + typedoc: 0.28.15(typescript@5.9.3) - typedoc-plugin-keywords@1.6.0(typedoc@0.28.9(typescript@5.9.2)): + typedoc-plugin-keywords@1.6.0(typedoc@0.28.15(typescript@5.9.3)): dependencies: - typedoc: 0.28.9(typescript@5.9.2) - typescript: 5.9.2 + typedoc: 0.28.15(typescript@5.9.3) + typescript: 5.9.3 - typedoc-plugin-mdn-links@5.0.7(typedoc@0.28.9(typescript@5.9.2)): + typedoc-plugin-mdn-links@5.0.10(typedoc@0.28.15(typescript@5.9.3)): dependencies: - typedoc: 0.28.9(typescript@5.9.2) + typedoc: 0.28.15(typescript@5.9.3) - typedoc-plugin-missing-exports@4.0.0(typedoc@0.28.9(typescript@5.9.2)): + typedoc-plugin-missing-exports@4.1.2(typedoc@0.28.15(typescript@5.9.3)): dependencies: - typedoc: 0.28.9(typescript@5.9.2) + typedoc: 0.28.15(typescript@5.9.3) - typedoc@0.28.9(typescript@5.9.2): + typedoc@0.28.15(typescript@5.9.3): dependencies: - '@gerrit0/mini-shiki': 3.9.1 + "@gerrit0/mini-shiki": 3.20.0 lunr: 2.3.9 markdown-it: 14.1.0 minimatch: 9.0.5 - typescript: 5.9.2 - yaml: 2.8.0 + typescript: 5.9.3 + yaml: 2.8.1 - typescript-json-schema@0.65.1(@swc/core@1.9.2): + typescript-eslint@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3): dependencies: - '@types/json-schema': 7.0.15 - '@types/node': 18.19.45 + "@typescript-eslint/eslint-plugin": 8.51.0(@typescript-eslint/parser@8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3))(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + "@typescript-eslint/parser": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + "@typescript-eslint/typescript-estree": 8.51.0(typescript@5.9.3) + "@typescript-eslint/utils": 8.51.0(eslint@9.39.2(jiti@2.4.2))(typescript@5.9.3) + eslint: 9.39.2(jiti@2.4.2) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + + typescript-json-schema@0.67.1(@swc/core@1.9.2): + dependencies: + "@types/json-schema": 7.0.15 + "@types/node": 18.19.45 glob: 7.2.3 path-equal: 1.2.5 - safe-stable-stringify: 2.4.3 + safe-stable-stringify: 2.5.0 ts-node: 10.9.2(@swc/core@1.9.2)(@types/node@18.19.45)(typescript@5.5.4) typescript: 5.5.4 + vm2: 3.10.0 yargs: 17.7.2 transitivePeerDependencies: - - '@swc/core' - - '@swc/wasm' - - typescript@3.9.10: {} - - typescript@4.9.5: {} - - typescript@5.3.3: {} + - "@swc/core" + - "@swc/wasm" typescript@5.5.4: {} - typescript@5.9.2: {} + typescript@5.9.3: {} uc.micro@2.1.0: {} uglify-js@3.17.4: optional: true - unbox-primitive@1.0.2: + unbox-primitive@1.1.0: dependencies: - call-bind: 1.0.7 + call-bound: 1.0.4 has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 + has-symbols: 1.1.0 + which-boxed-primitive: 1.1.1 undefsafe@2.0.5: {} undici-types@5.26.5: {} - undici-types@6.19.8: {} - - undici-types@6.20.0: {} - undici-types@6.21.0: {} - undici-types@7.8.0: {} + undici-types@7.16.0: {} unicode-canonical-property-names-ecmascript@2.0.0: {} @@ -16914,13 +18672,21 @@ snapshots: unicorn-magic@0.1.0: {} - uniq@1.0.1: {} + unicorn-magic@0.3.0: {} + + unique-filename@4.0.0: + dependencies: + unique-slug: 5.0.0 + + unique-filename@5.0.0: + dependencies: + unique-slug: 6.0.0 - unique-filename@3.0.0: + unique-slug@5.0.0: dependencies: - unique-slug: 4.0.0 + imurmurhash: 0.1.4 - unique-slug@4.0.0: + unique-slug@6.0.0: dependencies: imurmurhash: 0.1.4 @@ -16936,21 +18702,27 @@ snapshots: upath@2.0.1: {} - update-browserslist-db@1.1.3(browserslist@4.25.1): + update-browserslist-db@1.2.3(browserslist@4.28.1): dependencies: - browserslist: 4.25.1 + browserslist: 4.28.1 escalade: 3.2.0 picocolors: 1.1.1 + upper-case-first@2.0.2: + dependencies: + tslib: 2.8.1 + + upper-case@2.0.2: + dependencies: + tslib: 2.8.1 + uri-js@4.4.1: dependencies: punycode: 2.3.1 util-deprecate@1.0.2: {} - utils-merge@1.0.1: {} - - uuid@10.0.0: {} + uuid@11.1.0: {} v8-compile-cache-lib@3.0.1: {} @@ -16959,36 +18731,15 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - validate-npm-package-name@5.0.1: {} + validate-npm-package-name@6.0.2: {} - vanilla-picker@2.12.2: + vanilla-picker@2.12.3: dependencies: - '@sphinxxxx/color-conversion': 2.2.2 + "@sphinxxxx/color-conversion": 2.2.2 vary@1.1.2: {} - vite-node@3.2.4(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0): - dependencies: - cac: 6.7.14 - debug: 4.4.1 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.1.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - vite@6.3.6(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(sass@1.69.5)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0): + vite@6.3.6(@types/node@25.0.3)(jiti@2.4.2)(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1): dependencies: esbuild: 0.25.9 fdir: 6.5.0(picomatch@4.0.3) @@ -16997,61 +18748,59 @@ snapshots: rollup: 4.50.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.1.0 + "@types/node": 25.0.3 fsevents: 2.3.3 jiti: 2.4.2 - lightningcss: 1.28.1 - sass: 1.69.5 + lightningcss: 1.30.2 + sass: 1.97.1 stylus: 0.64.0 - terser: 5.36.0 - yaml: 2.8.0 + terser: 5.44.1 + yaml: 2.8.1 - vite@7.1.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0): + vite@7.3.0(@types/node@25.0.3)(jiti@2.4.2)(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1): dependencies: - esbuild: 0.25.9 + esbuild: 0.27.2 fdir: 6.5.0(picomatch@4.0.3) picomatch: 4.0.3 postcss: 8.5.6 rollup: 4.50.1 tinyglobby: 0.2.15 optionalDependencies: - '@types/node': 24.1.0 + "@types/node": 25.0.3 fsevents: 2.3.3 jiti: 2.4.2 - lightningcss: 1.28.1 + lightningcss: 1.30.2 + sass: 1.97.1 stylus: 0.64.0 - terser: 5.36.0 - yaml: 2.8.0 - - vitest@3.2.4(@types/node@24.1.0)(@vitest/ui@3.2.4)(jiti@2.4.2)(jsdom@26.1.0(canvas@3.1.2))(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0): - dependencies: - '@types/chai': 5.2.2 - '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0)) - '@vitest/pretty-format': 3.2.4 - '@vitest/runner': 3.2.4 - '@vitest/snapshot': 3.2.4 - '@vitest/spy': 3.2.4 - '@vitest/utils': 3.2.4 - chai: 5.2.0 - debug: 4.4.1 - expect-type: 1.2.1 - magic-string: 0.30.17 + terser: 5.44.1 + yaml: 2.8.1 + + vitest@4.0.16(@types/node@25.0.3)(@vitest/ui@4.0.16)(jiti@2.4.2)(jsdom@27.4.0(canvas@3.2.0))(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1): + dependencies: + "@vitest/expect": 4.0.16 + "@vitest/mocker": 4.0.16(vite@6.3.6(@types/node@25.0.3)(jiti@2.4.2)(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1)) + "@vitest/pretty-format": 4.0.16 + "@vitest/runner": 4.0.16 + "@vitest/snapshot": 4.0.16 + "@vitest/spy": 4.0.16 + "@vitest/utils": 4.0.16 + es-module-lexer: 1.7.0 + expect-type: 1.3.0 + magic-string: 0.30.21 + obug: 2.1.1 pathe: 2.0.3 - picomatch: 4.0.2 - std-env: 3.9.0 + picomatch: 4.0.3 + std-env: 3.10.0 tinybench: 2.9.0 - tinyexec: 0.3.2 - tinyglobby: 0.2.14 - tinypool: 1.1.1 - tinyrainbow: 2.0.0 - vite: 7.1.5(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@24.1.0)(jiti@2.4.2)(lightningcss@1.28.1)(stylus@0.64.0)(terser@5.36.0)(yaml@2.8.0) + tinyexec: 1.0.2 + tinyglobby: 0.2.15 + tinyrainbow: 3.0.3 + vite: 6.3.6(@types/node@25.0.3)(jiti@2.4.2)(lightningcss@1.30.2)(sass@1.97.1)(stylus@0.64.0)(terser@5.44.1)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: - '@types/node': 24.1.0 - '@vitest/ui': 3.2.4(vitest@3.2.4) - jsdom: 26.1.0(canvas@3.1.2) + "@types/node": 25.0.3 + "@vitest/ui": 4.0.16(vitest@4.0.16) + jsdom: 27.4.0(canvas@3.2.0) transitivePeerDependencies: - jiti - less @@ -17061,22 +18810,26 @@ snapshots: - sass-embedded - stylus - sugarss - - supports-color - terser - tsx - yaml + vm2@3.10.0: + dependencies: + acorn: 8.15.0 + acorn-walk: 8.3.4 + void-elements@3.1.0: {} w3c-xmlserializer@5.0.0: dependencies: xml-name-validator: 5.0.0 - walk-up-path@3.0.1: {} + walk-up-path@4.0.0: {} walkdir@0.4.1: {} - watchpack@2.4.1: + watchpack@2.4.4: dependencies: glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 @@ -17087,51 +18840,31 @@ snapshots: webidl-conversions@3.0.1: {} - webidl-conversions@7.0.0: {} + webidl-conversions@8.0.0: {} - webpack-bundle-analyzer@4.10.2: + webpack-bundle-analyzer@5.1.0: dependencies: - '@discoveryjs/json-ext': 0.5.7 - acorn: 8.11.3 + "@discoveryjs/json-ext": 0.5.7 + acorn: 8.15.0 acorn-walk: 8.2.0 commander: 7.2.0 debounce: 1.2.1 escape-string-regexp: 4.0.0 - gzip-size: 6.0.0 html-escaper: 2.0.2 opener: 1.5.2 - picocolors: 1.0.0 + picocolors: 1.1.1 sirv: 2.0.3 ws: 7.5.9 transitivePeerDependencies: - bufferutil - utf-8-validate - webpack-cli@5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0): - dependencies: - '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 2.1.1(webpack-cli@5.1.4)(webpack@5.101.0) - '@webpack-cli/info': 2.0.2(webpack-cli@5.1.4)(webpack@5.101.0) - '@webpack-cli/serve': 2.0.5(webpack-cli@5.1.4)(webpack@5.101.0) - colorette: 2.0.20 - commander: 10.0.1 - cross-spawn: 7.0.3 - envinfo: 7.10.0 - fastest-levenshtein: 1.0.16 - import-local: 3.1.0 - interpret: 3.1.1 - rechoir: 0.8.0 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) - webpack-merge: 5.9.0 - optionalDependencies: - webpack-bundle-analyzer: 4.10.2 - - webpack-cli@6.0.1(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0): + webpack-cli@6.0.1(webpack-bundle-analyzer@5.1.0)(webpack@5.104.1): dependencies: - '@discoveryjs/json-ext': 0.6.3 - '@webpack-cli/configtest': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) - '@webpack-cli/info': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) - '@webpack-cli/serve': 3.0.1(webpack-cli@6.0.1)(webpack@5.101.0) + "@discoveryjs/json-ext": 0.6.3 + "@webpack-cli/configtest": 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) + "@webpack-cli/info": 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) + "@webpack-cli/serve": 3.0.1(webpack-cli@6.0.1)(webpack@5.104.1) colorette: 2.0.20 commander: 12.1.0 cross-spawn: 7.0.3 @@ -17140,15 +18873,10 @@ snapshots: import-local: 3.1.0 interpret: 3.1.1 rechoir: 0.8.0 - webpack: 5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1) + webpack: 5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1) webpack-merge: 6.0.1 optionalDependencies: - webpack-bundle-analyzer: 4.10.2 - - webpack-merge@5.9.0: - dependencies: - clone-deep: 4.0.1 - wildcard: 2.0.1 + webpack-bundle-analyzer: 5.1.0 webpack-merge@6.0.1: dependencies: @@ -17158,111 +18886,102 @@ snapshots: webpack-sources@3.3.3: {} - webpack@5.101.0(@swc/core@1.9.2)(webpack-cli@5.1.4): - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.15.0 - acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2)(webpack@5.101.0) - watchpack: 2.4.1 - webpack-sources: 3.3.3 - optionalDependencies: - webpack-cli: 5.1.4(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpack@5.101.0(@swc/core@1.9.2)(webpack-cli@6.0.1): + webpack@5.104.1(@swc/core@1.9.2)(webpack-cli@6.0.1): dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 + "@types/eslint-scope": 3.7.7 + "@types/estree": 1.0.8 + "@types/json-schema": 7.0.15 + "@webassemblyjs/ast": 1.14.1 + "@webassemblyjs/wasm-edit": 1.14.1 + "@webassemblyjs/wasm-parser": 1.14.1 acorn: 8.15.0 acorn-import-phases: 1.0.4(acorn@8.15.0) - browserslist: 4.25.1 + browserslist: 4.28.1 chrome-trace-event: 1.0.3 enhanced-resolve: 5.18.2 - es-module-lexer: 1.7.0 + es-module-lexer: 2.0.0 eslint-scope: 5.1.1 events: 3.3.0 glob-to-regexp: 0.4.1 graceful-fs: 4.2.11 json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 + loader-runner: 4.3.1 mime-types: 2.1.35 neo-async: 2.6.2 - schema-utils: 4.3.2 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.14(@swc/core@1.9.2)(webpack@5.101.0) - watchpack: 2.4.1 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.16(@swc/core@1.9.2)(webpack@5.104.1) + watchpack: 2.4.4 webpack-sources: 3.3.3 optionalDependencies: - webpack-cli: 6.0.1(webpack-bundle-analyzer@4.10.2)(webpack@5.101.0) + webpack-cli: 6.0.1(webpack-bundle-analyzer@5.1.0)(webpack@5.104.1) transitivePeerDependencies: - - '@swc/core' + - "@swc/core" - esbuild - uglify-js - whatwg-encoding@3.1.1: - dependencies: - iconv-lite: 0.6.3 - whatwg-mimetype@4.0.0: {} - whatwg-url@14.2.0: + whatwg-url@15.1.0: dependencies: - tr46: 5.1.1 - webidl-conversions: 7.0.0 + tr46: 6.0.0 + webidl-conversions: 8.0.0 whatwg-url@5.0.0: dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 - which-boxed-primitive@1.0.2: + which-boxed-primitive@1.1.1: dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 + is-bigint: 1.1.0 + is-boolean-object: 1.2.2 + is-number-object: 1.1.1 + is-string: 1.1.1 + is-symbol: 1.1.1 - which-typed-array@1.1.13: + which-builtin-type@1.2.1: dependencies: - available-typed-arrays: 1.0.5 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 + call-bound: 1.0.4 + function.prototype.name: 1.1.8 + has-tostringtag: 1.0.2 + is-async-function: 2.1.1 + is-date-object: 1.1.0 + is-finalizationregistry: 1.1.1 + is-generator-function: 1.1.0 + is-regex: 1.2.1 + is-weakref: 1.1.1 + isarray: 2.0.5 + which-boxed-primitive: 1.1.1 + which-collection: 1.0.2 + which-typed-array: 1.1.19 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.4 + + which-typed-array@1.1.19: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.8 + call-bound: 1.0.4 + for-each: 0.3.5 + get-proto: 1.0.1 + gopd: 1.2.0 has-tostringtag: 1.0.2 which@2.0.2: dependencies: isexe: 2.0.0 - which@4.0.0: + which@5.0.0: + dependencies: + isexe: 3.1.1 + + which@6.0.0: dependencies: isexe: 3.1.1 @@ -17277,35 +18996,41 @@ snapshots: wildcard@2.0.1: {} - winston-transport@4.5.0: + winston-transport@4.9.0: dependencies: - logform: 2.5.1 + logform: 2.7.0 readable-stream: 3.6.2 triple-beam: 1.4.0 - winston@3.11.0: + winston@3.19.0: dependencies: - '@colors/colors': 1.6.0 - '@dabh/diagnostics': 2.0.3 + "@colors/colors": 1.6.0 + "@dabh/diagnostics": 2.0.8 async: 3.2.4 is-stream: 2.0.1 - logform: 2.5.1 + logform: 2.7.0 one-time: 1.0.0 readable-stream: 3.6.2 - safe-stable-stringify: 2.4.3 + safe-stable-stringify: 2.5.0 stack-trace: 0.0.10 triple-beam: 1.4.0 - winston-transport: 4.5.0 + winston-transport: 4.9.0 with@7.0.2: dependencies: - '@babel/parser': 7.27.2 - '@babel/types': 7.27.1 + "@babel/parser": 7.28.0 + "@babel/types": 7.28.2 assert-never: 1.3.0 babel-walk: 3.0.0-canary-5 wordwrap@1.0.0: {} + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 @@ -17337,6 +19062,11 @@ snapshots: imurmurhash: 0.1.4 signal-exit: 4.1.0 + write-file-atomic@6.0.0: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 4.1.0 + write-json-file@3.2.0: dependencies: detect-indent: 5.0.0 @@ -17354,7 +19084,7 @@ snapshots: ws@7.5.9: {} - ws@8.18.0: {} + ws@8.18.3: {} xml-name-validator@5.0.0: {} @@ -17368,7 +19098,9 @@ snapshots: yallist@4.0.0: {} - yaml@2.8.0: {} + yallist@5.0.0: {} + + yaml@2.8.1: {} yargs-parser@20.2.9: {} @@ -17415,3 +19147,5 @@ snapshots: yocto-queue@0.1.0: {} yocto-queue@1.0.0: {} + + yoctocolors-cjs@2.1.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 27613507eeb..6935f7675e5 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,5 +17,10 @@ packages: - updaters/* - utils/* - websites/* + onlyBuiltDependencies: + - '@parcel/watcher' - canvas + - electron + - esbuild + - nx diff --git a/shapes/arrow/.eslintignore b/shapes/arrow/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/arrow/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/arrow/.eslintrc.js b/shapes/arrow/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/arrow/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/arrow/CHANGELOG.md b/shapes/arrow/CHANGELOG.md index 726191ac172..9416583b1b7 100644 --- a/shapes/arrow/CHANGELOG.md +++ b/shapes/arrow/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-arrow + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-arrow diff --git a/shapes/arrow/eslint.config.js b/shapes/arrow/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/arrow/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/arrow/package.dist.json b/shapes/arrow/package.dist.json index 366bf5875d8..1b89e7d29be 100644 --- a/shapes/arrow/package.dist.json +++ b/shapes/arrow/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-arrow", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles arrow shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/arrow/package.json b/shapes/arrow/package.json index 5dcb15de2c7..793dd32da7d 100644 --- a/shapes/arrow/package.json +++ b/shapes/arrow/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-arrow", - "version": "3.9.1", - "description": "tsParticles arrow shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-arrow", + "version": "4.0.0-alpha.0", + "description": "tsParticles arrow shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/arrow" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/arrow" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/arrow/src/ArrowDrawer.ts b/shapes/arrow/src/ArrowDrawer.ts index 6f363d8ccb1..1f54d01f018 100644 --- a/shapes/arrow/src/ArrowDrawer.ts +++ b/shapes/arrow/src/ArrowDrawer.ts @@ -14,7 +14,7 @@ export class ArrowDrawer implements IShapeDrawer { drawArrow(data); } - particleInit(container: Container, particle: ArrowParticle): void { + particleInit(_container: Container, particle: ArrowParticle): void { const shapeData = particle.shapeData as IArrowData | undefined; particle.heightFactor = getRangeValue(shapeData?.heightFactor ?? defaultHeightFactor); diff --git a/shapes/arrow/src/Utils.ts b/shapes/arrow/src/Utils.ts index d764751d65f..efe0bbfb80a 100644 --- a/shapes/arrow/src/Utils.ts +++ b/shapes/arrow/src/Utils.ts @@ -1,19 +1,12 @@ -import type { ICoordinates, IShapeDrawData } from "@tsparticles/engine"; +import { type IShapeDrawData, double, half, originPoint } from "@tsparticles/engine"; import type { ArrowParticle } from "./ArrowParticle.js"; -const double = 2, - defaultHeightFactor = 0.5, +const defaultHeightFactor = half, defaultHeadWidthFactor = 0.2, - defaultBodyHeightFactor = 0.5, - half = 0.5, - origin: ICoordinates = { - x: 0, - y: 0, - }; + defaultBodyHeightFactor = half; /** - * - * @param data + * @param data - */ export function drawArrow(data: IShapeDrawData): void { const { context, particle, radius } = data, @@ -25,13 +18,13 @@ export function drawArrow(data: IShapeDrawData): void { headWidth = width * headWidthFactor, bodyHeight = height * bodyHeightFactor; - context.moveTo(-width * half, origin.y); + context.moveTo(-width * half, originPoint.y); context.lineTo(-width * half, -bodyHeight * half); context.lineTo(width * half - headWidth, -bodyHeight * half); context.lineTo(width * half - headWidth, -height * half); - context.lineTo(width * half + headWidth, origin.y); + context.lineTo(width * half + headWidth, originPoint.y); context.lineTo(width * half - headWidth, height * half); context.lineTo(width * half - headWidth, bodyHeight * half); context.lineTo(-width * half, bodyHeight * half); - context.lineTo(-width * half, origin.y); + context.lineTo(-width * half, originPoint.y); } diff --git a/shapes/arrow/src/index.ts b/shapes/arrow/src/index.ts index 88b94e67a3f..d660e938581 100644 --- a/shapes/arrow/src/index.ts +++ b/shapes/arrow/src/index.ts @@ -1,14 +1,16 @@ -import { ArrowDrawer } from "./ArrowDrawer.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadArrowShape(engine: Engine, refresh = true): Promise { +export function loadArrowShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new ArrowDrawer(), refresh); + engine.register(async e => { + const { ArrowDrawer } = await import("./ArrowDrawer.js"); + + e.addShape(new ArrowDrawer()); + }); } diff --git a/shapes/arrow/webpack.config.js b/shapes/arrow/webpack.config.js index f4fb8d85b95..ccbcc294a2a 100644 --- a/shapes/arrow/webpack.config.js +++ b/shapes/arrow/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "arrow", shapeName: "Arrow", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "arrow", shapeName: "Arrow", version, dir: __dirname }); diff --git a/shapes/cards/.eslintignore b/shapes/cards/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/cards/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/cards/.eslintrc.js b/shapes/cards/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/cards/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/cards/CHANGELOG.md b/shapes/cards/CHANGELOG.md index 39d98e16a88..b95035b467b 100644 --- a/shapes/cards/CHANGELOG.md +++ b/shapes/cards/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-cards + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-cards diff --git a/shapes/cards/eslint.config.js b/shapes/cards/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/cards/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/cards/package.dist.json b/shapes/cards/package.dist.json index 67cf50d33dd..4702d3ddd76 100644 --- a/shapes/cards/package.dist.json +++ b/shapes/cards/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-cards", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles cards shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/cards/package.json b/shapes/cards/package.json index ea68fb9e9cd..e1e98ddd688 100644 --- a/shapes/cards/package.json +++ b/shapes/cards/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-cards", - "version": "3.9.1", - "description": "tsParticles cards shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-cards", + "version": "4.0.0-alpha.0", + "description": "tsParticles cards shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/cards" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/cards" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/cards/src/Utils.ts b/shapes/cards/src/Utils.ts index 78b578cf62b..2d1d16618da 100644 --- a/shapes/cards/src/Utils.ts +++ b/shapes/cards/src/Utils.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import type { ICardsPath, IPath } from "./ICardsPath.js"; import type { IShapeDrawData } from "@tsparticles/engine"; @@ -8,22 +9,22 @@ import type { IShapeDrawData } from "@tsparticles/engine"; * @param path - */ export function drawPath(data: IShapeDrawData, path: IPath): void { - if (!path.segments.length || !path.segments[0].values.length) { + if (!path.segments.length || !path.segments[0]!.values.length) { return; } const { context, radius } = data; - context.moveTo(path.segments[0].values[0].x * radius, path.segments[0].values[0].y * radius); + context.moveTo(path.segments[0]!.values[0]!.x * radius, path.segments[0]!.values[0]!.y * radius); for (const segment of path.segments) { context.bezierCurveTo( - segment.values[1].x * radius, - segment.values[1].y * radius, - segment.values[2].x * radius, - segment.values[2].y * radius, - segment.values[3].x * radius, - segment.values[3].y * radius, + segment.values[1]!.x * radius, + segment.values[1]!.y * radius, + segment.values[2]!.x * radius, + segment.values[2]!.y * radius, + segment.values[3]!.x * radius, + segment.values[3]!.y * radius, ); } @@ -31,17 +32,17 @@ export function drawPath(data: IShapeDrawData, path: IPath): void { const segment = path.segments[i]; context.bezierCurveTo( - -segment.values[2].x * radius, - segment.values[2].y * radius, - -segment.values[1].x * radius, - segment.values[1].y * radius, - -segment.values[0].x * radius, - segment.values[0].y * radius, + -segment!.values[2]!.x * radius, + segment!.values[2]!.y * radius, + -segment!.values[1]!.x * radius, + segment!.values[1]!.y * radius, + -segment!.values[0]!.x * radius, + segment!.values[0]!.y * radius, ); } } -const n = 1.0 / 2; +const n = 0.5; export const paths: ICardsPath = { heart: { diff --git a/shapes/cards/src/ClubDrawer.ts b/shapes/cards/src/clubs/ClubDrawer.ts similarity index 84% rename from shapes/cards/src/ClubDrawer.ts rename to shapes/cards/src/clubs/ClubDrawer.ts index ca2aa49aba2..f0e81079ad1 100644 --- a/shapes/cards/src/ClubDrawer.ts +++ b/shapes/cards/src/clubs/ClubDrawer.ts @@ -1,5 +1,5 @@ import type { IShapeDrawData, IShapeDrawer } from "@tsparticles/engine"; -import { drawPath, paths } from "./Utils.js"; +import { drawPath, paths } from "../Utils.js"; export class ClubDrawer implements IShapeDrawer { readonly validTypes = ["club", "clubs"] as const; diff --git a/shapes/cards/src/clubs/index.ts b/shapes/cards/src/clubs/index.ts new file mode 100644 index 00000000000..d0a7267ac20 --- /dev/null +++ b/shapes/cards/src/clubs/index.ts @@ -0,0 +1,16 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * @param engine - + */ +export function loadClubsCardsShape(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { ClubDrawer } = await import("./ClubDrawer.js"); + + e.addShape(new ClubDrawer()); + }); +} diff --git a/shapes/cards/src/DiamondDrawer.ts b/shapes/cards/src/diamonds/DiamondDrawer.ts similarity index 85% rename from shapes/cards/src/DiamondDrawer.ts rename to shapes/cards/src/diamonds/DiamondDrawer.ts index bacdb62faa1..431f360cca7 100644 --- a/shapes/cards/src/DiamondDrawer.ts +++ b/shapes/cards/src/diamonds/DiamondDrawer.ts @@ -1,5 +1,5 @@ import type { IShapeDrawData, IShapeDrawer } from "@tsparticles/engine"; -import { drawPath, paths } from "./Utils.js"; +import { drawPath, paths } from "../Utils.js"; export class DiamondDrawer implements IShapeDrawer { readonly validTypes = ["diamond", "diamonds"] as const; diff --git a/shapes/cards/src/diamonds/index.ts b/shapes/cards/src/diamonds/index.ts new file mode 100644 index 00000000000..2c397ffcc9d --- /dev/null +++ b/shapes/cards/src/diamonds/index.ts @@ -0,0 +1,16 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * @param engine - + */ +export function loadDiamondsCardsShape(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { DiamondDrawer } = await import("./DiamondDrawer.js"); + + e.addShape(new DiamondDrawer()); + }); +} diff --git a/shapes/cards/src/HeartDrawer.ts b/shapes/cards/src/hearts/HeartDrawer.ts similarity index 84% rename from shapes/cards/src/HeartDrawer.ts rename to shapes/cards/src/hearts/HeartDrawer.ts index 8d2ac3f6952..ec4e0ba4870 100644 --- a/shapes/cards/src/HeartDrawer.ts +++ b/shapes/cards/src/hearts/HeartDrawer.ts @@ -1,5 +1,5 @@ import type { IShapeDrawData, IShapeDrawer } from "@tsparticles/engine"; -import { drawPath, paths } from "./Utils.js"; +import { drawPath, paths } from "../Utils.js"; export class HeartDrawer implements IShapeDrawer { readonly validTypes = ["heart", "hearts"] as const; diff --git a/shapes/cards/src/hearts/index.ts b/shapes/cards/src/hearts/index.ts new file mode 100644 index 00000000000..6af7d13fcc7 --- /dev/null +++ b/shapes/cards/src/hearts/index.ts @@ -0,0 +1,16 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * @param engine - + */ +export function loadHeartsCardsShape(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { HeartDrawer } = await import("./HeartDrawer.js"); + + e.addShape(new HeartDrawer()); + }); +} diff --git a/shapes/cards/src/index.ts b/shapes/cards/src/index.ts index e9778276e7f..f01dc6efd40 100644 --- a/shapes/cards/src/index.ts +++ b/shapes/cards/src/index.ts @@ -1,20 +1,27 @@ -import { ClubDrawer } from "./ClubDrawer.js"; -import { DiamondDrawer } from "./DiamondDrawer.js"; import { type Engine } from "@tsparticles/engine"; -import { HeartDrawer } from "./HeartDrawer.js"; -import { SpadeDrawer } from "./SpadeDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadCardsShape(engine: Engine, refresh = true): Promise { +export function loadCardsShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new SpadeDrawer(), refresh); - await engine.addShape(new HeartDrawer(), refresh); - await engine.addShape(new DiamondDrawer(), refresh); - await engine.addShape(new ClubDrawer(), refresh); + engine.register(async e => { + const { loadClubsCardsShape } = await import("./clubs/index.js"), + { loadDiamondsCardsShape } = await import("./diamonds/index.js"), + { loadHeartsCardsShape } = await import("./hearts/index.js"), + { loadSpadesCardsShape } = await import("./spades/index.js"); + + loadClubsCardsShape(e); + loadDiamondsCardsShape(e); + loadHeartsCardsShape(e); + loadSpadesCardsShape(e); + }); } + +export * from "./clubs/index.js"; +export * from "./diamonds/index.js"; +export * from "./hearts/index.js"; +export * from "./spades/index.js"; diff --git a/shapes/cards/src/SpadeDrawer.ts b/shapes/cards/src/spades/SpadeDrawer.ts similarity index 84% rename from shapes/cards/src/SpadeDrawer.ts rename to shapes/cards/src/spades/SpadeDrawer.ts index 7ce15017921..b2a0943c3c3 100644 --- a/shapes/cards/src/SpadeDrawer.ts +++ b/shapes/cards/src/spades/SpadeDrawer.ts @@ -1,5 +1,5 @@ import type { IShapeDrawData, IShapeDrawer } from "@tsparticles/engine"; -import { drawPath, paths } from "./Utils.js"; +import { drawPath, paths } from "../Utils.js"; export class SpadeDrawer implements IShapeDrawer { readonly validTypes = ["spade", "spades"] as const; diff --git a/shapes/cards/src/spades/index.ts b/shapes/cards/src/spades/index.ts new file mode 100644 index 00000000000..16dec134208 --- /dev/null +++ b/shapes/cards/src/spades/index.ts @@ -0,0 +1,16 @@ +import { type Engine } from "@tsparticles/engine"; + +declare const __VERSION__: string; + +/** + * @param engine - + */ +export function loadSpadesCardsShape(engine: Engine): void { + engine.checkVersion(__VERSION__); + + engine.register(async e => { + const { SpadeDrawer } = await import("./SpadeDrawer.js"); + + e.addShape(new SpadeDrawer()); + }); +} diff --git a/shapes/cards/webpack.config.js b/shapes/cards/webpack.config.js index a6337c4a741..87a4e7b052e 100644 --- a/shapes/cards/webpack.config.js +++ b/shapes/cards/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "cards", shapeName: "Cards", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "cards", shapeName: "Cards", version, dir: __dirname }); diff --git a/shapes/circle/.eslintignore b/shapes/circle/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/circle/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/circle/.eslintrc.js b/shapes/circle/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/circle/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/circle/CHANGELOG.md b/shapes/circle/CHANGELOG.md index 153a5af4002..3a814ba0273 100644 --- a/shapes/circle/CHANGELOG.md +++ b/shapes/circle/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-circle + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-circle diff --git a/shapes/circle/eslint.config.js b/shapes/circle/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/circle/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/circle/package.dist.json b/shapes/circle/package.dist.json index 655e0732d3d..ae582c66954 100644 --- a/shapes/circle/package.dist.json +++ b/shapes/circle/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-circle", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles circle shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/circle/package.json b/shapes/circle/package.json index 4fa25b639d5..fce7d60d248 100644 --- a/shapes/circle/package.json +++ b/shapes/circle/package.json @@ -1,74 +1,75 @@ { - "name": "@tsparticles/shape-circle", - "version": "3.9.1", - "description": "tsParticles circle shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-circle", + "version": "4.0.0-alpha.0", + "description": "tsParticles circle shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/circle" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/circle" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/circle/src/CircleDrawer.ts b/shapes/circle/src/CircleDrawer.ts index 294fa66fa4b..c795f78cbd2 100644 --- a/shapes/circle/src/CircleDrawer.ts +++ b/shapes/circle/src/CircleDrawer.ts @@ -20,18 +20,18 @@ export class CircleDrawer implements IShapeDrawer { return sides; } - particleInit(container: Container, particle: CircleParticle): void { + particleInit(_container: Container, particle: CircleParticle): void { const shapeData = particle.shapeData as ICircleShapeData | undefined, angle = shapeData?.angle ?? { max: maxAngle, min: minAngle, }; - particle.circleRange = !isObject(angle) - ? { + particle.circleRange = isObject(angle) + ? { min: degToRad(angle.min), max: degToRad(angle.max) } + : { min: minAngle, max: degToRad(angle), - } - : { min: degToRad(angle.min), max: degToRad(angle.max) }; + }; } } diff --git a/shapes/circle/src/Utils.ts b/shapes/circle/src/Utils.ts index dc30488b6ca..a2f125c1f7c 100644 --- a/shapes/circle/src/Utils.ts +++ b/shapes/circle/src/Utils.ts @@ -13,9 +13,7 @@ const double = 2, export function drawCircle(data: IShapeDrawData): void { const { context, particle, radius } = data; - if (!particle.circleRange) { - particle.circleRange = { min: minAngle, max: doublePI }; - } + particle.circleRange ??= { min: minAngle, max: doublePI }; const circleRange = particle.circleRange; diff --git a/shapes/circle/src/index.ts b/shapes/circle/src/index.ts index f27dc372367..557f83ec55a 100644 --- a/shapes/circle/src/index.ts +++ b/shapes/circle/src/index.ts @@ -1,14 +1,16 @@ -import { CircleDrawer } from "./CircleDrawer.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadCircleShape(engine: Engine, refresh = true): Promise { +export function loadCircleShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new CircleDrawer(), refresh); + engine.register(async e => { + const { CircleDrawer } = await import("./CircleDrawer.js"); + + e.addShape(new CircleDrawer()); + }); } diff --git a/shapes/circle/webpack.config.js b/shapes/circle/webpack.config.js index 9e250efbeda..73a0ccc0991 100644 --- a/shapes/circle/webpack.config.js +++ b/shapes/circle/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "circle", shapeName: "Circle", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "circle", shapeName: "Circle", version, dir: __dirname }); diff --git a/shapes/cog/.eslintignore b/shapes/cog/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/cog/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/cog/.eslintrc.js b/shapes/cog/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/cog/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/cog/CHANGELOG.md b/shapes/cog/CHANGELOG.md index a5729717ebc..7ecfba061b7 100644 --- a/shapes/cog/CHANGELOG.md +++ b/shapes/cog/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-cog + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-cog diff --git a/shapes/cog/eslint.config.js b/shapes/cog/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/cog/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/cog/package.dist.json b/shapes/cog/package.dist.json index a125f4784fc..4946fa662fb 100644 --- a/shapes/cog/package.dist.json +++ b/shapes/cog/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-cog", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles cog shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/cog/package.json b/shapes/cog/package.json index bcd0f218840..15e354d1fa7 100644 --- a/shapes/cog/package.json +++ b/shapes/cog/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-cog", - "version": "3.9.1", - "description": "tsParticles cog shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-cog", + "version": "4.0.0-alpha.0", + "description": "tsParticles cog shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/cog" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/cog" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/cog/src/CogDrawer.ts b/shapes/cog/src/CogDrawer.ts index 6fc72c522a4..af074b3f4e5 100644 --- a/shapes/cog/src/CogDrawer.ts +++ b/shapes/cog/src/CogDrawer.ts @@ -20,7 +20,7 @@ export class CogDrawer implements IShapeDrawer { drawCog(data); } - particleInit(container: Container, particle: CogParticle): void { + particleInit(_container: Container, particle: CogParticle): void { const shapeData = particle.shapeData as ICogData | undefined; particle.cogHoleRadius = getRangeValue(shapeData?.holeRadius ?? defaultHoleRadius); diff --git a/shapes/cog/src/index.ts b/shapes/cog/src/index.ts index 942e3bd1788..4cf02879be5 100644 --- a/shapes/cog/src/index.ts +++ b/shapes/cog/src/index.ts @@ -1,14 +1,16 @@ -import { CogDrawer } from "./CogDrawer.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadCogShape(engine: Engine, refresh = true): Promise { +export function loadCogShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new CogDrawer(), refresh); + engine.register(async e => { + const { CogDrawer } = await import("./CogDrawer.js"); + + e.addShape(new CogDrawer()); + }); } diff --git a/shapes/cog/webpack.config.js b/shapes/cog/webpack.config.js index d61dfa4c9d0..70143ace04a 100644 --- a/shapes/cog/webpack.config.js +++ b/shapes/cog/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "cog", shapeName: "Cog", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "cog", shapeName: "Cog", version, dir: __dirname }); diff --git a/shapes/emoji/.eslintignore b/shapes/emoji/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/emoji/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/emoji/.eslintrc.js b/shapes/emoji/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/emoji/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/emoji/CHANGELOG.md b/shapes/emoji/CHANGELOG.md index d5238c74a94..83c4e190df0 100644 --- a/shapes/emoji/CHANGELOG.md +++ b/shapes/emoji/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-emoji + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-emoji diff --git a/shapes/emoji/eslint.config.js b/shapes/emoji/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/emoji/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/emoji/package.dist.json b/shapes/emoji/package.dist.json index be473d33ec2..f4acb1bfa72 100644 --- a/shapes/emoji/package.dist.json +++ b/shapes/emoji/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-emoji", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles emoji shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/emoji/package.json b/shapes/emoji/package.json index c8933dd0c3f..60690eef60c 100644 --- a/shapes/emoji/package.json +++ b/shapes/emoji/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-emoji", - "version": "3.9.1", - "description": "tsParticles emoji shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-emoji", + "version": "4.0.0-alpha.0", + "description": "tsParticles emoji shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/emoji" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/emoji" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/emoji/src/EmojiDrawer.ts b/shapes/emoji/src/EmojiDrawer.ts index 12b3da86403..4e8d75641cf 100644 --- a/shapes/emoji/src/EmojiDrawer.ts +++ b/shapes/emoji/src/EmojiDrawer.ts @@ -8,13 +8,15 @@ import { isInArray, itemFromSingleOrMultiple, loadFont, + safeDocument, } from "@tsparticles/engine"; import type { EmojiParticle } from "./EmojiParticle.js"; import type { IEmojiShape } from "./IEmojiShape.js"; import { drawEmoji } from "./Utils.js"; const defaultFont = '"Twemoji Mozilla", Apple Color Emoji, "Segoe UI Emoji", "Noto Color Emoji", "EmojiOne Color"', - noPadding = 0; + noPadding = 0, + firstItem = 0; export class EmojiDrawer implements IShapeDrawer { readonly validTypes = ["emoji"] as const; @@ -24,7 +26,7 @@ export class EmojiDrawer implements IShapeDrawer { destroy(): void { for (const [key, data] of this._emojiShapeDict) { if (data instanceof ImageBitmap) { - data?.close(); + data.close(); } this._emojiShapeDict.delete(key); @@ -56,17 +58,15 @@ export class EmojiDrawer implements IShapeDrawer { } const promises: Promise[] = [loadFont(defaultFont)], - shapeOptions = validTypes - .map(t => options.particles.shape.options[t]) - .find(t => !!t) as SingleOrMultiple; - - if (shapeOptions) { - executeOnSingleOrMultiple(shapeOptions, shape => { - if (shape.font) { - promises.push(loadFont(shape.font)); - } - }); - } + shapeOptions = validTypes.map(t => options.particles.shape.options[t])[ + firstItem + ] as SingleOrMultiple; + + executeOnSingleOrMultiple(shapeOptions, shape => { + if (shape.font) { + promises.push(loadFont(shape.font)); + } + }); await Promise.all(promises); } @@ -79,7 +79,7 @@ export class EmojiDrawer implements IShapeDrawer { const double = 2, shapeData = particle.shapeData as unknown as IEmojiShape; - if (!shapeData?.value) { + if (!shapeData.value) { return; } @@ -128,7 +128,7 @@ export class EmojiDrawer implements IShapeDrawer { return; } - context.font = `400 ${maxSize * double}px ${font}`; + context.font = `400 ${(maxSize * double).toString()}px ${font}`; context.textBaseline = "middle"; context.textAlign = "center"; @@ -136,7 +136,7 @@ export class EmojiDrawer implements IShapeDrawer { image = canvas.transferToImageBitmap(); } else { - const canvas = document.createElement("canvas"); + const canvas = safeDocument().createElement("canvas"); canvas.width = canvasSize; canvas.height = canvasSize; @@ -147,7 +147,7 @@ export class EmojiDrawer implements IShapeDrawer { return; } - context.font = `400 ${maxSize * double}px ${font}`; + context.font = `400 ${(maxSize * double).toString()}px ${font}`; context.textBaseline = "middle"; context.textAlign = "center"; diff --git a/shapes/emoji/src/Utils.ts b/shapes/emoji/src/Utils.ts index 6afeb222153..cb66d437415 100644 --- a/shapes/emoji/src/Utils.ts +++ b/shapes/emoji/src/Utils.ts @@ -9,13 +9,8 @@ import type { IShapeDrawData } from "@tsparticles/engine"; export function drawEmoji(data: IShapeDrawData, image: ImageBitmap | HTMLCanvasElement): void { const { context, opacity } = data, half = 0.5, - previousAlpha = context.globalAlpha; - - if (!image) { - return; - } - - const diameter = image.width, + previousAlpha = context.globalAlpha, + diameter = image.width, radius = diameter * half; context.globalAlpha = opacity; diff --git a/shapes/emoji/src/index.ts b/shapes/emoji/src/index.ts index 7b8c1832c83..817ac309a0d 100644 --- a/shapes/emoji/src/index.ts +++ b/shapes/emoji/src/index.ts @@ -1,14 +1,16 @@ -import { EmojiDrawer } from "./EmojiDrawer.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadEmojiShape(engine: Engine, refresh = true): Promise { +export function loadEmojiShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new EmojiDrawer(), refresh); + engine.register(async e => { + const { EmojiDrawer } = await import("./EmojiDrawer.js"); + + e.addShape(new EmojiDrawer()); + }); } diff --git a/shapes/emoji/webpack.config.js b/shapes/emoji/webpack.config.js index 4ec59ea3fde..541bee94a1f 100644 --- a/shapes/emoji/webpack.config.js +++ b/shapes/emoji/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "emoji", shapeName: "Emoji", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "emoji", shapeName: "Emoji", version, dir: __dirname }); diff --git a/shapes/heart/.eslintignore b/shapes/heart/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/heart/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/heart/.eslintrc.js b/shapes/heart/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/heart/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/heart/CHANGELOG.md b/shapes/heart/CHANGELOG.md index 6771d264746..37b715875ba 100644 --- a/shapes/heart/CHANGELOG.md +++ b/shapes/heart/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-heart + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-heart diff --git a/shapes/heart/eslint.config.js b/shapes/heart/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/heart/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/heart/package.dist.json b/shapes/heart/package.dist.json index 5445c1b9120..b3a4bee7220 100644 --- a/shapes/heart/package.dist.json +++ b/shapes/heart/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-heart", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles heart shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/heart/package.json b/shapes/heart/package.json index ccd05dc15cb..8783164a59a 100644 --- a/shapes/heart/package.json +++ b/shapes/heart/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-heart", - "version": "3.9.1", - "description": "tsParticles heart shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-heart", + "version": "4.0.0-alpha.0", + "description": "tsParticles heart shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/heart" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/heart" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/heart/src/index.ts b/shapes/heart/src/index.ts index c381f7ad566..2a75d523f21 100644 --- a/shapes/heart/src/index.ts +++ b/shapes/heart/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { HeartDrawer } from "./HeartDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadHeartShape(engine: Engine, refresh = true): Promise { +export function loadHeartShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new HeartDrawer(), refresh); + engine.register(async e => { + const { HeartDrawer } = await import("./HeartDrawer.js"); + + e.addShape(new HeartDrawer()); + }); } diff --git a/shapes/heart/webpack.config.js b/shapes/heart/webpack.config.js index e71b0e99f9d..cb39570adbb 100644 --- a/shapes/heart/webpack.config.js +++ b/shapes/heart/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "heart", shapeName: "Heart", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "heart", shapeName: "Heart", version, dir: __dirname }); diff --git a/shapes/image/.eslintignore b/shapes/image/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/image/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/image/.eslintrc.js b/shapes/image/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/image/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/image/CHANGELOG.md b/shapes/image/CHANGELOG.md index 285bfee7e31..0a24dc2b302 100644 --- a/shapes/image/CHANGELOG.md +++ b/shapes/image/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-image diff --git a/shapes/image/eslint.config.js b/shapes/image/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/image/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/image/package.dist.json b/shapes/image/package.dist.json index 4103eab110e..afa3845c0b3 100644 --- a/shapes/image/package.dist.json +++ b/shapes/image/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-image", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles image shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/image/package.json b/shapes/image/package.json index e532b59b54a..cdb6e63ce2a 100644 --- a/shapes/image/package.json +++ b/shapes/image/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-image", - "version": "3.9.1", - "description": "tsParticles image shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-image", + "version": "4.0.0-alpha.0", + "description": "tsParticles image shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/image" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/image" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/image/src/GifUtils/ByteStream.ts b/shapes/image/src/GifUtils/ByteStream.ts index adad767ad43..3c14935a97f 100644 --- a/shapes/image/src/GifUtils/ByteStream.ts +++ b/shapes/image/src/GifUtils/ByteStream.ts @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + export class ByteStream { /** * this streams raw data @@ -32,7 +34,7 @@ export class ByteStream { * @returns the next byte */ nextByte(): number { - return this.data[this.pos++]; + return this.data[this.pos++]!; } /** @@ -46,7 +48,7 @@ export class ByteStream { this.pos += increment; - return this.data[this.pos - increment] + (this.data[this.pos - previous] << shift); + return this.data[this.pos - increment]! + (this.data[this.pos - previous]! << shift); } /** @@ -56,13 +58,14 @@ export class ByteStream { readSubBlocks(): string { let blockString = "", size = 0; + const minCount = 0, emptySize = 0; do { - size = this.data[this.pos++]; + size = this.data[this.pos++]!; - for (let count = size; --count >= minCount; blockString += String.fromCharCode(this.data[this.pos++])) { + for (let count = size; --count >= minCount; blockString += String.fromCharCode(this.data[this.pos++]!)) { // do nothing } } while (size !== emptySize); @@ -75,22 +78,22 @@ export class ByteStream { * @returns the sub blocks as binary */ readSubBlocksBin(): Uint8Array { - let size = this.data[this.pos], + let size = this.data[this.pos]!, len = 0; const emptySize = 0, increment = 1; - for (let offset = 0; size !== emptySize; offset += size + increment, size = this.data[this.pos + offset]) { + for (let offset = 0; size !== emptySize; offset += size + increment, size = this.data[this.pos + offset]!) { len += size; } const blockData = new Uint8Array(len); - size = this.data[this.pos++]; + size = this.data[this.pos++]!; - for (let i = 0; size !== emptySize; size = this.data[this.pos++]) { - for (let count = size; --count >= emptySize; blockData[i++] = this.data[this.pos++]) { + for (let i = 0; size !== emptySize; size = this.data[this.pos++]!) { + for (let count = size; --count >= emptySize; blockData[i++] = this.data[this.pos++]!) { // do nothing } } @@ -105,7 +108,7 @@ export class ByteStream { for ( const increment = 1, noData = 0; this.data[this.pos] !== noData; - this.pos += this.data[this.pos] + increment + this.pos += this.data[this.pos]! + increment ) { // do nothing } diff --git a/shapes/image/src/GifUtils/Utils.ts b/shapes/image/src/GifUtils/Utils.ts index bbd0aba4f65..621edffd250 100644 --- a/shapes/image/src/GifUtils/Utils.ts +++ b/shapes/image/src/GifUtils/Utils.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import type { ICoordinates, IRgb, IRgba, IShapeDrawData } from "@tsparticles/engine"; import { type IImage, type ImageParticle, loadImage } from "../Utils.js"; @@ -31,9 +32,9 @@ function parseColorTable(byteStream: ByteStream, count: number): IRgb[] { for (let i = 0; i < count; i++) { colors.push({ - r: byteStream.data[byteStream.pos], - g: byteStream.data[byteStream.pos + 1], - b: byteStream.data[byteStream.pos + 2], + r: byteStream.data[byteStream.pos]!, + g: byteStream.data[byteStream.pos + 1]!, + b: byteStream.data[byteStream.pos + 2]!, }); byteStream.pos += 3; @@ -59,7 +60,7 @@ function parseExtensionBlock( switch (byteStream.nextByte() as GIFDataHeaders) { case GIFDataHeaders.GraphicsControlExtension: { // ~ parse graphics control extension data - applies to the next frame in the byte stream - const frame = gif.frames[getFrameIndex(false)]; + const frame = gif.frames[getFrameIndex(false)]!; // ~ block size (1B) - static 4 - byte size of the block up to (but excluding) the Block Terminator byteStream.pos++; @@ -125,7 +126,7 @@ function parseExtensionBlock( // ~ block size (1B) - static 12 - byte size of the block up to (but excluding) the plain text data blocks byteStream.pos++; - gif.frames[getFrameIndex(false)].plainTextData = { + gif.frames[getFrameIndex(false)]!.plainTextData = { // ~ text grid left position (2B) - position of the left edge of text grid (in pixels) within the GIF (from the left edge) left: byteStream.nextTwoBytes(), // ~ text grid top position (2B) - position of the top edge of text grid (in pixels) within the GIF (from the top edge) @@ -178,7 +179,7 @@ async function parseImageBlock( progressCallback?: GIFProgressCallbackFunction, ): Promise { // ~ parse frame image - image descriptor - const frame = gif.frames[getFrameIndex(true)]; + const frame = gif.frames[getFrameIndex(true)]!; // ~ image left position (2B) - position of the left edge of the frame (in pixels) within the GIF (from the left edge) frame.left = byteStream.nextTwoBytes(); @@ -216,13 +217,13 @@ async function parseImageBlock( * @returns RGBA color value */ const getColor = (index: number): IRgba => { - const { r, g, b } = (localColorTableFlag ? frame.localColorTable : gif.globalColorTable)[index]; + const { r, g, b } = (localColorTableFlag ? frame.localColorTable : gif.globalColorTable)[index]!; if (index !== getTransparencyIndex(null)) { return { r, g, b, a: 255 }; } - return { r, g, b, a: avgAlpha ? ~~((r + g + b) / 3) : 0 }; + return { r, g, b, a: avgAlpha ? Math.trunc((r + g + b) / 3) : 0 }; }; const image = ((): ImageData | null => { @@ -254,7 +255,7 @@ async function parseImageBlock( const bytePos = pos >>> 3, bitPos = pos & 7; return ( - ((imageData[bytePos] + (imageData[bytePos + 1] << 8) + (imageData[bytePos + 2] << 16)) & + ((imageData[bytePos]! + (imageData[bytePos + 1]! << 8) + (imageData[bytePos + 2]! << 16)) & (((1 << len) - 1) << bitPos)) >>> bitPos ); @@ -262,7 +263,7 @@ async function parseImageBlock( if (interlacedFlag) { for (let code = 0, size = minCodeSize + 1, pos = 0, dic = [[0]], pass = 0; pass < 4; pass++) { - if (InterlaceOffsets[pass] < frame.height) { + if (InterlaceOffsets[pass]! < frame.height) { let pixelPos = 0, lineIndex = 0, exit = false; @@ -282,18 +283,18 @@ async function parseImageBlock( } } else { if (code >= dic.length) { - dic.push(dic[last].concat(dic[last][0])); + dic.push(dic[last]!.concat(dic[last]![0]!)); } else if (last !== clearCode) { - dic.push(dic[last].concat(dic[code][0])); + dic.push(dic[last]!.concat(dic[code]![0]!)); } - for (const item of dic[code]) { + for (const item of dic[code]!) { const { r, g, b, a } = getColor(item); image.data.set( [r, g, b, a], - InterlaceOffsets[pass] * frame.width + - InterlaceSteps[pass] * lineIndex + + InterlaceOffsets[pass]! * frame.width + + InterlaceSteps[pass]! * lineIndex + (pixelPos % (frame.width * 4)), ); @@ -308,7 +309,7 @@ async function parseImageBlock( if (pixelPos === frame.width * 4 * (lineIndex + 1)) { lineIndex++; - if (InterlaceOffsets[pass] + InterlaceSteps[pass] * lineIndex >= frame.height) { + if (InterlaceOffsets[pass]! + InterlaceSteps[pass]! * lineIndex >= frame.height) { exit = true; } } @@ -330,12 +331,11 @@ async function parseImageBlock( let code = 0, size = minCodeSize + 1, pos = 0, - pixelPos = -4, - exit = false; + pixelPos = -4; const dic = [[0]]; - while (!exit) { + for (;;) { const last = code; code = readBits(pos, size); @@ -351,20 +351,21 @@ async function parseImageBlock( } else { // ~ clear code +1 = end of information code if (code === clearCode + 1) { - exit = true; break; } if (code >= dic.length) { - dic.push(dic[last].concat(dic[last][0])); + dic.push(dic[last]!.concat(dic[last]![0]!)); } else if (last !== clearCode) { - dic.push(dic[last].concat(dic[code][0])); + dic.push(dic[last]!.concat(dic[code]![0]!)); } - for (const item of dic[code]) { + for (const item of dic[code]!) { const { r, g, b, a } = getColor(item); - image.data.set([r, g, b, a], (pixelPos += 4)); + image.data.set([r, g, b, a], pixelPos); + + pixelPos += 4; } if (dic.length >= 1 << size && size < 0xc) { @@ -433,7 +434,7 @@ export function getGIFLoopAmount(gif: GIF): number { continue; } - return extension.data[1] + (extension.data[2] << 8); + return extension.data[1]! + (extension.data[2]! << 8); } return NaN; @@ -451,7 +452,7 @@ export async function decodeGIF( progressCallback?: GIFProgressCallbackFunction, avgAlpha?: boolean, ): Promise { - if (!avgAlpha) avgAlpha = false; + avgAlpha ??= false; const res = await fetch(gifURL); @@ -534,7 +535,7 @@ export async function decodeGIF( throw new Error("GIF frame size is to large"); } - const { r, g, b } = gif.globalColorTable[backgroundColorIndex]; + const { r, g, b } = gif.globalColorTable[backgroundColorIndex]!; backgroundImage.data.set(globalColorTableFlag ? [r, g, b, 255] : [0, 0, 0, 0]); @@ -611,7 +612,7 @@ export async function decodeGIF( return gif; } catch (error) { if (error instanceof EvalError) { - throw new Error(`error while parsing frame ${frameIndex} "${error.message}"`); + throw new Error(`error while parsing frame ${frameIndex.toString()} "${error.message}"`); } throw error; @@ -642,18 +643,14 @@ export function drawGif(data: IShapeDrawData): void { offscreenContext.clearRect(origin.x, origin.y, offscreenCanvas.width, offscreenCanvas.height); - if (particle.gifLoopCount === undefined) { - particle.gifLoopCount = image.gifLoopCount ?? defaultLoopCount; - } + particle.gifLoopCount ??= image.gifLoopCount ?? defaultLoopCount; let frameIndex = particle.gifFrame ?? defaultFrame; const pos = { x: -image.gifData.width * half, y: -image.gifData.height * half }, - frame = image.gifData.frames[frameIndex]; + frame = image.gifData.frames[frameIndex]!; - if (particle.gifTime === undefined) { - particle.gifTime = initialTime; - } + particle.gifTime ??= initialTime; if (!frame.bitmap) { return; @@ -689,7 +686,7 @@ export function drawGif(data: IShapeDrawData): void { if (!image.gifData.globalColorTable.length) { offscreenContext.putImageData( - image.gifData.frames[firstIndex].image, + image.gifData.frames[firstIndex]!.image, pos.x + frame.left, pos.y + frame.top, ); @@ -755,7 +752,7 @@ export async function loadGifImage(image: IImage): Promise { try { image.gifData = await decodeGIF(image.source); - image.gifLoopCount = getGIFLoopAmount(image.gifData) ?? defaultLoopCount; + image.gifLoopCount = getGIFLoopAmount(image.gifData); if (!image.gifLoopCount) { image.gifLoopCount = Infinity; diff --git a/shapes/image/src/ImageDrawer.ts b/shapes/image/src/ImageDrawer.ts index 5bf23a09473..693e59e4ddd 100644 --- a/shapes/image/src/ImageDrawer.ts +++ b/shapes/image/src/ImageDrawer.ts @@ -1,4 +1,4 @@ -import { type Container, type IShapeDrawData, type IShapeDrawer, errorPrefix } from "@tsparticles/engine"; +import { type Container, type IShapeDrawData, type IShapeDrawer } from "@tsparticles/engine"; import { type IImage, type IParticleImage, type ImageParticle, replaceImageColor } from "./Utils.js"; import type { ImageContainer, ImageEngine } from "./types.js"; import type { IImageShape } from "./IImageShape.js"; @@ -30,9 +30,7 @@ export class ImageDrawer implements IShapeDrawer { * @param image - the image to add to the container collection */ addImage(image: IImage): void { - if (!this._engine.images) { - this._engine.images = []; - } + this._engine.images ??= []; this._engine.images.push(image); } @@ -94,9 +92,7 @@ export class ImageDrawer implements IShapeDrawer { return; } - if (!this._engine.images) { - this._engine.images = []; - } + this._engine.images ??= []; const imageData = particle.shapeData as IImageShape | undefined; @@ -123,9 +119,7 @@ export class ImageDrawer implements IShapeDrawer { return; } - if (!this._engine.images) { - this._engine.images = []; - } + this._engine.images ??= []; const images = this._engine.images, imageData = particle.shapeData as IImageShape | undefined; @@ -141,7 +135,7 @@ export class ImageDrawer implements IShapeDrawer { return; } - const replaceColor = imageData.replaceColor ?? image.replaceColor; + const replaceColor = imageData.replaceColor; if (image.loading) { setTimeout((): void => { @@ -155,7 +149,7 @@ export class ImageDrawer implements IShapeDrawer { let imageRes: IParticleImage; if (image.svgData && color) { - imageRes = await replaceImageColor(image, imageData, color, particle); + imageRes = await replaceImageColor(image, imageData, color, particle, container.hdr); } else { imageRes = { color, @@ -199,13 +193,13 @@ export class ImageDrawer implements IShapeDrawer { */ private readonly loadImageShape = async (imageShape: IImageShape): Promise => { if (!this._engine.loadImage) { - throw new Error(`${errorPrefix} image shape not initialized`); + throw new Error(`Image shape not initialized`); } await this._engine.loadImage({ gif: imageShape.gif, name: imageShape.name, - replaceColor: imageShape.replaceColor ?? false, + replaceColor: imageShape.replaceColor, src: imageShape.src, }); }; diff --git a/shapes/image/src/ImagePreloader.ts b/shapes/image/src/ImagePreloader.ts index d1238da8954..cb8a74c3085 100644 --- a/shapes/image/src/ImagePreloader.ts +++ b/shapes/image/src/ImagePreloader.ts @@ -1,16 +1,12 @@ -import type { Engine, IContainerPlugin, IPlugin, RecursivePartial } from "@tsparticles/engine"; +import type { IContainerPlugin, IPlugin, RecursivePartial } from "@tsparticles/engine"; import type { IPreloadOptions, PreloadOptions } from "./types.js"; import { Preload } from "./Options/Classes/Preload.js"; export class ImagePreloaderPlugin implements IPlugin { readonly id; - private readonly _engine; - - constructor(engine: Engine) { + constructor() { this.id = "imagePreloader"; - - this._engine = engine; } async getPlugin(): Promise { @@ -24,9 +20,7 @@ export class ImagePreloaderPlugin implements IPlugin { return; } - if (!options.preload) { - options.preload = []; - } + options.preload ??= []; const preloadOptions = options.preload; diff --git a/shapes/image/src/Options/Classes/Preload.ts b/shapes/image/src/Options/Classes/Preload.ts index 9d39b06b93b..384ae883f57 100644 --- a/shapes/image/src/Options/Classes/Preload.ts +++ b/shapes/image/src/Options/Classes/Preload.ts @@ -4,8 +4,8 @@ import type { IPreload } from "../Interfaces/IPreload.js"; export class Preload implements IPreload, IOptionLoader { gif: boolean; height?: number; - name?: string | undefined; - replaceColor?: boolean | undefined; + name?: string; + replaceColor?: boolean; src: string; width?: number; diff --git a/shapes/image/src/Utils.ts b/shapes/image/src/Utils.ts index 0e59baf2bc4..36f655f666f 100644 --- a/shapes/image/src/Utils.ts +++ b/shapes/image/src/Utils.ts @@ -1,4 +1,4 @@ -import { type IHsl, type Particle, errorPrefix, getLogger, getStyleFromHsl } from "@tsparticles/engine"; +import { type IHsl, type Particle, getLogger, getStyleFromHsl } from "@tsparticles/engine"; import type { GIF } from "./GifUtils/Types/GIF.js"; import type { IImageShape } from "./IImageShape.js"; @@ -61,16 +61,17 @@ const currentColorRegex = * @param imageShape - the image used for replacing SVG data * @param color - the replace color value * @param opacity - the color opacity + * @param hdr - * @returns the new SVG data */ -function replaceColorSvg(imageShape: IImage, color: IHsl, opacity: number): string { +function replaceColorSvg(imageShape: IImage, color: IHsl, opacity: number, hdr = false): string { const { svgData } = imageShape; if (!svgData) { return ""; } - const colorStyle = getStyleFromHsl(color, opacity); + const colorStyle = getStyleFromHsl(color, hdr, opacity); /* set color to svg element */ if (svgData.includes("fill")) { @@ -105,7 +106,7 @@ export async function loadImage(image: IImage): Promise { image.error = true; image.loading = false; - getLogger().error(`${errorPrefix} loading image: ${image.source}`); + getLogger().error(`Error loading image: ${image.source}`); resolve(); }); @@ -130,7 +131,7 @@ export async function downloadSvgImage(image: IImage): Promise { const response = await fetch(image.source); if (!response.ok) { - getLogger().error(`${errorPrefix} Image not found`); + getLogger().error("Image not found"); image.error = true; } else { @@ -146,6 +147,7 @@ export async function downloadSvgImage(image: IImage): Promise { * @param imageData - the image shape data * @param color - the replacement color * @param particle - the particle where the replaced data is going to be used + * @param hdr - * @returns the image with the color replaced */ export function replaceImageColor( @@ -153,8 +155,9 @@ export function replaceImageColor( imageData: IImageShape, color: IHsl, particle: Particle, + hdr = false, ): Promise { - const svgColoredData = replaceColorSvg(image, color, particle.opacity?.value ?? defaultOpacity), + const svgColoredData = replaceColorSvg(image, color, particle.opacity?.value ?? defaultOpacity, hdr), imageRes: IParticleImage = { color, gif: imageData.gif, @@ -169,9 +172,8 @@ export function replaceImageColor( }; return new Promise(resolve => { - const svg = new Blob([svgColoredData], { type: "image/svg+xml" }), // prepare to create img with colored svg - domUrl = URL || window.URL || window.webkitURL || window, - url = domUrl.createObjectURL(svg), + const svg = new Blob([svgColoredData], { type: "image/svg+xml" }), // prepare to create img with colored svg, + url = URL.createObjectURL(svg), img = new Image(); img.addEventListener("load", () => { @@ -180,11 +182,11 @@ export function replaceImageColor( resolve(imageRes); - domUrl.revokeObjectURL(url); + URL.revokeObjectURL(url); }); const errorHandler = async (): Promise => { - domUrl.revokeObjectURL(url); + URL.revokeObjectURL(url); const img2 = { ...image, diff --git a/shapes/image/src/index.ts b/shapes/image/src/index.ts index 970b768e580..d8d57777e8d 100644 --- a/shapes/image/src/index.ts +++ b/shapes/image/src/index.ts @@ -1,10 +1,6 @@ -import { type IImage, downloadSvgImage, loadImage } from "./Utils.js"; +import type { IImage } from "./Utils.js"; import type { IPreload } from "./Options/Interfaces/IPreload.js"; -import { ImageDrawer } from "./ImageDrawer.js"; import type { ImageEngine } from "./types.js"; -import { ImagePreloaderPlugin } from "./ImagePreloader.js"; -import { errorPrefix } from "@tsparticles/engine"; -import { loadGifImage } from "./GifUtils/Utils.js"; declare const __VERSION__: string; @@ -21,20 +17,18 @@ function addLoadImageToEngine(engine: ImageEngine): void { engine.loadImage = async (data: IPreload): Promise => { if (!data.name && !data.src) { - throw new Error(`${errorPrefix} no image source provided`); + throw new Error("No image source provided"); } - if (!engine.images) { - engine.images = []; - } + engine.images ??= []; - if (engine.images.find((t: IImage) => t.name === data.name || t.source === data.src)) { + if (engine.images.some((t: IImage) => t.name === data.name || t.source === data.src)) { return; } try { const image: IImage = { - gif: data.gif ?? false, + gif: data.gif, name: data.name ?? data.src, source: data.src, type: data.src.substring(data.src.length - extLength), @@ -49,14 +43,22 @@ function addLoadImageToEngine(engine: ImageEngine): void { let imageFunc: (image: IImage) => Promise; if (data.gif) { + const { loadGifImage } = await import("./GifUtils/Utils.js"); + imageFunc = loadGifImage; + } else if (data.replaceColor) { + const { downloadSvgImage } = await import("./Utils.js"); + + imageFunc = downloadSvgImage; } else { - imageFunc = data.replaceColor ? downloadSvgImage : loadImage; + const { loadImage } = await import("./Utils.js"); + + imageFunc = loadImage; } await imageFunc(image); } catch { - throw new Error(`${errorPrefix} ${data.name ?? data.src} not found`); + throw new Error(`${data.name ?? data.src} not found`); } }; } @@ -64,15 +66,19 @@ function addLoadImageToEngine(engine: ImageEngine): void { /** * Loads the image shape in the given engine * @param engine - the engine where the image shape is going to be added - * @param refresh - */ -export async function loadImageShape(engine: ImageEngine, refresh = true): Promise { +export function loadImageShape(engine: ImageEngine): void { engine.checkVersion(__VERSION__); - addLoadImageToEngine(engine); + engine.register(async e => { + const { ImageDrawer } = await import("./ImageDrawer.js"), + { ImagePreloaderPlugin } = await import("./ImagePreloader.js"); + + addLoadImageToEngine(e); - const preloader = new ImagePreloaderPlugin(engine); + const preloader = new ImagePreloaderPlugin(); - await engine.addPlugin(preloader, refresh); - await engine.addShape(new ImageDrawer(engine), refresh); + e.addPlugin(preloader); + e.addShape(new ImageDrawer(e)); + }); } diff --git a/shapes/image/webpack.config.js b/shapes/image/webpack.config.js index f8429861331..be154fe4a21 100644 --- a/shapes/image/webpack.config.js +++ b/shapes/image/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "image", shapeName: "Image", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "image", shapeName: "Image", version, dir: __dirname }); diff --git a/shapes/infinity/.eslintignore b/shapes/infinity/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/infinity/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/infinity/.eslintrc.js b/shapes/infinity/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/infinity/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/infinity/CHANGELOG.md b/shapes/infinity/CHANGELOG.md index 5b14b9bc515..c39b82b9176 100644 --- a/shapes/infinity/CHANGELOG.md +++ b/shapes/infinity/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-infinity + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-infinity diff --git a/shapes/infinity/eslint.config.js b/shapes/infinity/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/infinity/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/infinity/package.dist.json b/shapes/infinity/package.dist.json index effaeba37ed..bbe65c6a304 100644 --- a/shapes/infinity/package.dist.json +++ b/shapes/infinity/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-infinity", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles infinity shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/infinity/package.json b/shapes/infinity/package.json index 8099234e27d..6224204e4bc 100644 --- a/shapes/infinity/package.json +++ b/shapes/infinity/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-infinity", - "version": "3.9.1", - "description": "tsParticles infinity shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-infinity", + "version": "4.0.0-alpha.0", + "description": "tsParticles infinity shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/infinity" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/infinity" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/infinity/src/Utils.ts b/shapes/infinity/src/Utils.ts index 446f2250505..4ff4849b5ac 100644 --- a/shapes/infinity/src/Utils.ts +++ b/shapes/infinity/src/Utils.ts @@ -1,10 +1,6 @@ -import type { ICoordinates, IShapeDrawData } from "@tsparticles/engine"; +import { type IShapeDrawData, originPoint } from "@tsparticles/engine"; -const origin: ICoordinates = { - x: 0, - y: 0, - }, - loopSizeFactor = 0.55; +const loopSizeFactor = 0.55; /** * @param data - @@ -13,8 +9,8 @@ export function drawInfinity(data: IShapeDrawData): void { const { context, radius } = data, loopControl = radius * loopSizeFactor; - context.moveTo(origin.x, origin.y); - context.bezierCurveTo(loopControl, -radius, loopControl, radius, origin.x, origin.y); - context.moveTo(origin.x, origin.y); - context.bezierCurveTo(-loopControl, -radius, origin.x - loopControl, radius, origin.x, origin.y); + context.moveTo(originPoint.x, originPoint.y); + context.bezierCurveTo(loopControl, -radius, loopControl, radius, originPoint.x, originPoint.y); + context.moveTo(originPoint.x, originPoint.y); + context.bezierCurveTo(-loopControl, -radius, originPoint.x - loopControl, radius, originPoint.x, originPoint.y); } diff --git a/shapes/infinity/src/index.ts b/shapes/infinity/src/index.ts index b8819474a07..63d66be1b65 100644 --- a/shapes/infinity/src/index.ts +++ b/shapes/infinity/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { InfinityDrawer } from "./InfinityDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadInfinityShape(engine: Engine, refresh = true): Promise { +export function loadInfinityShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new InfinityDrawer(), refresh); + engine.register(async e => { + const { InfinityDrawer } = await import("./InfinityDrawer.js"); + + e.addShape(new InfinityDrawer()); + }); } diff --git a/shapes/infinity/webpack.config.js b/shapes/infinity/webpack.config.js index f93549fe802..eb18abcc9e7 100644 --- a/shapes/infinity/webpack.config.js +++ b/shapes/infinity/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "infinity", shapeName: "Infinity", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "infinity", shapeName: "Infinity", version, dir: __dirname }); diff --git a/shapes/line/.eslintignore b/shapes/line/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/line/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/line/.eslintrc.js b/shapes/line/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/line/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/line/CHANGELOG.md b/shapes/line/CHANGELOG.md index 385a3595c5c..688cc8e9ef0 100644 --- a/shapes/line/CHANGELOG.md +++ b/shapes/line/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-line + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-line diff --git a/shapes/line/eslint.config.js b/shapes/line/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/line/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/line/package.dist.json b/shapes/line/package.dist.json index c199a09c5e5..23f4dc7dc86 100644 --- a/shapes/line/package.dist.json +++ b/shapes/line/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-line", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles line shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/line/package.json b/shapes/line/package.json index 92514d980c8..6ffd11df5a5 100644 --- a/shapes/line/package.json +++ b/shapes/line/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-line", - "version": "3.9.1", - "description": "tsParticles line shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-line", + "version": "4.0.0-alpha.0", + "description": "tsParticles line shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/line" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/line" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - }, - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "type": "module" } diff --git a/shapes/line/src/index.ts b/shapes/line/src/index.ts index 8c6805a4ee2..1c724b6a359 100644 --- a/shapes/line/src/index.ts +++ b/shapes/line/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { LineDrawer } from "./LineDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadLineShape(engine: Engine, refresh = true): Promise { +export function loadLineShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new LineDrawer(), refresh); + engine.register(async e => { + const { LineDrawer } = await import("./LineDrawer.js"); + + e.addShape(new LineDrawer()); + }); } diff --git a/shapes/line/webpack.config.js b/shapes/line/webpack.config.js index 74e830b363e..52d1957ae1b 100644 --- a/shapes/line/webpack.config.js +++ b/shapes/line/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "line", shapeName: "Line", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "line", shapeName: "Line", version, dir: __dirname }); diff --git a/shapes/path/.eslintignore b/shapes/path/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/path/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/path/.eslintrc.js b/shapes/path/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/path/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/path/CHANGELOG.md b/shapes/path/CHANGELOG.md index dda2631ad13..4b338296f12 100644 --- a/shapes/path/CHANGELOG.md +++ b/shapes/path/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-path + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-path diff --git a/shapes/path/eslint.config.js b/shapes/path/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/path/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/path/package.dist.json b/shapes/path/package.dist.json index 23f74fe55e1..95e04eef7b3 100644 --- a/shapes/path/package.dist.json +++ b/shapes/path/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-path", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles path shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/path/package.json b/shapes/path/package.json index 955b1e8b98c..781123e0cf8 100644 --- a/shapes/path/package.json +++ b/shapes/path/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-path", - "version": "3.9.1", - "description": "tsParticles path shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-path", + "version": "4.0.0-alpha.0", + "description": "tsParticles path shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/path" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/path" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/path/src/PathDrawer.ts b/shapes/path/src/PathDrawer.ts index de4cf62d6d3..e85932ed6af 100644 --- a/shapes/path/src/PathDrawer.ts +++ b/shapes/path/src/PathDrawer.ts @@ -16,7 +16,7 @@ export class PathDrawer implements IShapeDrawer { drawPath(context, radius, particle.pathData); } - particleInit(container: Container, particle: PathParticle): void { + particleInit(_container: Container, particle: PathParticle): void { const shape = particle.shapeData as IPathData | undefined; if (!shape) { diff --git a/shapes/path/src/Utils.ts b/shapes/path/src/Utils.ts index 561a959fe02..d353d681f8c 100644 --- a/shapes/path/src/Utils.ts +++ b/shapes/path/src/Utils.ts @@ -8,8 +8,17 @@ import { SegmentType } from "./SegmentType.js"; */ export function drawPath(ctx: CanvasRenderingContext2D, radius: number, path: IPathData): void { const firstIndex = 0, - firstSegment = path.segments[firstIndex], - firstValue = firstSegment.values[firstIndex]; + firstSegment = path.segments[firstIndex]; + + if (!firstSegment) { + return; + } + + const firstValue = firstSegment.values[firstIndex]; + + if (!firstValue) { + return; + } ctx.moveTo(firstValue.x * radius, firstValue.y * radius); @@ -19,50 +28,68 @@ export function drawPath(ctx: CanvasRenderingContext2D, radius: number, path: IP index3 = 2, index4 = 3; + if (!value) { + continue; + } + + const segmentValue2 = segment.values[index2], + segmentValue3 = segment.values[index3], + segmentValue4 = segment.values[index4]; + switch (segment.type) { case SegmentType.line: ctx.lineTo(value.x * radius, value.y * radius); break; case SegmentType.bezier: + if (!segmentValue2 || !segmentValue3 || !segmentValue4) { + break; + } + ctx.bezierCurveTo( - segment.values[index2].x * radius, - segment.values[index2].y * radius, - segment.values[index3].x * radius, - segment.values[index3].y * radius, - segment.values[index4].x * radius, - segment.values[index4].y * radius, + segmentValue2.x * radius, + segmentValue2.y * radius, + segmentValue3.x * radius, + segmentValue3.y * radius, + segmentValue4.x * radius, + segmentValue4.y * radius, ); break; case SegmentType.quadratic: + if (!segmentValue2 || !segmentValue3) { + break; + } + ctx.quadraticCurveTo( - segment.values[index2].x * radius, - segment.values[index2].y * radius, - segment.values[index3].x * radius, - segment.values[index3].y * radius, + segmentValue2.x * radius, + segmentValue2.y * radius, + segmentValue3.x * radius, + segmentValue3.y * radius, ); break; case SegmentType.arc: - ctx.arc( - value.x * radius, - value.y * radius, - segment.values[index2].x * radius, - segment.values[index3].x, - segment.values[index3].y, - ); + if (!segmentValue2 || !segmentValue3) { + break; + } + + ctx.arc(value.x * radius, value.y * radius, segmentValue2.x * radius, segmentValue3.x, segmentValue3.y); break; case SegmentType.ellipse: + if (!segmentValue2 || !segmentValue3 || !segmentValue4) { + break; + } + ctx.ellipse( value.x * radius, value.y * radius, - segment.values[index2].x * radius, - segment.values[index2].y * radius, - segment.values[index3].x, - segment.values[index4].x, - segment.values[index4].y, + segmentValue2.x * radius, + segmentValue2.y * radius, + segmentValue3.x, + segmentValue4.x, + segmentValue4.y, ); } } @@ -75,34 +102,55 @@ export function drawPath(ctx: CanvasRenderingContext2D, radius: number, path: IP minLength = 0; for (let i = path.segments.length - lengthOffset; i >= minLength; i--) { - const segment = path.segments[i], - value = segment.values[firstIndex], + const segment = path.segments[i]; + + if (!segment) { + continue; + } + + const value = segment.values[firstIndex], index2 = 1, - index3 = 2; + index3 = 2, + segmentValue2 = segment.values[index2], + segmentValue3 = segment.values[index3]; switch (segment.type) { case SegmentType.line: + if (!value) { + break; + } + ctx.lineTo(value.x * -radius, value.y * radius); + break; case SegmentType.bezier: + if (!value || !segmentValue2 || !segmentValue3) { + break; + } + ctx.bezierCurveTo( - -segment.values[index3].x * radius, - segment.values[index3].y * radius, - -segment.values[index2].x * radius, - segment.values[index2].y * radius, + -segmentValue3.x * radius, + segmentValue3.y * radius, + -segmentValue2.x * radius, + segmentValue2.y * radius, value.x * radius, value.y * radius, ); break; case SegmentType.quadratic: + if (!segmentValue2 || !segmentValue3) { + break; + } + ctx.quadraticCurveTo( - -segment.values[index2].x * radius, - segment.values[index2].y * radius, - -segment.values[index3].x * radius, - segment.values[index3].y * radius, + -segmentValue2.x * radius, + segmentValue2.y * radius, + -segmentValue3.x * radius, + segmentValue3.y * radius, ); + break; case SegmentType.arc: diff --git a/shapes/path/src/index.ts b/shapes/path/src/index.ts index 799ae9ae0d8..4bf5b745c77 100644 --- a/shapes/path/src/index.ts +++ b/shapes/path/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { PathDrawer } from "./PathDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadPathShape(engine: Engine, refresh = true): Promise { +export function loadPathShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new PathDrawer(), refresh); + engine.register(async e => { + const { PathDrawer } = await import("./PathDrawer.js"); + + e.addShape(new PathDrawer()); + }); } diff --git a/shapes/path/webpack.config.js b/shapes/path/webpack.config.js index 0ab402c879c..8f261386862 100644 --- a/shapes/path/webpack.config.js +++ b/shapes/path/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "path", shapeName: "Path", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "path", shapeName: "Path", version, dir: __dirname }); diff --git a/shapes/polygon/.eslintignore b/shapes/polygon/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/polygon/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/polygon/.eslintrc.js b/shapes/polygon/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/polygon/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/polygon/CHANGELOG.md b/shapes/polygon/CHANGELOG.md index 553c81f0fbc..83f8bb015ef 100644 --- a/shapes/polygon/CHANGELOG.md +++ b/shapes/polygon/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-polygon + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-polygon diff --git a/shapes/polygon/eslint.config.js b/shapes/polygon/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/polygon/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/polygon/package.dist.json b/shapes/polygon/package.dist.json index d783c8dbf42..9cfe427c3c8 100644 --- a/shapes/polygon/package.dist.json +++ b/shapes/polygon/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-polygon", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles polygon shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/polygon/package.json b/shapes/polygon/package.json index f7e394b0bf2..d2648c967fe 100644 --- a/shapes/polygon/package.json +++ b/shapes/polygon/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-polygon", - "version": "3.9.1", - "description": "tsParticles polygon shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-polygon", + "version": "4.0.0-alpha.0", + "description": "tsParticles polygon shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/polygon" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/polygon" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/polygon/src/TriangleDrawer.ts b/shapes/polygon/src/TriangleDrawer.ts index b8a22797a4e..21980468af7 100644 --- a/shapes/polygon/src/TriangleDrawer.ts +++ b/shapes/polygon/src/TriangleDrawer.ts @@ -11,18 +11,18 @@ const yFactor = 1.66, export class TriangleDrawer extends PolygonDrawerBase { readonly validTypes = ["triangle"] as const; - getCenter(particle: Particle, radius: number): ICoordinates { + getCenter(_particle: Particle, radius: number): ICoordinates { return { x: -radius, y: radius / yFactor, }; } - getSidesCount(): number { + override getSidesCount(): number { return sides; } - getSidesData(particle: Particle, radius: number): ISide { + getSidesData(_particle: Particle, radius: number): ISide { const diameter = radius * double; return { diff --git a/shapes/polygon/src/Utils.ts b/shapes/polygon/src/Utils.ts index 5c72508b212..c6b52cc9985 100644 --- a/shapes/polygon/src/Utils.ts +++ b/shapes/polygon/src/Utils.ts @@ -18,10 +18,6 @@ export function drawPolygon(data: IShapeDrawData, start: ICoordinates, side: ISi interiorAngleDegrees = (piDeg * (decimalSides - sidesOffset)) / decimalSides, interiorAngle = Math.PI - degToRad(interiorAngleDegrees); // convert to radians - if (!context) { - return; - } - context.beginPath(); context.translate(start.x, start.y); context.moveTo(origin.x, origin.y); diff --git a/shapes/polygon/src/index.ts b/shapes/polygon/src/index.ts index 30933811f14..d193e671ef3 100644 --- a/shapes/polygon/src/index.ts +++ b/shapes/polygon/src/index.ts @@ -1,36 +1,41 @@ import { type Engine } from "@tsparticles/engine"; -import { PolygonDrawer } from "./PolygonDrawer.js"; -import { TriangleDrawer } from "./TriangleDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadGenericPolygonShape(engine: Engine, refresh = true): Promise { +export function loadGenericPolygonShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new PolygonDrawer(), refresh); + engine.register(async e => { + const { PolygonDrawer } = await import("./PolygonDrawer.js"); + + e.addShape(new PolygonDrawer()); + }); } /** * @param engine - - * @param refresh - */ -export async function loadTriangleShape(engine: Engine, refresh = true): Promise { +export function loadTriangleShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new TriangleDrawer(), refresh); + engine.register(async e => { + const { TriangleDrawer } = await import("./TriangleDrawer.js"); + + e.addShape(new TriangleDrawer()); + }); } /** * @param engine - - * @param refresh - */ -export async function loadPolygonShape(engine: Engine, refresh = true): Promise { +export function loadPolygonShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await loadGenericPolygonShape(engine, refresh); - await loadTriangleShape(engine, refresh); + engine.register(e => { + loadGenericPolygonShape(e); + loadTriangleShape(e); + }); } diff --git a/shapes/polygon/webpack.config.js b/shapes/polygon/webpack.config.js index df325042afa..a2b14775666 100644 --- a/shapes/polygon/webpack.config.js +++ b/shapes/polygon/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "polygon", shapeName: "Polygon", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "polygon", shapeName: "Polygon", version, dir: __dirname }); diff --git a/shapes/rounded-polygon/.eslintignore b/shapes/rounded-polygon/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/rounded-polygon/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/rounded-polygon/.eslintrc.js b/shapes/rounded-polygon/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/rounded-polygon/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/rounded-polygon/CHANGELOG.md b/shapes/rounded-polygon/CHANGELOG.md index 2fa4d2f3adf..e35e52f7603 100644 --- a/shapes/rounded-polygon/CHANGELOG.md +++ b/shapes/rounded-polygon/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-rounded-polygon + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-rounded-polygon diff --git a/shapes/rounded-polygon/eslint.config.js b/shapes/rounded-polygon/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/rounded-polygon/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/rounded-polygon/package.dist.json b/shapes/rounded-polygon/package.dist.json index 9385d88692f..a8c10b14c0d 100644 --- a/shapes/rounded-polygon/package.dist.json +++ b/shapes/rounded-polygon/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-rounded-polygon", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles rounded polygon shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/rounded-polygon/package.json b/shapes/rounded-polygon/package.json index 9cf045506aa..c86fa27b8ef 100644 --- a/shapes/rounded-polygon/package.json +++ b/shapes/rounded-polygon/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-rounded-polygon", - "version": "3.9.1", - "description": "tsParticles rounded polygon shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-rounded-polygon", + "version": "4.0.0-alpha.0", + "description": "tsParticles rounded polygon shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/rounded-polygon" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/rounded-polygon" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/rounded-polygon/src/Utils.ts b/shapes/rounded-polygon/src/Utils.ts index eed33add3fa..f465e2ee182 100644 --- a/shapes/rounded-polygon/src/Utils.ts +++ b/shapes/rounded-polygon/src/Utils.ts @@ -35,6 +35,10 @@ export function roundedPath(context: CanvasRenderingContext2D, path: ICoordinate let p1 = path[index1], p2 = path[index2]; + if (!p1 || !p2) { + return; + } + const len = path.length; context.moveTo((p1.x + p2.x) * half, (p1.y + p2.y) * half); @@ -43,6 +47,10 @@ export function roundedPath(context: CanvasRenderingContext2D, path: ICoordinate p1 = p2; p2 = path[(i + increment) % len]; + if (!p1 || !p2) { + continue; + } + context.arcTo(p1.x, p1.y, (p1.x + p2.x) * half, (p1.y + p2.y) * half, radius); } } diff --git a/shapes/rounded-polygon/src/index.ts b/shapes/rounded-polygon/src/index.ts index e6d1210d0fc..759c0076683 100644 --- a/shapes/rounded-polygon/src/index.ts +++ b/shapes/rounded-polygon/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { RoundedPolygonDrawer } from "./RoundedPolygonDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadRoundedPolygonShape(engine: Engine, refresh = true): Promise { +export function loadRoundedPolygonShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new RoundedPolygonDrawer(), refresh); + engine.register(async e => { + const { RoundedPolygonDrawer } = await import("./RoundedPolygonDrawer.js"); + + e.addShape(new RoundedPolygonDrawer()); + }); } diff --git a/shapes/rounded-polygon/webpack.config.js b/shapes/rounded-polygon/webpack.config.js index f7061004d11..bb79391a982 100644 --- a/shapes/rounded-polygon/webpack.config.js +++ b/shapes/rounded-polygon/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "rounded-polygon", shapeName: "RoundedPolygon", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "rounded-polygon", shapeName: "RoundedPolygon", version, dir: __dirname }); diff --git a/shapes/rounded-rect/.eslintignore b/shapes/rounded-rect/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/rounded-rect/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/rounded-rect/.eslintrc.js b/shapes/rounded-rect/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/rounded-rect/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/rounded-rect/CHANGELOG.md b/shapes/rounded-rect/CHANGELOG.md index 00649449004..6b73842955d 100644 --- a/shapes/rounded-rect/CHANGELOG.md +++ b/shapes/rounded-rect/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-rounded-rect + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-rounded-rect diff --git a/shapes/rounded-rect/eslint.config.js b/shapes/rounded-rect/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/rounded-rect/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/rounded-rect/package.dist.json b/shapes/rounded-rect/package.dist.json index 0abb28dd6e4..c4ac6a30f44 100644 --- a/shapes/rounded-rect/package.dist.json +++ b/shapes/rounded-rect/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-rounded-rect", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles rounded rect shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/rounded-rect/package.json b/shapes/rounded-rect/package.json index c67f74db7a0..6ded3b577dd 100644 --- a/shapes/rounded-rect/package.json +++ b/shapes/rounded-rect/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-rounded-rect", - "version": "3.9.1", - "description": "tsParticles rounded rect shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-rounded-rect", + "version": "4.0.0-alpha.0", + "description": "tsParticles rounded rect shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/rounded-rect" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/rounded-rect" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/rounded-rect/src/index.ts b/shapes/rounded-rect/src/index.ts index 4a87898df99..6af9ff5d130 100644 --- a/shapes/rounded-rect/src/index.ts +++ b/shapes/rounded-rect/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { RoundedRectDrawer } from "./RoundedRectDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadRoundedRectShape(engine: Engine, refresh = true): Promise { +export function loadRoundedRectShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new RoundedRectDrawer(), refresh); + engine.register(async e => { + const { RoundedRectDrawer } = await import("./RoundedRectDrawer.js"); + + e.addShape(new RoundedRectDrawer()); + }); } diff --git a/shapes/rounded-rect/webpack.config.js b/shapes/rounded-rect/webpack.config.js index cbfe2bd0bec..d66da4b8842 100644 --- a/shapes/rounded-rect/webpack.config.js +++ b/shapes/rounded-rect/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "rounded-rect", shapeName: "Rounded Rect", version, diff --git a/shapes/spiral/.eslintignore b/shapes/spiral/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/spiral/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/spiral/.eslintrc.js b/shapes/spiral/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/spiral/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/spiral/CHANGELOG.md b/shapes/spiral/CHANGELOG.md index 8dd99119bd2..85a5be6cef8 100644 --- a/shapes/spiral/CHANGELOG.md +++ b/shapes/spiral/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-spiral + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-spiral diff --git a/shapes/spiral/eslint.config.js b/shapes/spiral/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/spiral/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/spiral/package.dist.json b/shapes/spiral/package.dist.json index e5a0b7b236d..cd2a2014ac4 100644 --- a/shapes/spiral/package.dist.json +++ b/shapes/spiral/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-spiral", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles spiral shape", "homepage": "https://particles.js.org", "repository": { @@ -100,9 +100,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/spiral/package.json b/shapes/spiral/package.json index d2bda0c910b..5b5fdcb72a1 100644 --- a/shapes/spiral/package.json +++ b/shapes/spiral/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/shape-spiral", - "version": "3.9.1", - "description": "tsParticles spiral shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-spiral", + "version": "4.0.0-alpha.0", + "description": "tsParticles spiral shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/spiral" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/spiral" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/spiral/src/index.ts b/shapes/spiral/src/index.ts index e15223ef2cf..a0f751e55ec 100644 --- a/shapes/spiral/src/index.ts +++ b/shapes/spiral/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { SpiralDrawer } from "./SpiralDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadSpiralShape(engine: Engine, refresh = true): Promise { +export function loadSpiralShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new SpiralDrawer(), refresh); + engine.register(async e => { + const { SpiralDrawer } = await import("./SpiralDrawer.js"); + + e.addShape(new SpiralDrawer()); + }); } diff --git a/shapes/spiral/webpack.config.js b/shapes/spiral/webpack.config.js index 8077463405c..a1f7a9dbcca 100644 --- a/shapes/spiral/webpack.config.js +++ b/shapes/spiral/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "spiral", shapeName: "Spiral", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "spiral", shapeName: "Spiral", version, dir: __dirname }); diff --git a/shapes/square/.eslintignore b/shapes/square/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/square/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/square/.eslintrc.js b/shapes/square/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/square/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/square/CHANGELOG.md b/shapes/square/CHANGELOG.md index 3b92c806fd7..9cf79c61ce5 100644 --- a/shapes/square/CHANGELOG.md +++ b/shapes/square/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-square + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-square diff --git a/shapes/square/eslint.config.js b/shapes/square/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/square/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/square/package.dist.json b/shapes/square/package.dist.json index 6be0c03fe75..0c9cb5b29cb 100644 --- a/shapes/square/package.dist.json +++ b/shapes/square/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-square", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles square shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/square/package.json b/shapes/square/package.json index 2b84bffd1b2..7013bfe8751 100644 --- a/shapes/square/package.json +++ b/shapes/square/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-square", - "version": "3.9.1", - "description": "tsParticles square shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-square", + "version": "4.0.0-alpha.0", + "description": "tsParticles square shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/square" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/square" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - }, - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "type": "module" } diff --git a/shapes/square/src/index.ts b/shapes/square/src/index.ts index 1c4567526af..85f00e21647 100644 --- a/shapes/square/src/index.ts +++ b/shapes/square/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { SquareDrawer } from "./SquareDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadSquareShape(engine: Engine, refresh = true): Promise { +export function loadSquareShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new SquareDrawer(), refresh); + engine.register(async e => { + const { SquareDrawer } = await import("./SquareDrawer.js"); + + e.addShape(new SquareDrawer()); + }); } diff --git a/shapes/square/webpack.config.js b/shapes/square/webpack.config.js index 56f242a1a97..00ef3cf567f 100644 --- a/shapes/square/webpack.config.js +++ b/shapes/square/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "square", shapeName: "Square", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "square", shapeName: "Square", version, dir: __dirname }); diff --git a/shapes/star/.eslintignore b/shapes/star/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/star/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/star/.eslintrc.js b/shapes/star/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/star/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/star/CHANGELOG.md b/shapes/star/CHANGELOG.md index ccfc2cc859c..73892d75b11 100644 --- a/shapes/star/CHANGELOG.md +++ b/shapes/star/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/shape-star + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-star diff --git a/shapes/star/eslint.config.js b/shapes/star/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/star/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/star/package.dist.json b/shapes/star/package.dist.json index ca063e45528..f96dc7ec1d3 100644 --- a/shapes/star/package.dist.json +++ b/shapes/star/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-star", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles star shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/star/package.json b/shapes/star/package.json index ffafa507d3b..db60a248a46 100644 --- a/shapes/star/package.json +++ b/shapes/star/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-star", - "version": "3.9.1", - "description": "tsParticles star shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-star", + "version": "4.0.0-alpha.0", + "description": "tsParticles star shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/star" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/star" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/star/src/StarDrawer.ts b/shapes/star/src/StarDrawer.ts index 518ad2622b4..eddc8d179b3 100644 --- a/shapes/star/src/StarDrawer.ts +++ b/shapes/star/src/StarDrawer.ts @@ -27,7 +27,7 @@ export class StarDrawer implements IShapeDrawer { return Math.round(getRangeValue(star?.sides ?? defaultSides)); } - particleInit(container: Container, particle: StarParticle): void { + particleInit(_container: Container, particle: StarParticle): void { const star = particle.shapeData as IStarShape | undefined; particle.starInset = getRangeValue(star?.inset ?? defaultInset); diff --git a/shapes/star/src/index.ts b/shapes/star/src/index.ts index 20c40f325cf..7a50f527ce0 100644 --- a/shapes/star/src/index.ts +++ b/shapes/star/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { StarDrawer } from "./StarDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadStarShape(engine: Engine, refresh = true): Promise { +export function loadStarShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new StarDrawer(), refresh); + engine.register(async e => { + const { StarDrawer } = await import("./StarDrawer.js"); + + e.addShape(new StarDrawer()); + }); } diff --git a/shapes/star/webpack.config.js b/shapes/star/webpack.config.js index deca9f846b0..aa6a1ac97f6 100644 --- a/shapes/star/webpack.config.js +++ b/shapes/star/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "star", shapeName: "Star", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "star", shapeName: "Star", version, dir: __dirname }); diff --git a/shapes/text/.eslintignore b/shapes/text/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/shapes/text/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/shapes/text/.eslintrc.js b/shapes/text/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/shapes/text/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/shapes/text/CHANGELOG.md b/shapes/text/CHANGELOG.md index 12232901b0c..f2d4bb949e8 100644 --- a/shapes/text/CHANGELOG.md +++ b/shapes/text/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Bug Fixes + +- fixed issue [#5539](https://github.com/tsparticles/tsparticles/issues/5539), now shapes know when a fill function or a stroke function is needed ([cb616d3](https://github.com/tsparticles/tsparticles/commit/cb616d3d489ba65304d1f1b657d556807674567a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/shape-text diff --git a/shapes/text/eslint.config.js b/shapes/text/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/shapes/text/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/shapes/text/package.dist.json b/shapes/text/package.dist.json index 09bca2de116..c5cc4e0ab2b 100644 --- a/shapes/text/package.dist.json +++ b/shapes/text/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/shape-text", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles text shape", "homepage": "https://particles.js.org", "repository": { @@ -59,9 +59,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/shapes/text/package.json b/shapes/text/package.json index 912f0bd8bff..a9018c98936 100644 --- a/shapes/text/package.json +++ b/shapes/text/package.json @@ -1,77 +1,78 @@ { - "name": "@tsparticles/shape-text", - "version": "3.9.1", - "description": "tsParticles text shape", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/shape-text", + "version": "4.0.0-alpha.0", + "description": "tsParticles text shape", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "shapes/text" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles.js", + "particles-ts", + "particles.ts", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "tsparticles-shape" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "shapes/text" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles.js", - "particles-ts", - "particles.ts", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "tsparticles-shape" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/shapes/text/src/TextDrawer.ts b/shapes/text/src/TextDrawer.ts index e4c0227b7fd..934f3e73fb4 100644 --- a/shapes/text/src/TextDrawer.ts +++ b/shapes/text/src/TextDrawer.ts @@ -12,6 +12,8 @@ import type { ITextShape } from "./ITextShape.js"; import type { TextParticle } from "./TextParticle.js"; import { drawText } from "./Utils.js"; +const firstItem = 0; + /** * Multiline text drawer */ @@ -27,9 +29,9 @@ export class TextDrawer implements IShapeDrawer { { validTypes } = this; if (validTypes.find(t => isInArray(t, options.particles.shape.type))) { - const shapeOptions = validTypes - .map(t => options.particles.shape.options[t]) - .find(t => !!t) as SingleOrMultiple, + const shapeOptions = validTypes.map(t => options.particles.shape.options[t])[ + firstItem + ] as SingleOrMultiple, promises: Promise[] = []; executeOnSingleOrMultiple(shapeOptions, shape => { @@ -42,10 +44,10 @@ export class TextDrawer implements IShapeDrawer { /** * Loads the text shape to the given particle - * @param container - the particles container + * @param _container - the particles container * @param particle - the particle loading the text shape */ - particleInit(container: Container, particle: TextParticle): void { + particleInit(_container: Container, particle: TextParticle): void { if (!particle.shape || !(this.validTypes as unknown as string[]).includes(particle.shape)) { return; } @@ -58,10 +60,6 @@ export class TextDrawer implements IShapeDrawer { const textData = character.value; - if (textData === undefined) { - return; - } - particle.text = itemFromSingleOrMultiple(textData, particle.randomIndexData); } } diff --git a/shapes/text/src/Utils.ts b/shapes/text/src/Utils.ts index b34578fcc93..1ef591d0c63 100644 --- a/shapes/text/src/Utils.ts +++ b/shapes/text/src/Utils.ts @@ -10,7 +10,7 @@ const double = 2, * @param data - */ export function drawText(data: IShapeDrawData): void { - const { context, particle, radius, opacity } = data, + const { context, particle, fill, stroke, radius, opacity } = data, character = particle.shapeData as ITextShape | undefined; if (!character) { @@ -19,54 +19,50 @@ export function drawText(data: IShapeDrawData): void { const textData = character.value; - if (textData === undefined) { - return; - } - - if (particle.text === undefined) { - particle.text = itemFromSingleOrMultiple(textData, particle.randomIndexData); - } + particle.text ??= itemFromSingleOrMultiple(textData, particle.randomIndexData); const text = particle.text, - style = character.style ?? "", - weight = character.weight ?? "400", + style = character.style, + weight = character.weight, size = Math.round(radius) * double, - font = character.font ?? "Verdana", - fill = particle.shapeFill; - - const lines = text?.split("\n"); + font = character.font; - if (!lines) { - return; - } + const lines = text?.split("\n") ?? []; - context.font = `${style} ${weight} ${size}px "${font}"`; + context.font = `${style} ${weight} ${size.toString()}px "${font}"`; context.globalAlpha = opacity; for (let i = 0; i < lines.length; i++) { - drawLine(context, lines[i], radius, opacity, i, fill); + const currentLine = lines[i]; + + if (!currentLine) { + continue; + } + + drawLine(context, currentLine, radius, opacity, i, fill, stroke); } context.globalAlpha = 1; } /** - * * @param context - * @param line - * @param radius - - * @param opacity - + * @param _opacity - * @param index - * @param fill - + * @param stroke - */ function drawLine( context: CanvasRenderingContext2D, line: string, radius: number, - opacity: number, + _opacity: number, index: number, fill: boolean, + stroke: boolean, ): void { const offsetX = line.length * radius * half, pos = { @@ -77,7 +73,9 @@ function drawLine( if (fill) { context.fillText(line, pos.x, pos.y + diameter * index); - } else { + } + + if (stroke) { context.strokeText(line, pos.x, pos.y + diameter * index); } } diff --git a/shapes/text/src/index.ts b/shapes/text/src/index.ts index a0d01ee9df2..050d0332d1a 100644 --- a/shapes/text/src/index.ts +++ b/shapes/text/src/index.ts @@ -1,14 +1,16 @@ import { type Engine } from "@tsparticles/engine"; -import { TextDrawer } from "./TextDrawer.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadTextShape(engine: Engine, refresh = true): Promise { +export function loadTextShape(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addShape(new TextDrawer(), refresh); + engine.register(async e => { + const { TextDrawer } = await import("./TextDrawer.js"); + + e.addShape(new TextDrawer()); + }); } diff --git a/shapes/text/webpack.config.js b/shapes/text/webpack.config.js index 4f357593743..c16b0059764 100644 --- a/shapes/text/webpack.config.js +++ b/shapes/text/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesShape } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesShape } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesShape({ moduleName: "text", shapeName: "Text", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesShape({ moduleName: "text", shapeName: "Text", version, dir: __dirname }); diff --git a/typedoc.json b/typedoc.json index f44b680e78f..c607bfe4971 100644 --- a/typedoc.json +++ b/typedoc.json @@ -32,19 +32,18 @@ "paths/simplexNoise", "paths/svg", "plugins/absorbers", + "plugins/backgroundMask", "plugins/canvasMask", - "plugins/emitters", - "plugins/emittersShapes/canvas", - "plugins/emittersShapes/circle", - "plugins/emittersShapes/path", - "plugins/emittersShapes/polygon", - "plugins/emittersShapes/square", - "plugins/hsvColor", - "plugins/infection", - "plugins/motion", - "plugins/oklchColor", - "plugins/polygonMask", - "plugins/sounds", + "plugins/colors/hex", + "plugins/colors/hsl", + "plugins/colors/hsv", + "plugins/colors/hwb", + "plugins/colors/lab", + "plugins/colors/lch", + "plugins/colors/named", + "plugins/colors/oklab", + "plugins/colors/oklch", + "plugins/colors/rgb", "plugins/easings/back", "plugins/easings/circ", "plugins/easings/cubic", @@ -53,8 +52,20 @@ "plugins/easings/quart", "plugins/easings/quint", "plugins/easings/sine", + "plugins/emitters", + "plugins/emittersShapes/canvas", + "plugins/emittersShapes/circle", + "plugins/emittersShapes/path", + "plugins/emittersShapes/polygon", + "plugins/emittersShapes/square", "plugins/exports/image", "plugins/exports/json", + "plugins/exports/video", + "plugins/infection", + "plugins/motion", + "plugins/polygonMask", + "plugins/sounds", + "plugins/trail", "shapes/arrow", "shapes/cards", "shapes/circle", @@ -84,7 +95,9 @@ "updaters/tilt", "updaters/twinkle", "updaters/wobble", - "effects/bubble" + "effects/bubble", + "effects/shadow", + "effects/trail" ], "entryPointStrategy": "packages", "name": "tsParticles", diff --git a/updaters/color/.eslintignore b/updaters/color/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/color/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/color/.eslintrc.js b/updaters/color/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/color/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/color/CHANGELOG.md b/updaters/color/CHANGELOG.md index 3be5e6c9cb2..34349e8b4ca 100644 --- a/updaters/color/CHANGELOG.md +++ b/updaters/color/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-color + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-color diff --git a/updaters/color/eslint.config.js b/updaters/color/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/color/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/color/package.dist.json b/updaters/color/package.dist.json index 220fa3ed081..20831afaf4e 100644 --- a/updaters/color/package.dist.json +++ b/updaters/color/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles color updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/color/package.json b/updaters/color/package.json index a0379f8d331..2086678a529 100644 --- a/updaters/color/package.json +++ b/updaters/color/package.json @@ -1,102 +1,103 @@ { - "name": "@tsparticles/updater-color", - "version": "3.9.1", - "description": "tsParticles particles color updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles color updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/color" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/color" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - }, - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "type": "module" } diff --git a/updaters/color/src/ColorUpdater.ts b/updaters/color/src/ColorUpdater.ts index 19565636404..77be8cf7e1b 100644 --- a/updaters/color/src/ColorUpdater.ts +++ b/updaters/color/src/ColorUpdater.ts @@ -13,7 +13,7 @@ export class ColorUpdater implements IParticleUpdater { private readonly _container; private readonly _engine; - constructor(container: Container, engine: Engine) { + constructor(engine: Engine, container: Container) { this._container = container; this._engine = engine; } diff --git a/updaters/color/src/index.ts b/updaters/color/src/index.ts index c77cbeefd3a..aaaae6fe18b 100644 --- a/updaters/color/src/index.ts +++ b/updaters/color/src/index.ts @@ -1,20 +1,18 @@ -import { ColorUpdater } from "./ColorUpdater.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadColorUpdater(engine: Engine, refresh = true): Promise { +export function loadColorUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "color", - container => { - return Promise.resolve(new ColorUpdater(container, engine)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("color", async container => { + const { ColorUpdater } = await import("./ColorUpdater.js"); + + return new ColorUpdater(e, container); + }); + }); } diff --git a/updaters/color/webpack.config.js b/updaters/color/webpack.config.js index d50f07fb15a..ff0fc28d8a9 100644 --- a/updaters/color/webpack.config.js +++ b/updaters/color/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "color", updaterName: "Color", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "color", updaterName: "Color", version, dir: __dirname }); diff --git a/updaters/destroy/.eslintignore b/updaters/destroy/.eslintignore deleted file mode 100644 index de4d1f007dd..00000000000 --- a/updaters/destroy/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules diff --git a/updaters/destroy/.eslintrc.js b/updaters/destroy/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/destroy/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/destroy/CHANGELOG.md b/updaters/destroy/CHANGELOG.md index f6c773df6dc..1f6f1ef94f6 100644 --- a/updaters/destroy/CHANGELOG.md +++ b/updaters/destroy/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-destroy + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-destroy diff --git a/updaters/destroy/eslint.config.js b/updaters/destroy/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/destroy/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/destroy/package.dist.json b/updaters/destroy/package.dist.json index e568f2e531c..919f5816817 100644 --- a/updaters/destroy/package.dist.json +++ b/updaters/destroy/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-destroy", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles destroy updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/destroy/package.json b/updaters/destroy/package.json index 310701fbb46..30f25f7e1c3 100644 --- a/updaters/destroy/package.json +++ b/updaters/destroy/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-destroy", - "version": "3.9.1", - "description": "tsParticles particles destroy updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-destroy", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles destroy updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/destroy" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/destroy" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/destroy/src/DestroyUpdater.ts b/updaters/destroy/src/DestroyUpdater.ts index 5d533150ae1..140df204425 100644 --- a/updaters/destroy/src/DestroyUpdater.ts +++ b/updaters/destroy/src/DestroyUpdater.ts @@ -34,9 +34,7 @@ export class DestroyUpdater implements IParticleUpdater { const destroyBoundsOptions = destroyOptions.bounds; - if (!particle.destroyBounds) { - particle.destroyBounds = {}; - } + particle.destroyBounds ??= {}; const { bottom, left, right, top } = destroyBoundsOptions, { destroyBounds } = particle, @@ -67,9 +65,7 @@ export class DestroyUpdater implements IParticleUpdater { options: DestroyParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.destroy) { - options.destroy = new Destroy(); - } + options.destroy ??= new Destroy(); for (const source of sources) { options.destroy.load(source?.destroy); @@ -83,7 +79,7 @@ export class DestroyUpdater implements IParticleUpdater { const destroyOptions = particle.options.destroy; - if (destroyOptions && destroyOptions.mode === DestroyMode.split) { + if (destroyOptions?.mode === DestroyMode.split) { split(this.engine, this.container, particle); } } diff --git a/updaters/destroy/src/Utils.ts b/updaters/destroy/src/Utils.ts index 0d6b704043e..f7b32c6a008 100644 --- a/updaters/destroy/src/Utils.ts +++ b/updaters/destroy/src/Utils.ts @@ -9,7 +9,7 @@ import { isNumber, itemFromSingleOrMultiple, loadParticlesOptions, - randomInRange, + randomInRangeValue, setRangeValue, } from "@tsparticles/engine"; import type { DestroyParticle } from "./Types.js"; @@ -86,8 +86,8 @@ function addSplitParticle( const offset = splitOptions.sizeOffset ? setRangeValue(-parent.size.value, parent.size.value) : defaultOffset, position = { - x: parent.position.x + randomInRange(offset), - y: parent.position.y + randomInRange(offset), + x: parent.position.x + randomInRangeValue(offset), + y: parent.position.y + randomInRangeValue(offset), }; return container.particles.addParticle(position, options, parent.group, (particle: DestroyParticle) => { @@ -95,7 +95,7 @@ function addSplitParticle( return false; } - particle.velocity.length = randomInRange(setRangeValue(parent.velocity.length, particle.velocity.length)); + particle.velocity.length = randomInRangeValue(setRangeValue(parent.velocity.length, particle.velocity.length)); particle.splitCount = (parent.splitCount ?? defaultSplitCount) + increment; particle.unbreakable = true; diff --git a/updaters/destroy/src/index.ts b/updaters/destroy/src/index.ts index 57a3518bbbb..2ef440795a4 100644 --- a/updaters/destroy/src/index.ts +++ b/updaters/destroy/src/index.ts @@ -1,20 +1,18 @@ -import { DestroyUpdater } from "./DestroyUpdater.js"; import { type Engine } from "@tsparticles/engine"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadDestroyUpdater(engine: Engine, refresh = true): Promise { +export function loadDestroyUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "destroy", - container => { - return Promise.resolve(new DestroyUpdater(engine, container)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("destroy", async container => { + const { DestroyUpdater } = await import("./DestroyUpdater.js"); + + return new DestroyUpdater(e, container); + }); + }); } diff --git a/updaters/destroy/webpack.config.js b/updaters/destroy/webpack.config.js index ea4cb8f405a..5c7dc1973bd 100644 --- a/updaters/destroy/webpack.config.js +++ b/updaters/destroy/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "destroy", updaterName: "Destroy", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "destroy", updaterName: "Destroy", version, dir: __dirname }); diff --git a/updaters/gradient/.eslintignore b/updaters/gradient/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/gradient/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/gradient/.eslintrc.js b/updaters/gradient/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/gradient/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/gradient/CHANGELOG.md b/updaters/gradient/CHANGELOG.md index caba8a2736a..89e149ce6f1 100644 --- a/updaters/gradient/CHANGELOG.md +++ b/updaters/gradient/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-gradient diff --git a/updaters/gradient/eslint.config.js b/updaters/gradient/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/gradient/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/gradient/package.dist.json b/updaters/gradient/package.dist.json index 3432aaff958..7ce5de721f4 100644 --- a/updaters/gradient/package.dist.json +++ b/updaters/gradient/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-gradient", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles gradient updater", "homepage": "https://particles.js.org", "repository": { @@ -101,9 +101,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/gradient/package.json b/updaters/gradient/package.json index a436f81b38e..3e555e0d989 100644 --- a/updaters/gradient/package.json +++ b/updaters/gradient/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/updater-gradient", - "version": "3.9.1", - "description": "tsParticles particles gradient updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-gradient", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles gradient updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/gradient" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/gradient" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/gradient/src/GradientUpdater.ts b/updaters/gradient/src/GradientUpdater.ts index 2308f447f94..fbb0a37045c 100644 --- a/updaters/gradient/src/GradientUpdater.ts +++ b/updaters/gradient/src/GradientUpdater.ts @@ -9,6 +9,7 @@ import { type RecursivePartial, RotateDirection, StartValueType, + doublePI, executeOnSingleOrMultiple, getHslAnimationFromHsl, getRandom, @@ -20,16 +21,13 @@ import { itemFromSingleOrMultiple, millisecondsToSeconds, percentDenominator, - randomInRange, + randomInRangeValue, rangeColorToHsl, } from "@tsparticles/engine"; import type { GradientParticle, GradientParticlesOptions, IGradientParticlesOptions } from "./Types.js"; import { AnimatableGradient } from "./Options/Classes/AnimatableGradient.js"; import { updateGradient } from "./Utils.js"; -const double = 2, - doublePI = Math.PI * double; - export class GradientUpdater implements IParticleUpdater { private readonly _engine; @@ -49,7 +47,8 @@ export class GradientUpdater implements IParticleUpdater { return {}; } - const gradientAngle = gradient.angle.value, + const { container } = particle, + gradientAngle = gradient.angle.value, origin: ICoordinates = { x: 0, y: 0 }, minRadius = 0, fillGradient = @@ -63,17 +62,13 @@ export class GradientUpdater implements IParticleUpdater { ); for (const { stop, value, opacity: cOpacity } of gradient.colors) { - fillGradient.addColorStop( - stop, - getStyleFromHsl( - { - h: value.h.value, - s: value.s.value, - l: value.l.value, - }, - cOpacity?.value ?? opacity, - ), - ); + const hsl = { + h: value.h.value, + s: value.s.value, + l: value.l.value, + }; + + fillGradient.addColorStop(stop, getStyleFromHsl(hsl, container.hdr, cOpacity?.value ?? opacity)); } return { fill: fillGradient }; @@ -180,7 +175,7 @@ export class GradientUpdater implements IParticleUpdater { case StartValueType.random: default: - addOpacity.value = randomInRange(addOpacity); + addOpacity.value = randomInRangeValue(addOpacity); addOpacity.status = getRandom() >= half ? AnimationStatus.increasing : AnimationStatus.decreasing; @@ -213,10 +208,6 @@ export class GradientUpdater implements IParticleUpdater { const gradientToLoad = source.gradient; - if (!gradientToLoad) { - continue; - } - options.gradient = executeOnSingleOrMultiple(gradientToLoad, gradient => { const tmp = new AnimatableGradient(); diff --git a/updaters/gradient/src/index.ts b/updaters/gradient/src/index.ts index ab1e2251896..1891649cd85 100644 --- a/updaters/gradient/src/index.ts +++ b/updaters/gradient/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { GradientUpdater } from "./GradientUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadGradientUpdater(engine: Engine, refresh = true): Promise { +export function loadGradientUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "gradient", - () => { - return Promise.resolve(new GradientUpdater(engine)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("gradient", async () => { + const { GradientUpdater } = await import("./GradientUpdater.js"); + + return new GradientUpdater(e); + }); + }); } diff --git a/updaters/gradient/webpack.config.js b/updaters/gradient/webpack.config.js index f8382e721c4..dd79abf9963 100644 --- a/updaters/gradient/webpack.config.js +++ b/updaters/gradient/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "gradient", updaterName: "Gradient", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "gradient", updaterName: "Gradient", version, dir: __dirname }); diff --git a/updaters/life/.eslintignore b/updaters/life/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/life/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/life/.eslintrc.js b/updaters/life/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/life/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/life/CHANGELOG.md b/updaters/life/CHANGELOG.md index f7b7add8232..25cfe6e45f5 100644 --- a/updaters/life/CHANGELOG.md +++ b/updaters/life/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-life + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-life diff --git a/updaters/life/eslint.config.js b/updaters/life/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/life/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/life/package.dist.json b/updaters/life/package.dist.json index e890a764b45..f7eca76d466 100644 --- a/updaters/life/package.dist.json +++ b/updaters/life/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-life", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles life updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/life/package.json b/updaters/life/package.json index 7fb18b58002..1b5ea05255e 100644 --- a/updaters/life/package.json +++ b/updaters/life/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-life", - "version": "3.9.1", - "description": "tsParticles particles life updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-life", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles life updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/life" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/life" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/life/src/LifeUpdater.ts b/updaters/life/src/LifeUpdater.ts index 0594ee554bb..091ef539cad 100644 --- a/updaters/life/src/LifeUpdater.ts +++ b/updaters/life/src/LifeUpdater.ts @@ -56,9 +56,7 @@ export class LifeUpdater implements IParticleUpdater { particle.life.count = infiniteValue; } - if (particle.life) { - particle.spawning = particle.life.delay > noTime; - } + particle.spawning = particle.life.delay > noTime; } isEnabled(particle: Particle): boolean { @@ -69,9 +67,7 @@ export class LifeUpdater implements IParticleUpdater { options: LifeParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.life) { - options.life = new Life(); - } + options.life ??= new Life(); for (const source of sources) { options.life.load(source?.life); diff --git a/updaters/life/src/Options/Classes/LifeDelay.ts b/updaters/life/src/Options/Classes/LifeDelay.ts index 2d2a0150289..3cb1e69d626 100644 --- a/updaters/life/src/Options/Classes/LifeDelay.ts +++ b/updaters/life/src/Options/Classes/LifeDelay.ts @@ -9,7 +9,7 @@ export class LifeDelay extends ValueWithRandom implements ILifeDelay, IOptionLoa this.sync = false; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/updaters/life/src/Options/Classes/LifeDuration.ts b/updaters/life/src/Options/Classes/LifeDuration.ts index 2ae28acce51..4687bf4bffc 100644 --- a/updaters/life/src/Options/Classes/LifeDuration.ts +++ b/updaters/life/src/Options/Classes/LifeDuration.ts @@ -9,7 +9,7 @@ export class LifeDuration extends ValueWithRandom implements ILifeDuration, IOpt this.sync = false; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/updaters/life/src/Utils.ts b/updaters/life/src/Utils.ts index eb3dd8f1e35..994a353c6ed 100644 --- a/updaters/life/src/Utils.ts +++ b/updaters/life/src/Utils.ts @@ -3,7 +3,7 @@ import { type IDimension, getRangeValue, millisecondsToSeconds, - randomInRange, + randomInRangeValue, setRangeValue, } from "@tsparticles/engine"; import type { LifeParticle } from "./Types.js"; @@ -14,10 +14,9 @@ const noTime = 0, minCanvasSize = 0; /** - * - * @param particle - * @param delta - * @param canvasSize + * @param particle - + * @param delta - + * @param canvasSize - */ export function updateLife(particle: LifeParticle, delta: IDelta, canvasSize: IDimension): void { if (!particle.life) { @@ -45,10 +44,6 @@ export function updateLife(particle: LifeParticle, delta: IDelta, canvasSize: ID return; } - if (particle.spawning) { - return; - } - if (justSpawned) { life.time = noTime; } else { @@ -74,8 +69,8 @@ export function updateLife(particle: LifeParticle, delta: IDelta, canvasSize: ID const widthRange = setRangeValue(minCanvasSize, canvasSize.width), heightRange = setRangeValue(minCanvasSize, canvasSize.width); - particle.position.x = randomInRange(widthRange); - particle.position.y = randomInRange(heightRange); + particle.position.x = randomInRangeValue(widthRange); + particle.position.y = randomInRangeValue(heightRange); particle.spawning = true; life.delayTime = noTime; life.time = noTime; diff --git a/updaters/life/src/index.ts b/updaters/life/src/index.ts index 8543634914f..137e50a5452 100644 --- a/updaters/life/src/index.ts +++ b/updaters/life/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { LifeUpdater } from "./LifeUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadLifeUpdater(engine: Engine, refresh = true): Promise { +export function loadLifeUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "life", - async container => { - return Promise.resolve(new LifeUpdater(container)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("life", async container => { + const { LifeUpdater } = await import("./LifeUpdater.js"); + + return new LifeUpdater(container); + }); + }); } diff --git a/updaters/life/webpack.config.js b/updaters/life/webpack.config.js index 617eafdd7a8..57115e59e9c 100644 --- a/updaters/life/webpack.config.js +++ b/updaters/life/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "life", updaterName: "Life", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "life", updaterName: "Life", version, dir: __dirname }); diff --git a/updaters/opacity/.eslintignore b/updaters/opacity/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/opacity/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/opacity/.eslintrc.js b/updaters/opacity/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/opacity/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/opacity/CHANGELOG.md b/updaters/opacity/CHANGELOG.md index 5c7911f0442..7ecfc9bafd6 100644 --- a/updaters/opacity/CHANGELOG.md +++ b/updaters/opacity/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-opacity + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-opacity diff --git a/updaters/opacity/eslint.config.js b/updaters/opacity/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/opacity/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/opacity/package.dist.json b/updaters/opacity/package.dist.json index ae7705afd3c..03eb25d9442 100644 --- a/updaters/opacity/package.dist.json +++ b/updaters/opacity/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-opacity", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles opacity updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/opacity/package.json b/updaters/opacity/package.json index 1062e10fa04..eee64e87517 100644 --- a/updaters/opacity/package.json +++ b/updaters/opacity/package.json @@ -1,102 +1,103 @@ { - "name": "@tsparticles/updater-opacity", - "version": "3.9.1", - "description": "tsParticles particles opacity updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-opacity", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles opacity updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/opacity" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "sideEffects": false, + "prettier": "@tsparticles/prettier-config", + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/opacity" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "sideEffects": false, - "prettier": "@tsparticles/prettier-config", - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/opacity/src/index.ts b/updaters/opacity/src/index.ts index c04a3dcb08c..f1c849af040 100644 --- a/updaters/opacity/src/index.ts +++ b/updaters/opacity/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { OpacityUpdater } from "./OpacityUpdater.js"; declare const __VERSION__: string; /** * @param engine - The engine instance to load the updater for - * @param refresh - */ -export async function loadOpacityUpdater(engine: Engine, refresh = true): Promise { +export function loadOpacityUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "opacity", - container => { - return Promise.resolve(new OpacityUpdater(container)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("opacity", async container => { + const { OpacityUpdater } = await import("./OpacityUpdater.js"); + + return new OpacityUpdater(container); + }); + }); } diff --git a/updaters/opacity/webpack.config.js b/updaters/opacity/webpack.config.js index 17cfc4f90b0..f8742f6442e 100644 --- a/updaters/opacity/webpack.config.js +++ b/updaters/opacity/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "opacity", updaterName: "Opacity", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "opacity", updaterName: "Opacity", version, dir: __dirname }); diff --git a/updaters/orbit/.eslintignore b/updaters/orbit/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/orbit/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/orbit/.eslintrc.js b/updaters/orbit/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/orbit/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/orbit/CHANGELOG.md b/updaters/orbit/CHANGELOG.md index acb98e2e7b1..bc4400361ee 100644 --- a/updaters/orbit/CHANGELOG.md +++ b/updaters/orbit/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-orbit diff --git a/updaters/orbit/eslint.config.js b/updaters/orbit/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/orbit/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/orbit/package.dist.json b/updaters/orbit/package.dist.json index d2ae49b4f4b..dd7af83d2f8 100644 --- a/updaters/orbit/package.dist.json +++ b/updaters/orbit/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-orbit", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles orbit updater", "homepage": "https://particles.js.org", "repository": { @@ -101,9 +101,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/orbit/package.json b/updaters/orbit/package.json index 79504a425bf..564e36b78bd 100644 --- a/updaters/orbit/package.json +++ b/updaters/orbit/package.json @@ -1,119 +1,120 @@ { - "name": "@tsparticles/updater-orbit", - "version": "3.9.1", - "description": "tsParticles particles orbit updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-orbit", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles orbit updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/orbit" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/orbit" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/orbit/src/Options/Classes/OrbitRotation.ts b/updaters/orbit/src/Options/Classes/OrbitRotation.ts index af854573113..eedcb825ea0 100644 --- a/updaters/orbit/src/Options/Classes/OrbitRotation.ts +++ b/updaters/orbit/src/Options/Classes/OrbitRotation.ts @@ -9,7 +9,7 @@ export class OrbitRotation extends ValueWithRandom { this.value = 45; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/updaters/orbit/src/OrbitUpdater.ts b/updaters/orbit/src/OrbitUpdater.ts index 1611118b109..694721a2cdc 100644 --- a/updaters/orbit/src/OrbitUpdater.ts +++ b/updaters/orbit/src/OrbitUpdater.ts @@ -3,7 +3,10 @@ import { type IDelta, type IParticleUpdater, type RecursivePartial, + defaultOpacity, + doublePI, getRangeValue, + half, rangeColorToHsl, } from "@tsparticles/engine"; import type { IOrbitParticlesOptions, OrbitContainer, OrbitParticle, OrbitParticlesOptions } from "./Types.js"; @@ -11,14 +14,10 @@ import { Orbit } from "./Options/Classes/Orbit.js"; import { OrbitType } from "./Enums.js"; import { drawEllipse } from "./Utils.js"; -const double = 2, - half = 0.5, - doublePI = Math.PI * double, - defaultOrbitSpeed = 0, +const defaultOrbitSpeed = 0, halfPI = Math.PI * half, piAndAHalf = Math.PI + halfPI, startAngle = 0, - defaultOpacity = 1, defaultWidth = 1, defaultRotation = 0; @@ -26,7 +25,7 @@ export class OrbitUpdater implements IParticleUpdater { private readonly _container; private readonly _engine; - constructor(container: OrbitContainer, engine: Engine) { + constructor(engine: Engine, container: OrbitContainer) { this._engine = engine; this._container = container; } @@ -115,9 +114,7 @@ export class OrbitUpdater implements IParticleUpdater { options: OrbitParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.orbit) { - options.orbit = new Orbit(); - } + options.orbit ??= new Orbit(); for (const source of sources) { options.orbit.load(source?.orbit); @@ -129,10 +126,7 @@ export class OrbitUpdater implements IParticleUpdater { return; } - if (particle.orbitRotation === undefined) { - particle.orbitRotation = defaultRotation; - } - + particle.orbitRotation ??= defaultRotation; particle.orbitRotation += (particle.orbitAnimationSpeed ?? defaultOrbitSpeed / doublePI) * delta.factor; } } diff --git a/updaters/orbit/src/Utils.ts b/updaters/orbit/src/Utils.ts index 4e7999758d2..13b5722cfb2 100644 --- a/updaters/orbit/src/Utils.ts +++ b/updaters/orbit/src/Utils.ts @@ -31,10 +31,11 @@ export function drawEllipse( return; } - const pos = particle.getPosition(); + const pos = particle.getPosition(), + { container } = particle; if (fillColorValue) { - context.strokeStyle = getStyleFromHsl(fillColorValue, opacity); + context.strokeStyle = getStyleFromHsl(fillColorValue, container.hdr, opacity); } context.lineWidth = width; diff --git a/updaters/orbit/src/index.ts b/updaters/orbit/src/index.ts index 8a4015f3cb6..e3d9ce2eccf 100644 --- a/updaters/orbit/src/index.ts +++ b/updaters/orbit/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { OrbitUpdater } from "./OrbitUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadOrbitUpdater(engine: Engine, refresh = true): Promise { +export function loadOrbitUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "orbit", - container => { - return Promise.resolve(new OrbitUpdater(container, engine)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("orbit", async container => { + const { OrbitUpdater } = await import("./OrbitUpdater.js"); + + return new OrbitUpdater(e, container); + }); + }); } diff --git a/updaters/orbit/webpack.config.js b/updaters/orbit/webpack.config.js index 34cedb9089a..716a56f4401 100644 --- a/updaters/orbit/webpack.config.js +++ b/updaters/orbit/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "orbit", updaterName: "Orbit", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "orbit", updaterName: "Orbit", version, dir: __dirname }); diff --git a/updaters/outModes/.eslintignore b/updaters/outModes/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/outModes/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/outModes/.eslintrc.js b/updaters/outModes/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/outModes/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/outModes/CHANGELOG.md b/updaters/outModes/CHANGELOG.md index eec4c293251..bc48ef4f79b 100644 --- a/updaters/outModes/CHANGELOG.md +++ b/updaters/outModes/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-out-modes + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-out-modes diff --git a/updaters/outModes/eslint.config.js b/updaters/outModes/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/outModes/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/outModes/package.dist.json b/updaters/outModes/package.dist.json index de10c9452d3..42024919df0 100644 --- a/updaters/outModes/package.dist.json +++ b/updaters/outModes/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-out-modes", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles out modes updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/outModes/package.json b/updaters/outModes/package.json index dd2ad56b8ac..d2266cb8589 100644 --- a/updaters/outModes/package.json +++ b/updaters/outModes/package.json @@ -1,102 +1,103 @@ { - "name": "@tsparticles/updater-out-modes", - "version": "3.9.1", - "description": "tsParticles particles out modes updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-out-modes", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles out modes updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/outModes" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/outModes" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/outModes/src/NoneOutMode.ts b/updaters/outModes/src/NoneOutMode.ts index 8de43483618..2ede1a48e6d 100644 --- a/updaters/outModes/src/NoneOutMode.ts +++ b/updaters/outModes/src/NoneOutMode.ts @@ -21,7 +21,7 @@ export class NoneOutMode implements IOutModeManager { update( particle: Particle, direction: OutModeDirection, - delta: IDelta, + _delta: IDelta, outMode: OutMode | keyof typeof OutMode, ): void { if (!this.modes.includes(outMode)) { diff --git a/updaters/outModes/src/OutOutMode.ts b/updaters/outModes/src/OutOutMode.ts index f6d40da6be8..c98e26223a4 100644 --- a/updaters/outModes/src/OutOutMode.ts +++ b/updaters/outModes/src/OutOutMode.ts @@ -10,7 +10,7 @@ import { getDistances, getRandom, isPointInside, - randomInRange, + randomInRangeValue, } from "@tsparticles/engine"; import type { IOutModeManager } from "./IOutModeManager.js"; @@ -27,7 +27,7 @@ export class OutOutMode implements IOutModeManager { update( particle: Particle, direction: OutModeDirection, - delta: IDelta, + _delta: IDelta, outMode: OutMode | keyof typeof OutMode, ): void { if (!this.modes.includes(outMode)) { @@ -59,13 +59,13 @@ export class OutOutMode implements IOutModeManager { } particle.position.x = Math.floor( - randomInRange({ + randomInRangeValue({ min: 0, max: container.canvas.size.width, }), ); particle.position.y = Math.floor( - randomInRange({ + randomInRangeValue({ min: 0, max: container.canvas.size.height, }), @@ -95,14 +95,14 @@ export class OutOutMode implements IOutModeManager { case ParticleOutType.outside: { particle.position.x = Math.floor( - randomInRange({ + randomInRangeValue({ min: -particle.moveCenter.radius, max: particle.moveCenter.radius, }), ) + particle.moveCenter.x; particle.position.y = Math.floor( - randomInRange({ + randomInRangeValue({ min: -particle.moveCenter.radius, max: particle.moveCenter.radius, }), diff --git a/updaters/outModes/src/index.ts b/updaters/outModes/src/index.ts index e74f4628ff4..57469c5e90b 100644 --- a/updaters/outModes/src/index.ts +++ b/updaters/outModes/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { OutOfCanvasUpdater } from "./OutOfCanvasUpdater.js"; declare const __VERSION__: string; /** * @param engine - The engine instance loading this plugin - * @param refresh - */ -export async function loadOutModesUpdater(engine: Engine, refresh = true): Promise { +export function loadOutModesUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "outModes", - container => { - return Promise.resolve(new OutOfCanvasUpdater(container)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("outModes", async container => { + const { OutOfCanvasUpdater } = await import("./OutOfCanvasUpdater.js"); + + return new OutOfCanvasUpdater(container); + }); + }); } diff --git a/updaters/outModes/webpack.config.js b/updaters/outModes/webpack.config.js index 99dbd0ec261..a7ea2e59935 100644 --- a/updaters/outModes/webpack.config.js +++ b/updaters/outModes/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "out-modes", updaterName: "Out Modes", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "out-modes", updaterName: "Out Modes", version, dir: __dirname }); diff --git a/updaters/roll/.eslintignore b/updaters/roll/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/roll/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/roll/.eslintrc.js b/updaters/roll/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/roll/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/roll/CHANGELOG.md b/updaters/roll/CHANGELOG.md index 558480b39ef..726b42d4910 100644 --- a/updaters/roll/CHANGELOG.md +++ b/updaters/roll/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-roll + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-roll diff --git a/updaters/roll/eslint.config.js b/updaters/roll/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/roll/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/roll/package.dist.json b/updaters/roll/package.dist.json index 4ed62747fea..63f10aba264 100644 --- a/updaters/roll/package.dist.json +++ b/updaters/roll/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-roll", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles roll updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/roll/package.json b/updaters/roll/package.json index 545c2e4e12a..0743f46b6be 100644 --- a/updaters/roll/package.json +++ b/updaters/roll/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-roll", - "version": "3.9.1", - "description": "tsParticles particles roll updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-roll", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles roll updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/roll" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/roll" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/roll/src/RollUpdater.ts b/updaters/roll/src/RollUpdater.ts index d41d5c6de23..25ef343140a 100644 --- a/updaters/roll/src/RollUpdater.ts +++ b/updaters/roll/src/RollUpdater.ts @@ -42,9 +42,7 @@ export class RollUpdater implements IParticleUpdater { options: RollParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.roll) { - options.roll = new Roll(); - } + options.roll ??= new Roll(); for (const source of sources) { options.roll.load(source?.roll); diff --git a/updaters/roll/src/index.ts b/updaters/roll/src/index.ts index a4aad4c04e1..f27926dcba1 100644 --- a/updaters/roll/src/index.ts +++ b/updaters/roll/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { RollUpdater } from "./RollUpdater.js"; declare const __VERSION__: string; /** * @param engine - The engine instance - * @param refresh - */ -export async function loadRollUpdater(engine: Engine, refresh = true): Promise { +export function loadRollUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "roll", - () => { - return Promise.resolve(new RollUpdater(engine)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("roll", async () => { + const { RollUpdater } = await import("./RollUpdater.js"); + + return new RollUpdater(e); + }); + }); } diff --git a/updaters/roll/webpack.config.js b/updaters/roll/webpack.config.js index 08371810ece..34b6e529a51 100644 --- a/updaters/roll/webpack.config.js +++ b/updaters/roll/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "roll", updaterName: "Roll", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "roll", updaterName: "Roll", version, dir: __dirname }); diff --git a/updaters/rotate/.eslintignore b/updaters/rotate/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/rotate/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/rotate/.eslintrc.js b/updaters/rotate/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/rotate/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/rotate/CHANGELOG.md b/updaters/rotate/CHANGELOG.md index 5cee7090e17..767dfdba94f 100644 --- a/updaters/rotate/CHANGELOG.md +++ b/updaters/rotate/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-rotate + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-rotate diff --git a/updaters/rotate/eslint.config.js b/updaters/rotate/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/rotate/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/rotate/package.dist.json b/updaters/rotate/package.dist.json index 58b00749dfd..2a4a2481de6 100644 --- a/updaters/rotate/package.dist.json +++ b/updaters/rotate/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-rotate", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles rotate updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/rotate/package.json b/updaters/rotate/package.json index 8b047898d68..ca6e30a33bf 100644 --- a/updaters/rotate/package.json +++ b/updaters/rotate/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-rotate", - "version": "3.9.1", - "description": "tsParticles particles rotate updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-rotate", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles rotate updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/rotate" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/rotate" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/rotate/src/Options/Classes/Rotate.ts b/updaters/rotate/src/Options/Classes/Rotate.ts index 7a0bfcd3bda..13c4f730cc8 100644 --- a/updaters/rotate/src/Options/Classes/Rotate.ts +++ b/updaters/rotate/src/Options/Classes/Rotate.ts @@ -25,7 +25,7 @@ export class Rotate extends ValueWithRandom implements IRotate, IOptionLoader): void { + override load(data?: RecursivePartial): void { if (isNull(data)) { return; } diff --git a/updaters/rotate/src/RotateUpdater.ts b/updaters/rotate/src/RotateUpdater.ts index e88680a2508..446169099c3 100644 --- a/updaters/rotate/src/RotateUpdater.ts +++ b/updaters/rotate/src/RotateUpdater.ts @@ -107,9 +107,7 @@ export class RotateUpdater implements IParticleUpdater { options: RotateParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.rotate) { - options.rotate = new Rotate(); - } + options.rotate ??= new Rotate(); for (const source of sources) { options.rotate.load(source?.rotate); diff --git a/updaters/rotate/src/index.ts b/updaters/rotate/src/index.ts index 2df50238437..ca19eed968a 100644 --- a/updaters/rotate/src/index.ts +++ b/updaters/rotate/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { RotateUpdater } from "./RotateUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadRotateUpdater(engine: Engine, refresh = true): Promise { +export function loadRotateUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "rotate", - container => { - return Promise.resolve(new RotateUpdater(container)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("rotate", async container => { + const { RotateUpdater } = await import("./RotateUpdater.js"); + + return new RotateUpdater(container); + }); + }); } diff --git a/updaters/rotate/webpack.config.js b/updaters/rotate/webpack.config.js index d3993a75e75..99995b35058 100644 --- a/updaters/rotate/webpack.config.js +++ b/updaters/rotate/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "rotate", updaterName: "Rotate", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "rotate", updaterName: "Rotate", version, dir: __dirname }); diff --git a/updaters/size/.eslintignore b/updaters/size/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/size/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/size/.eslintrc.js b/updaters/size/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/size/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/size/CHANGELOG.md b/updaters/size/CHANGELOG.md index a5c0a3597d7..9ee08824202 100644 --- a/updaters/size/CHANGELOG.md +++ b/updaters/size/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-size + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-size diff --git a/updaters/size/eslint.config.js b/updaters/size/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/size/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/size/package.dist.json b/updaters/size/package.dist.json index ca2e96ff1e8..6dd3429b3fa 100644 --- a/updaters/size/package.dist.json +++ b/updaters/size/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-size", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles size updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/size/package.json b/updaters/size/package.json index 9184d137d90..b1699c3840b 100644 --- a/updaters/size/package.json +++ b/updaters/size/package.json @@ -1,102 +1,103 @@ { - "name": "@tsparticles/updater-size", - "version": "3.9.1", - "description": "tsParticles particles size updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-size", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles size updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/size" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/size" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/size/src/index.ts b/updaters/size/src/index.ts index 965d8ff24a7..1000460a0c9 100644 --- a/updaters/size/src/index.ts +++ b/updaters/size/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { SizeUpdater } from "./SizeUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadSizeUpdater(engine: Engine, refresh = true): Promise { +export function loadSizeUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "size", - () => { - return Promise.resolve(new SizeUpdater()); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("size", async () => { + const { SizeUpdater } = await import("./SizeUpdater.js"); + + return new SizeUpdater(); + }); + }); } diff --git a/updaters/size/webpack.config.js b/updaters/size/webpack.config.js index 759ef7ef2e8..bd10542c926 100644 --- a/updaters/size/webpack.config.js +++ b/updaters/size/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "size", updaterName: "Size", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "size", updaterName: "Size", version, dir: __dirname }); diff --git a/updaters/strokeColor/.eslintignore b/updaters/strokeColor/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/strokeColor/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/strokeColor/.eslintrc.js b/updaters/strokeColor/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/strokeColor/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/strokeColor/CHANGELOG.md b/updaters/strokeColor/CHANGELOG.md index d40026e2214..17475d33a38 100644 --- a/updaters/strokeColor/CHANGELOG.md +++ b/updaters/strokeColor/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-stroke-color + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-stroke-color diff --git a/updaters/strokeColor/eslint.config.js b/updaters/strokeColor/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/strokeColor/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/strokeColor/package.dist.json b/updaters/strokeColor/package.dist.json index 1b9aa6d09a9..96b676b8057 100644 --- a/updaters/strokeColor/package.dist.json +++ b/updaters/strokeColor/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-stroke-color", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles stroke color updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/strokeColor/package.json b/updaters/strokeColor/package.json index 3de14d4286e..ed9795057ae 100644 --- a/updaters/strokeColor/package.json +++ b/updaters/strokeColor/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-stroke-color", - "version": "3.9.1", - "description": "tsParticles particles stroke color updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-stroke-color", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles stroke color updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/strokeColor" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/strokeColor" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/strokeColor/src/StrokeColorUpdater.ts b/updaters/strokeColor/src/StrokeColorUpdater.ts index e6553eea8be..8cf46080d9a 100644 --- a/updaters/strokeColor/src/StrokeColorUpdater.ts +++ b/updaters/strokeColor/src/StrokeColorUpdater.ts @@ -18,7 +18,7 @@ export class StrokeColorUpdater implements IParticleUpdater { private readonly _container; private readonly _engine; - constructor(container: Container, engine: Engine) { + constructor(engine: Engine, container: Container) { this._container = container; this._engine = engine; } @@ -30,6 +30,10 @@ export class StrokeColorUpdater implements IParticleUpdater { /* strokeColor */ const stroke = itemFromSingleOrMultiple(options.stroke, particle.id, options.reduceDuplicates); + if (!stroke) { + return; + } + particle.strokeWidth = getRangeValue(stroke.width) * container.retina.pixelRatio; particle.strokeOpacity = getRangeValue(stroke.opacity ?? defaultOpacity); particle.strokeAnimation = stroke.color?.animation; diff --git a/updaters/strokeColor/src/index.ts b/updaters/strokeColor/src/index.ts index 90d7b605962..804d0c524fa 100644 --- a/updaters/strokeColor/src/index.ts +++ b/updaters/strokeColor/src/index.ts @@ -1,19 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { StrokeColorUpdater } from "./StrokeColorUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadStrokeColorUpdater(engine: Engine, refresh = true): Promise { +export function loadStrokeColorUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "strokeColor", - container => { - return Promise.resolve(new StrokeColorUpdater(container, engine)); - }, - refresh, - ); + + engine.register(e => { + e.addParticleUpdater("strokeColor", async container => { + const { StrokeColorUpdater } = await import("./StrokeColorUpdater.js"); + + return new StrokeColorUpdater(e, container); + }); + }); } diff --git a/updaters/strokeColor/webpack.config.js b/updaters/strokeColor/webpack.config.js index a90e92a22cb..d7a8a5a4366 100644 --- a/updaters/strokeColor/webpack.config.js +++ b/updaters/strokeColor/webpack.config.js @@ -1,7 +1,15 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "stroke-color", updaterName: "Stroke Color", version, diff --git a/updaters/tilt/.eslintignore b/updaters/tilt/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/tilt/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/tilt/.eslintrc.js b/updaters/tilt/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/tilt/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/tilt/CHANGELOG.md b/updaters/tilt/CHANGELOG.md index f021cef6498..92663d8a7ee 100644 --- a/updaters/tilt/CHANGELOG.md +++ b/updaters/tilt/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-tilt + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-tilt diff --git a/updaters/tilt/eslint.config.js b/updaters/tilt/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/tilt/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/tilt/package.dist.json b/updaters/tilt/package.dist.json index 4f5c0f3c874..09c58d53e85 100644 --- a/updaters/tilt/package.dist.json +++ b/updaters/tilt/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-tilt", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles tilt updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/tilt/package.json b/updaters/tilt/package.json index f33f78629b2..b86d604d374 100644 --- a/updaters/tilt/package.json +++ b/updaters/tilt/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-tilt", - "version": "3.9.1", - "description": "tsParticles particles tilt updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-tilt", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles tilt updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/tilt" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/tilt" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/tilt/src/Options/Classes/Tilt.ts b/updaters/tilt/src/Options/Classes/Tilt.ts index f2da231dd1f..2861d86c7aa 100644 --- a/updaters/tilt/src/Options/Classes/Tilt.ts +++ b/updaters/tilt/src/Options/Classes/Tilt.ts @@ -19,7 +19,7 @@ export class Tilt extends ValueWithRandom implements ITilt, IOptionLoader this.value = 0; } - load(data?: RecursivePartial): void { + override load(data?: RecursivePartial): void { super.load(data); if (isNull(data)) { diff --git a/updaters/tilt/src/TiltUpdater.ts b/updaters/tilt/src/TiltUpdater.ts index bc64c085ffa..ed12d614f55 100644 --- a/updaters/tilt/src/TiltUpdater.ts +++ b/updaters/tilt/src/TiltUpdater.ts @@ -95,22 +95,18 @@ export class TiltUpdater implements IParticleUpdater { options: TiltParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.tilt) { - options.tilt = new Tilt(); - } + options.tilt ??= new Tilt(); for (const source of sources) { options.tilt.load(source?.tilt); } } - async update(particle: TiltParticle, delta: IDelta): Promise { + update(particle: TiltParticle, delta: IDelta): void { if (!this.isEnabled(particle) || !particle.tilt) { return; } updateAnimation(particle, particle.tilt, false, DestroyType.none, delta); - - await Promise.resolve(); } } diff --git a/updaters/tilt/src/index.ts b/updaters/tilt/src/index.ts index 4555c7f718d..f6ca260a53f 100644 --- a/updaters/tilt/src/index.ts +++ b/updaters/tilt/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { TiltUpdater } from "./TiltUpdater.js"; declare const __VERSION__: string; /** * @param engine - The engine to load the updater for - * @param refresh - */ -export async function loadTiltUpdater(engine: Engine, refresh = true): Promise { +export function loadTiltUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "tilt", - container => { - return Promise.resolve(new TiltUpdater(container)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("tilt", async container => { + const { TiltUpdater } = await import("./TiltUpdater.js"); + + return new TiltUpdater(container); + }); + }); } diff --git a/updaters/tilt/webpack.config.js b/updaters/tilt/webpack.config.js index d6a3cb7b04b..448f3cb4cb3 100644 --- a/updaters/tilt/webpack.config.js +++ b/updaters/tilt/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "tilt", updaterName: "Tilt", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "tilt", updaterName: "Tilt", version, dir: __dirname }); diff --git a/updaters/twinkle/.eslintignore b/updaters/twinkle/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/twinkle/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/twinkle/.eslintrc.js b/updaters/twinkle/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/twinkle/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/twinkle/CHANGELOG.md b/updaters/twinkle/CHANGELOG.md index 33c840d499b..9a59646cf6a 100644 --- a/updaters/twinkle/CHANGELOG.md +++ b/updaters/twinkle/CHANGELOG.md @@ -3,6 +3,13 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added hdr feature full implementation, colors are now hdr ready ([aee509f](https://github.com/tsparticles/tsparticles/commit/aee509fec97eed1a84c6809f73ce6a42ad19da6a)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-twinkle diff --git a/updaters/twinkle/eslint.config.js b/updaters/twinkle/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/twinkle/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/twinkle/package.dist.json b/updaters/twinkle/package.dist.json index 5b4d6bbcb67..56d25bb737e 100644 --- a/updaters/twinkle/package.dist.json +++ b/updaters/twinkle/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-twinkle", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles twinkle updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/twinkle/package.json b/updaters/twinkle/package.json index bfba0467214..c5aa44af104 100644 --- a/updaters/twinkle/package.json +++ b/updaters/twinkle/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-twinkle", - "version": "3.9.1", - "description": "tsParticles particles twinkle updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-twinkle", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles twinkle updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/twinkle" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/twinkle" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/twinkle/src/TwinkleUpdater.ts b/updaters/twinkle/src/TwinkleUpdater.ts index 38257480f95..539540f05bc 100644 --- a/updaters/twinkle/src/TwinkleUpdater.ts +++ b/updaters/twinkle/src/TwinkleUpdater.ts @@ -21,12 +21,13 @@ export class TwinkleUpdater implements IParticleUpdater { getColorStyles( particle: Particle, - context: CanvasRenderingContext2D, - radius: number, + _context: CanvasRenderingContext2D, + _radius: number, opacity: number, ): IParticleColorStyle { const pOptions = particle.options, - twinkleOptions = pOptions.twinkle as Twinkle; + { container } = particle, + twinkleOptions = pOptions["twinkle"] as Twinkle | undefined; if (!twinkleOptions) { return {}; @@ -39,7 +40,14 @@ export class TwinkleUpdater implements IParticleUpdater { zOpacityFactor = (zOffset - particle.zIndexFactor) ** zIndexOptions.opacityRate, twinklingOpacity = twinkling ? getRangeValue(twinkle.opacity) * zOpacityFactor : opacity, twinkleRgb = rangeColorToHsl(this._engine, twinkle.color), - twinkleStyle = twinkleRgb ? getStyleFromHsl(twinkleRgb, twinklingOpacity) : undefined, + getTwinkleStyle = (): string | undefined => { + if (!twinkleRgb) { + return undefined; + } + + return getStyleFromHsl(twinkleRgb, container.hdr, twinklingOpacity); + }, + twinkleStyle = getTwinkleStyle(), res: IParticleColorStyle = {}, needsTwinkle = twinkling && twinkleStyle; @@ -49,13 +57,13 @@ export class TwinkleUpdater implements IParticleUpdater { return res; } - async init(): Promise { - await Promise.resolve(); + init(): void { + // nothing to do } isEnabled(particle: TwinkeParticle): boolean { const pOptions = particle.options, - twinkleOptions = pOptions.twinkle!; + twinkleOptions = pOptions.twinkle; if (!twinkleOptions) { return false; @@ -68,16 +76,14 @@ export class TwinkleUpdater implements IParticleUpdater { options: TwinkleParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.twinkle) { - options.twinkle = new Twinkle(); - } + options.twinkle ??= new Twinkle(); for (const source of sources) { options.twinkle.load(source?.twinkle); } } - async update(): Promise { - await Promise.resolve(); + update(): void { + // nothing to do } } diff --git a/updaters/twinkle/src/index.ts b/updaters/twinkle/src/index.ts index fcd3b42606c..d1db9e137a4 100644 --- a/updaters/twinkle/src/index.ts +++ b/updaters/twinkle/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { TwinkleUpdater } from "./TwinkleUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadTwinkleUpdater(engine: Engine, refresh = true): Promise { +export function loadTwinkleUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "twinkle", - () => { - return Promise.resolve(new TwinkleUpdater(engine)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("twinkle", async () => { + const { TwinkleUpdater } = await import("./TwinkleUpdater.js"); + + return new TwinkleUpdater(e); + }); + }); } diff --git a/updaters/twinkle/webpack.config.js b/updaters/twinkle/webpack.config.js index bdbcc485eaa..1638a94d5f8 100644 --- a/updaters/twinkle/webpack.config.js +++ b/updaters/twinkle/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "twinkle", updaterName: "Twinkle", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "twinkle", updaterName: "Twinkle", version, dir: __dirname }); diff --git a/updaters/wobble/.eslintignore b/updaters/wobble/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/updaters/wobble/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/updaters/wobble/.eslintrc.js b/updaters/wobble/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/updaters/wobble/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/updaters/wobble/CHANGELOG.md b/updaters/wobble/CHANGELOG.md index 961576a3be4..9cd79c85b1f 100644 --- a/updaters/wobble/CHANGELOG.md +++ b/updaters/wobble/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/updater-wobble + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/updater-wobble diff --git a/updaters/wobble/eslint.config.js b/updaters/wobble/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/updaters/wobble/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/updaters/wobble/package.dist.json b/updaters/wobble/package.dist.json index 9b873ab8bc1..caa81c2ee3b 100644 --- a/updaters/wobble/package.dist.json +++ b/updaters/wobble/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/updater-wobble", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles particles wobble updater", "homepage": "https://particles.js.org", "repository": { @@ -87,9 +87,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/updaters/wobble/package.json b/updaters/wobble/package.json index f39e2a0df21..ca786220351 100644 --- a/updaters/wobble/package.json +++ b/updaters/wobble/package.json @@ -1,105 +1,106 @@ { - "name": "@tsparticles/updater-wobble", - "version": "3.9.1", - "description": "tsParticles particles wobble updater", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/updater-wobble", + "version": "4.0.0-alpha.0", + "description": "tsParticles particles wobble updater", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "updaters/wobble" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin", + "@tsparticles/updater" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "updaters/wobble" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin", - "@tsparticles/updater" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/updaters/wobble/src/Options/Classes/Wobble.ts b/updaters/wobble/src/Options/Classes/Wobble.ts index 06c7e817b6d..7beb202c48f 100644 --- a/updaters/wobble/src/Options/Classes/Wobble.ts +++ b/updaters/wobble/src/Options/Classes/Wobble.ts @@ -41,7 +41,7 @@ export class Wobble implements IWobble, IOptionLoader { } else { const rangeSpeed = data.speed as IRangeValue; - if (rangeSpeed.min !== undefined) { + if (Object.hasOwn(rangeSpeed, "min")) { this.speed.load({ angle: rangeSpeed }); } else { this.speed.load(data.speed as IWobbleSpeed); diff --git a/updaters/wobble/src/WobbleUpdater.ts b/updaters/wobble/src/WobbleUpdater.ts index 1f139cf68d4..51a5d0fd86d 100644 --- a/updaters/wobble/src/WobbleUpdater.ts +++ b/updaters/wobble/src/WobbleUpdater.ts @@ -68,9 +68,7 @@ export class WobbleUpdater implements IParticleUpdater { options: WobbleParticlesOptions, ...sources: (RecursivePartial | undefined)[] ): void { - if (!options.wobble) { - options.wobble = new Wobble(); - } + options.wobble ??= new Wobble(); for (const source of sources) { options.wobble.load(source?.wobble); diff --git a/updaters/wobble/src/index.ts b/updaters/wobble/src/index.ts index bc36ff9c6e9..6362404d5ba 100644 --- a/updaters/wobble/src/index.ts +++ b/updaters/wobble/src/index.ts @@ -1,20 +1,18 @@ import { type Engine } from "@tsparticles/engine"; -import { WobbleUpdater } from "./WobbleUpdater.js"; declare const __VERSION__: string; /** * @param engine - - * @param refresh - */ -export async function loadWobbleUpdater(engine: Engine, refresh = true): Promise { +export function loadWobbleUpdater(engine: Engine): void { engine.checkVersion(__VERSION__); - await engine.addParticleUpdater( - "wobble", - container => { - return Promise.resolve(new WobbleUpdater(container)); - }, - refresh, - ); + engine.register(e => { + e.addParticleUpdater("wobble", async container => { + const { WobbleUpdater } = await import("./WobbleUpdater.js"); + + return new WobbleUpdater(container); + }); + }); } diff --git a/updaters/wobble/webpack.config.js b/updaters/wobble/webpack.config.js index 9d663836643..da97d52ac62 100644 --- a/updaters/wobble/webpack.config.js +++ b/updaters/wobble/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesUpdater } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesUpdater } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesUpdater({ moduleName: "wobble", updaterName: "Wobble", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesUpdater({ moduleName: "wobble", updaterName: "Wobble", version, dir: __dirname }); diff --git a/utils/configs/.eslintignore b/utils/configs/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/utils/configs/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/utils/configs/.eslintrc.js b/utils/configs/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/utils/configs/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/utils/configs/CHANGELOG.md b/utils/configs/CHANGELOG.md index 83aafc73b17..61828ac671e 100644 --- a/utils/configs/CHANGELOG.md +++ b/utils/configs/CHANGELOG.md @@ -3,6 +3,15 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- added new falling confetti to demo configs ([a43767b](https://github.com/tsparticles/tsparticles/commit/a43767b71f9a4213080f35d31fe70a8f0b420f52)) +- improved fireworks demo configs ([71473ec](https://github.com/tsparticles/tsparticles/commit/71473ecb48e454613d01598709dac303ae017ef9)) +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) +- using p3 (hdr) images in configs (except gifs) ([3989373](https://github.com/tsparticles/tsparticles/commit/39893734cb9fa86e0631a2516ec50e66a43012f6)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/configs diff --git a/utils/configs/eslint.config.js b/utils/configs/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/utils/configs/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/utils/configs/package.dist.json b/utils/configs/package.dist.json index 4561a798055..fc20dce9742 100644 --- a/utils/configs/package.dist.json +++ b/utils/configs/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/configs", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles demo configurations", "homepage": "https://particles.js.org", "repository": { @@ -99,9 +99,10 @@ "./package.json": "./package.json" }, "dependencies": { - "@tsparticles/engine": "3.9.1" + "@tsparticles/engine": "4.0.0-alpha.0" }, "publishConfig": { "access": "public" - } + }, + "type": "module" } diff --git a/utils/configs/package.json b/utils/configs/package.json index 99ca9c85bab..494b72e803b 100644 --- a/utils/configs/package.json +++ b/utils/configs/package.json @@ -1,116 +1,117 @@ { - "name": "@tsparticles/configs", - "version": "3.9.1", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/configs", + "version": "4.0.0-alpha.0", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "utils/configs" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "utils/configs" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/engine": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/utils/configs/src/a/amongUs.ts b/utils/configs/src/a/amongUs.ts index 5ffa8bc9fe1..b1b9e758c0d 100644 --- a/utils/configs/src/a/amongUs.ts +++ b/utils/configs/src/a/amongUs.ts @@ -93,7 +93,7 @@ const options: ISourceOptions = { type: "images", options: { images: { - src: "https://particles.js.org/images/cyan_amongus.png", + src: "https://particles.js.org/images/hdr/cyan_amongus.png", width: 500, height: 634, }, diff --git a/utils/configs/src/b/backgroundMask.ts b/utils/configs/src/b/backgroundMask.ts index a053bd0f7f1..1d8b7e52783 100644 --- a/utils/configs/src/b/backgroundMask.ts +++ b/utils/configs/src/b/backgroundMask.ts @@ -75,7 +75,7 @@ const options: ISourceOptions = { }, background: { color: "#ffffff", - image: "url('https://particles.js.org/images/background3.jpg')", + image: "url('https://particles.js.org/images/hdr/background3.jpg')", position: "50% 50%", repeat: "no-repeat", size: "cover", diff --git a/utils/configs/src/b/backgroundMaskImage.ts b/utils/configs/src/b/backgroundMaskImage.ts index 368407353e4..33adab59a8f 100644 --- a/utils/configs/src/b/backgroundMaskImage.ts +++ b/utils/configs/src/b/backgroundMaskImage.ts @@ -58,12 +58,12 @@ const options: ISourceOptions = { backgroundMask: { enable: true, cover: { - image: "https://particles.js.org/images/background2.jpg", + image: "https://particles.js.org/images/hdr/background2.jpg", }, }, background: { color: "#ffffff", - image: "url('https://particles.js.org/images/background3.jpg')", + image: "url('https://particles.js.org/images/hdr/background3.jpg')", position: "50% 50%", repeat: "no-repeat", size: "cover", diff --git a/utils/configs/src/b/big.ts b/utils/configs/src/b/big.ts index 9db1ac99e26..df97c0e4f93 100644 --- a/utils/configs/src/b/big.ts +++ b/utils/configs/src/b/big.ts @@ -8,15 +8,52 @@ const options: ISourceOptions = { value: 30, }, color: { - value: ["#5bc0eb", "#fde74c", "#9bc53d", "#e55934", "#fa7921"], + value: [ + "#FF0000", + "#FF2A00", + "#FF5500", + "#FF8000", + "#FFAA00", + "#FFD400", + "#FFFF00", + "#D4FF00", + "#AAFF00", + "#80FF00", + "#55FF00", + "#2AFF00", + "#00FF00", + "#00FF2A", + "#00FF55", + "#00FF80", + "#00FFAA", + "#00FFD4", + "#00FFFF", + "#00D4FF", + "#00AAFF", + "#0080FF", + "#0055FF", + "#002AFF", + "#0000FF", + "#2A00FF", + "#5500FF", + "#8000FF", + "#AA00FF", + "#D400FF", + "#FF00FF", + "#FF00D4", + "#FF00AA", + "#FF0080", + "#FF0055", + "#FF002A", + ], }, shape: { type: "circle", }, opacity: { value: { - min: 0.4, - max: 0.8, + min: 0.5, + max: 0.9, }, }, size: { diff --git a/utils/configs/src/c/curlNoise.ts b/utils/configs/src/c/curlNoise.ts index b9cbf419c73..93cfc53046d 100644 --- a/utils/configs/src/c/curlNoise.ts +++ b/utils/configs/src/c/curlNoise.ts @@ -36,18 +36,18 @@ const options: ISourceOptions = { }, enable: true, speed: 3, - trail: { - fill: { - color: "#000", - }, - enable: true, - length: 1000, - }, }, }, background: { color: "#000000", }, + trail: { + fill: { + color: "#000", + }, + enable: true, + length: 1000, + }, }; export default options; diff --git a/utils/configs/src/e/emitterImageShape.ts b/utils/configs/src/e/emitterImageShape.ts index 515c8218f42..0e451c26856 100644 --- a/utils/configs/src/e/emitterImageShape.ts +++ b/utils/configs/src/e/emitterImageShape.ts @@ -102,7 +102,7 @@ const minFilterValue = 30, offset: 4, }, image: { - src: "https://particles.js.org/images/amongus_cyan.png", + src: "https://particles.js.org/images/hdr/amongus_cyan.png", }, }, true, diff --git a/utils/configs/src/e/emitterImages.ts b/utils/configs/src/e/emitterImages.ts index 68d07d900bf..202d53c25da 100644 --- a/utils/configs/src/e/emitterImages.ts +++ b/utils/configs/src/e/emitterImages.ts @@ -47,82 +47,82 @@ const options: ISourceOptions = { options: { image: [ { - src: "https://particles.js.org/images/fruits/apple.png", + src: "https://particles.js.org/images/hdr/fruits/apple.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/avocado.png", + src: "https://particles.js.org/images/hdr/fruits/avocado.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/banana.png", + src: "https://particles.js.org/images/hdr/fruits/banana.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/berries.png", + src: "https://particles.js.org/images/hdr/fruits/berries.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/cherry.png", + src: "https://particles.js.org/images/hdr/fruits/cherry.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/grapes.png", + src: "https://particles.js.org/images/hdr/fruits/grapes.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/lemon.png", + src: "https://particles.js.org/images/hdr/fruits/lemon.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/orange.png", + src: "https://particles.js.org/images/hdr/fruits/orange.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/peach.png", + src: "https://particles.js.org/images/hdr/fruits/peach.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pear.png", + src: "https://particles.js.org/images/hdr/fruits/pear.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pepper.png", + src: "https://particles.js.org/images/hdr/fruits/pepper.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/plum.png", + src: "https://particles.js.org/images/hdr/fruits/plum.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/star.png", + src: "https://particles.js.org/images/hdr/fruits/star.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/strawberry.png", + src: "https://particles.js.org/images/hdr/fruits/strawberry.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon_slice.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon_slice.png", width: 32, height: 32, }, diff --git a/utils/configs/src/e/emitterPaths.ts b/utils/configs/src/e/emitterPaths.ts index ca2bb7f6327..f917a96e1c0 100644 --- a/utils/configs/src/e/emitterPaths.ts +++ b/utils/configs/src/e/emitterPaths.ts @@ -12,11 +12,6 @@ const options: ISourceOptions = { }, move: { enable: true, - trail: { - enable: true, - fill: { color: "#fff" }, - length: 20, - }, outModes: "destroy", }, shape: { @@ -87,6 +82,11 @@ const options: ISourceOptions = { }, }, ], + trail: { + enable: true, + fill: { color: "#fff" }, + length: 20, + }, }; export default options; diff --git a/utils/configs/src/f/fallingConfetti.ts b/utils/configs/src/f/fallingConfetti.ts new file mode 100644 index 00000000000..a2c007c7882 --- /dev/null +++ b/utils/configs/src/f/fallingConfetti.ts @@ -0,0 +1,139 @@ +import type { ISourceOptions } from "@tsparticles/engine"; + +const options: ISourceOptions = { + key: "fallingConfetti", + name: "Falling Confetti", + background: { + color: "#000000", + }, + particles: { + color: { + value: [ + "#FF0000", + "#FF2A00", + "#FF5500", + "#FF8000", + "#FFAA00", + "#FFD400", + "#FFFF00", + "#D4FF00", + "#AAFF00", + "#80FF00", + "#55FF00", + "#2AFF00", + "#00FF00", + "#00FF2A", + "#00FF55", + "#00FF80", + "#00FFAA", + "#00FFD4", + "#00FFFF", + "#00D4FF", + "#00AAFF", + "#0080FF", + "#0055FF", + "#002AFF", + "#0000FF", + "#2A00FF", + "#5500FF", + "#8000FF", + "#AA00FF", + "#D400FF", + "#FF00FF", + "#FF00D4", + "#FF00AA", + "#FF0080", + "#FF0055", + "#FF002A", + ], + animation: { + enable: true, + speed: 30, + }, + }, + move: { + direction: "bottom", + enable: true, + outModes: "out", + speed: { + min: 3, + max: 10, + }, + }, + number: { + value: 300, + }, + opacity: { + value: 1, + }, + rotate: { + value: { + min: 0, + max: 360, + }, + direction: "random", + move: true, + animation: { + enable: true, + speed: 60, + }, + }, + tilt: { + direction: "random", + enable: true, + value: { + min: 0, + max: 360, + }, + animation: { + enable: true, + speed: 60, + }, + }, + shape: { + type: ["circle", "square", "polygon"], + options: { + polygon: [ + { + sides: 5, + }, + { + sides: 6, + }, + ], + }, + }, + size: { + value: { + min: 5, + max: 15, + }, + }, + roll: { + darken: { + enable: true, + value: 30, + }, + enlighten: { + enable: true, + value: 30, + }, + enable: true, + mode: "both", + speed: { + min: 15, + max: 25, + }, + }, + wobble: { + distance: 30, + enable: true, + move: true, + speed: { + min: -15, + max: 15, + }, + }, + }, +}; +export default options; diff --git a/utils/configs/src/f/fireworks.ts b/utils/configs/src/f/fireworks.ts index 5dda1b3f31e..5224993fbe0 100644 --- a/utils/configs/src/f/fireworks.ts +++ b/utils/configs/src/f/fireworks.ts @@ -51,7 +51,44 @@ const options: ISourceOptions = { width: 0, }, color: { - value: ["#ff595e", "#ffca3a", "#8ac926", "#1982c4", "#6a4c93"], + value: [ + "#FF0000", + "#FF2A00", + "#FF5500", + "#FF8000", + "#FFAA00", + "#FFD400", + "#FFFF00", + "#D4FF00", + "#AAFF00", + "#80FF00", + "#55FF00", + "#2AFF00", + "#00FF00", + "#00FF2A", + "#00FF55", + "#00FF80", + "#00FFAA", + "#00FFD4", + "#00FFFF", + "#00D4FF", + "#00AAFF", + "#0080FF", + "#0055FF", + "#002AFF", + "#0000FF", + "#2A00FF", + "#5500FF", + "#8000FF", + "#AA00FF", + "#D400FF", + "#FF00FF", + "#FF00D4", + "#FF00AA", + "#FF0080", + "#FF0055", + "#FF002A", + ], }, number: { value: 0, @@ -158,11 +195,6 @@ const options: ISourceOptions = { default: "destroy", top: "none", }, - trail: { - fill: { color: "#000" }, - enable: true, - length: 10, - }, }, }, sounds: { @@ -180,6 +212,11 @@ const options: ISourceOptions = { ], volume: 50, }, + trail: { + fill: { color: "#000" }, + enable: true, + length: 10, + }, }; export default options; diff --git a/utils/configs/src/f/fireworks2.ts b/utils/configs/src/f/fireworks2.ts index b33aaed790e..b63766bd2d1 100644 --- a/utils/configs/src/f/fireworks2.ts +++ b/utils/configs/src/f/fireworks2.ts @@ -7,17 +7,7 @@ const options: ISourceOptions = { enable: true, }, background: { - color: "#ffffff", - image: "url('https://particles.js.org/images/background3.jpg')", - position: "50% 50%", - repeat: "no-repeat", - size: "cover", - }, - backgroundMask: { - enable: true, - cover: { - color: "#000", - }, + color: "#000", }, emitters: { direction: "top", @@ -64,7 +54,44 @@ const options: ISourceOptions = { width: 0, }, color: { - value: ["#ff595e", "#ffca3a", "#8ac926", "#1982c4", "#6a4c93"], + value: [ + "#FF0000", + "#FF2A00", + "#FF5500", + "#FF8000", + "#FFAA00", + "#FFD400", + "#FFFF00", + "#D4FF00", + "#AAFF00", + "#80FF00", + "#55FF00", + "#2AFF00", + "#00FF00", + "#00FF2A", + "#00FF55", + "#00FF80", + "#00FFAA", + "#00FFD4", + "#00FFFF", + "#00D4FF", + "#00AAFF", + "#0080FF", + "#0055FF", + "#002AFF", + "#0000FF", + "#2A00FF", + "#5500FF", + "#8000FF", + "#AA00FF", + "#D400FF", + "#FF00FF", + "#FF00D4", + "#FF00AA", + "#FF0080", + "#FF0055", + "#FF002A", + ], }, number: { value: 0, diff --git a/utils/configs/src/f/fireworksMask.ts b/utils/configs/src/f/fireworksMask.ts new file mode 100644 index 00000000000..254e09ff654 --- /dev/null +++ b/utils/configs/src/f/fireworksMask.ts @@ -0,0 +1,197 @@ +import { EventType, type ISourceOptions, type Particle } from "@tsparticles/engine"; + +const options: ISourceOptions = { + key: "fireworksMask", + name: "Fireworks Background Mask", + fullScreen: { + enable: true, + }, + background: { + color: "#ffffff", + image: "url('https://particles.js.org/images/hdr/background3.jpg')", + position: "50% 50%", + repeat: "no-repeat", + size: "cover", + }, + backgroundMask: { + enable: true, + cover: { + color: "#000", + }, + }, + emitters: { + direction: "top", + life: { + count: 0, + duration: 0.1, + delay: 0.1, + }, + rate: { + delay: 0.15, + quantity: 1, + }, + size: { + width: 100, + height: 0, + }, + position: { + y: 100, + x: 50, + }, + }, + particles: { + color: { + value: "#fff", + }, + number: { + value: 0, + }, + destroy: { + bounds: { + top: 30, + }, + mode: "split", + split: { + count: 1, + factor: { + value: 0.333333, + }, + rate: { + value: 100, + }, + particles: { + stroke: { + width: 0, + }, + color: { + value: ["#ff595e", "#ffca3a", "#8ac926", "#1982c4", "#6a4c93"], + }, + number: { + value: 0, + }, + collisions: { + enable: false, + }, + destroy: { + bounds: { + top: 0, + }, + }, + opacity: { + value: { + min: 0.1, + max: 1, + }, + animation: { + enable: true, + speed: 0.7, + sync: false, + startValue: "max", + destroy: "min", + }, + }, + effect: { + type: "trail", + options: { + trail: { + length: { + min: 5, + max: 10, + }, + }, + }, + }, + shape: { + type: "circle", + }, + size: { + value: 2, + animation: { + enable: false, + }, + }, + life: { + count: 1, + duration: { + value: { + min: 1, + max: 2, + }, + }, + }, + move: { + enable: true, + gravity: { + enable: true, + acceleration: 9.81, + inverse: false, + }, + decay: 0.1, + speed: { + min: 10, + max: 25, + }, + direction: "outside", + outModes: "destroy", + }, + }, + }, + }, + life: { + count: 1, + }, + effect: { + type: "trail", + options: { + trail: { + length: { + min: 10, + max: 30, + }, + minWidth: 1, + maxWidth: 1, + }, + }, + }, + shape: { + type: "circle", + }, + size: { + value: 1, + }, + move: { + enable: true, + gravity: { + acceleration: 15, + enable: true, + inverse: true, + maxSpeed: 100, + }, + speed: { + min: 10, + max: 20, + }, + outModes: { + default: "destroy", + top: "none", + }, + }, + }, + sounds: { + enable: true, + events: [ + { + event: EventType.particleRemoved, + filter: (args: { data: { particle: Particle } }) => args.data.particle.options.move.gravity.inverse, + audio: [ + "https://particles.js.org/audio/explosion0.mp3", + "https://particles.js.org/audio/explosion1.mp3", + "https://particles.js.org/audio/explosion2.mp3", + ], + }, + ], + volume: 50, + }, +}; + +export default options; diff --git a/utils/configs/src/f/fontawesome.ts b/utils/configs/src/f/fontawesome.ts index 18da569ccac..43f52f642ca 100644 --- a/utils/configs/src/f/fontawesome.ts +++ b/utils/configs/src/f/fontawesome.ts @@ -35,11 +35,6 @@ const options: ISourceOptions = { distance: 150, enable: true, opacity: 0.4, - shadow: { - blur: 5, - color: "lime", - enable: false, - }, width: 1, }, move: { diff --git a/utils/configs/src/f/forward.ts b/utils/configs/src/f/forward.ts index cfc5715a874..3dda231f8e7 100644 --- a/utils/configs/src/f/forward.ts +++ b/utils/configs/src/f/forward.ts @@ -29,7 +29,7 @@ const options: ISourceOptions = { type: "image", options: { image: { - src: "https://particles.js.org/images/arrow.png", + src: "https://particles.js.org/images/hdr/arrow.png", width: 512, height: 512, replaceColor: true, diff --git a/utils/configs/src/f/index.ts b/utils/configs/src/f/index.ts index ab73dce87fe..35b3a3b588e 100644 --- a/utils/configs/src/f/index.ts +++ b/utils/configs/src/f/index.ts @@ -1,11 +1,15 @@ +import fallingConfetti from "./fallingConfetti.js"; import fireworks from "./fireworks.js"; import fireworks2 from "./fireworks2.js"; +import fireworksMask from "./fireworksMask.js"; import fontawesome from "./fontawesome.js"; import forward from "./forward.js"; export default { + fallingConfetti, fireworks, fireworks2, + fireworksMask, fontawesome, forward, }; diff --git a/utils/configs/src/g/gravity.ts b/utils/configs/src/g/gravity.ts index 0156c85460b..b6b584ac7f0 100644 --- a/utils/configs/src/g/gravity.ts +++ b/utils/configs/src/g/gravity.ts @@ -49,11 +49,6 @@ const options: ISourceOptions = { default: "bounce", top: "none", }, - trail: { - enable: true, - fill: { color: "#000000" }, - length: 10, - }, }, }, background: { @@ -114,5 +109,10 @@ const options: ISourceOptions = { }, }, }, + trail: { + enable: true, + fill: { color: "#000000" }, + length: 10, + }, }; export default options; diff --git a/utils/configs/src/g/index.ts b/utils/configs/src/g/index.ts index bd879d3ff75..97a77878fc4 100644 --- a/utils/configs/src/g/index.ts +++ b/utils/configs/src/g/index.ts @@ -2,7 +2,7 @@ import gifs from "./gifs.js"; import grabRandomColor from "./grabRandomColor.js"; import gradients from "./gradients.js"; import gravity from "./gravity.js"; -import groups from "./groups"; +import groups from "./groups.js"; import growing from "./growing.js"; export default { diff --git a/utils/configs/src/h/hexagonPath.ts b/utils/configs/src/h/hexagonPath.ts index 43739150e58..ff67e477b6e 100644 --- a/utils/configs/src/h/hexagonPath.ts +++ b/utils/configs/src/h/hexagonPath.ts @@ -31,11 +31,6 @@ const options: ISourceOptions = { }, }, speed: 3, - trail: { - fill: { color: "#000" }, - length: 20, - enable: true, - }, }, number: { density: { @@ -71,6 +66,11 @@ const options: ISourceOptions = { y: 50, }, }, + trail: { + fill: { color: "#000" }, + length: 20, + enable: true, + }, }; export default options; diff --git a/utils/configs/src/h/hollowknight.ts b/utils/configs/src/h/hollowknight.ts index e0add0dc882..0268d38413d 100644 --- a/utils/configs/src/h/hollowknight.ts +++ b/utils/configs/src/h/hollowknight.ts @@ -107,7 +107,7 @@ const options: ISourceOptions = { }, scale: 2, type: "inline", - url: "https://particles.js.org/images/hollowknight.svg", + url: "https://particles.js.org/images/hdr/hollowknight.svg", }, background: { color: "#000000", diff --git a/utils/configs/src/h/hyperspace.ts b/utils/configs/src/h/hyperspace.ts index ca87efbc14b..fb87b95dae2 100644 --- a/utils/configs/src/h/hyperspace.ts +++ b/utils/configs/src/h/hyperspace.ts @@ -16,11 +16,6 @@ const options: ISourceOptions = { default: "destroy", }, speed: 3, - trail: { - fill: { color: "#000" }, - length: 30, - enable: true, - }, }, number: { density: { @@ -63,6 +58,11 @@ const options: ISourceOptions = { y: 50, }, }, + trail: { + fill: { color: "#000" }, + length: 30, + enable: true, + }, }; export default options; diff --git a/utils/configs/src/i/imageMask.ts b/utils/configs/src/i/imageMask.ts index 37f01e8d7d4..7b17936b02a 100644 --- a/utils/configs/src/i/imageMask.ts +++ b/utils/configs/src/i/imageMask.ts @@ -57,7 +57,7 @@ const minFilterValue = 30, : pixel.a > minFilterAlpha, }, image: { - src: "https://particles.js.org/images/amongus_cyan.png", + src: "https://particles.js.org/images/hdr/amongus_cyan.png", }, }, background: { diff --git a/utils/configs/src/i/images.ts b/utils/configs/src/i/images.ts index 99f1f1b9b51..229dfe2c157 100644 --- a/utils/configs/src/i/images.ts +++ b/utils/configs/src/i/images.ts @@ -119,97 +119,97 @@ const options: ISourceOptions = { }, preload: [ { - src: "https://particles.js.org/images/fruits/apple.png", + src: "https://particles.js.org/images/hdr/fruits/apple.png", name: "apple", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/avocado.png", + src: "https://particles.js.org/images/hdr/fruits/avocado.png", name: "avocado", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/banana.png", + src: "https://particles.js.org/images/hdr/fruits/banana.png", name: "banana", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/berries.png", + src: "https://particles.js.org/images/hdr/fruits/berries.png", name: "berries", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/cherry.png", + src: "https://particles.js.org/images/hdr/fruits/cherry.png", name: "cherry", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/grapes.png", + src: "https://particles.js.org/images/hdr/fruits/grapes.png", name: "grapes", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/lemon.png", + src: "https://particles.js.org/images/hdr/fruits/lemon.png", name: "lemon", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/orange.png", + src: "https://particles.js.org/images/hdr/fruits/orange.png", name: "orange", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/peach.png", + src: "https://particles.js.org/images/hdr/fruits/peach.png", name: "peach", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pear.png", + src: "https://particles.js.org/images/hdr/fruits/pear.png", name: "pear", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pepper.png", + src: "https://particles.js.org/images/hdr/fruits/pepper.png", name: "pepper", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/plum.png", + src: "https://particles.js.org/images/hdr/fruits/plum.png", name: "plum", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/star.png", + src: "https://particles.js.org/images/hdr/fruits/star.png", name: "star", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/strawberry.png", + src: "https://particles.js.org/images/hdr/fruits/strawberry.png", name: "strawberry", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon.png", name: "watermelon", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon_slice.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon_slice.png", name: "watermelon_slice", width: 32, height: 32, diff --git a/utils/configs/src/i/imagesDirections.ts b/utils/configs/src/i/imagesDirections.ts index 3257a0c0cc5..930c5ec7b7b 100644 --- a/utils/configs/src/i/imagesDirections.ts +++ b/utils/configs/src/i/imagesDirections.ts @@ -58,7 +58,7 @@ const options: ISourceOptions = { options: { image: [ { - src: "https://particles.js.org/images/fruits/apple.png", + src: "https://particles.js.org/images/hdr/fruits/apple.png", width: 32, height: 32, particles: { @@ -68,7 +68,7 @@ const options: ISourceOptions = { }, }, { - src: "https://particles.js.org/images/fruits/avocado.png", + src: "https://particles.js.org/images/hdr/fruits/avocado.png", width: 32, height: 32, particles: { diff --git a/utils/configs/src/index.ts b/utils/configs/src/index.ts index d12b529fc51..3b45f9d870c 100644 --- a/utils/configs/src/index.ts +++ b/utils/configs/src/index.ts @@ -56,7 +56,13 @@ const configs = { }; for (const key of Object.keys(configs)) { - tsParticles.addConfig((configs as Record)[key]); + const config = (configs as Record)[key]; + + if (!config) { + continue; + } + + tsParticles.addConfig(config); } export default configs; diff --git a/utils/configs/src/m/multiplePolygonMasks.ts b/utils/configs/src/m/multiplePolygonMasks.ts index 2edf54b1fd3..8505a90c2c9 100644 --- a/utils/configs/src/m/multiplePolygonMasks.ts +++ b/utils/configs/src/m/multiplePolygonMasks.ts @@ -117,7 +117,7 @@ const options: ISourceOptions = { }, scale: 1, type: "inline", - url: "https://particles.js.org/images/google.svg", + url: "https://particles.js.org/images/hdr/google.svg", }, background: { color: "#000000", diff --git a/utils/configs/src/n/noisePlanesFractal.ts b/utils/configs/src/n/noisePlanesFractal.ts index 501b171c539..2b037766700 100644 --- a/utils/configs/src/n/noisePlanesFractal.ts +++ b/utils/configs/src/n/noisePlanesFractal.ts @@ -44,7 +44,7 @@ const options: ISourceOptions = { path: { enable: true, options: { - size: 32, + size: 64, draw: false, increment: 0.004, }, @@ -70,7 +70,7 @@ const options: ISourceOptions = { options: { image: { height: 128, - src: "https://particles.js.org/images/plane_alt.png", + src: "https://particles.js.org/images/hdr/plane_alt.png", width: 128, }, }, diff --git a/utils/configs/src/n/noisePlanesPerlin.ts b/utils/configs/src/n/noisePlanesPerlin.ts index d26bb98482d..f89bbf1cffa 100644 --- a/utils/configs/src/n/noisePlanesPerlin.ts +++ b/utils/configs/src/n/noisePlanesPerlin.ts @@ -70,7 +70,7 @@ const options: ISourceOptions = { options: { image: { height: 128, - src: "https://particles.js.org/images/plane_alt.png", + src: "https://particles.js.org/images/hdr/plane_alt.png", width: 128, }, }, diff --git a/utils/configs/src/n/noisePlanesSimplex.ts b/utils/configs/src/n/noisePlanesSimplex.ts index e060ad2f6e8..e15b105acd2 100644 --- a/utils/configs/src/n/noisePlanesSimplex.ts +++ b/utils/configs/src/n/noisePlanesSimplex.ts @@ -70,7 +70,7 @@ const options: ISourceOptions = { options: { image: { height: 128, - src: "https://particles.js.org/images/plane_alt.png", + src: "https://particles.js.org/images/hdr/plane_alt.png", width: 128, }, }, diff --git a/utils/configs/src/p/pathSvg.ts b/utils/configs/src/p/pathSvg.ts index 0fdc4771142..d9d2c3881f4 100644 --- a/utils/configs/src/p/pathSvg.ts +++ b/utils/configs/src/p/pathSvg.ts @@ -26,13 +26,6 @@ const options: ISourceOptions = { }, generator: "svgPathGenerator", }, - trail: { - enable: true, - length: 10, - fill: { - color: "#000000", - }, - }, }, number: { value: 80, @@ -50,6 +43,13 @@ const options: ISourceOptions = { background: { color: "#000000", }, + trail: { + enable: true, + length: 10, + fill: { + color: "#000000", + }, + }, }; export default options; diff --git a/utils/configs/src/p/pathZigZag.ts b/utils/configs/src/p/pathZigZag.ts index 857349dec7e..de0a16c0310 100644 --- a/utils/configs/src/p/pathZigZag.ts +++ b/utils/configs/src/p/pathZigZag.ts @@ -19,13 +19,6 @@ const options: ISourceOptions = { }, generator: "zigZagPathGenerator", }, - trail: { - enable: true, - length: 20, - fill: { - color: "#000000", - }, - }, }, number: { value: 80, @@ -43,6 +36,13 @@ const options: ISourceOptions = { background: { color: "#000000", }, + trail: { + enable: true, + length: 20, + fill: { + color: "#000000", + }, + }, }; export default options; diff --git a/utils/configs/src/p/planes.ts b/utils/configs/src/p/planes.ts index 15090fb6c43..c95512b97c8 100644 --- a/utils/configs/src/p/planes.ts +++ b/utils/configs/src/p/planes.ts @@ -41,7 +41,7 @@ const options: ISourceOptions = { options: { image: { height: 128, - src: "https://particles.js.org/images/plane_alt.png", + src: "https://particles.js.org/images/hdr/plane_alt.png", width: 128, }, }, diff --git a/utils/configs/src/p/polygonMask.ts b/utils/configs/src/p/polygonMask.ts index 43da6d6c945..a9db88abf59 100644 --- a/utils/configs/src/p/polygonMask.ts +++ b/utils/configs/src/p/polygonMask.ts @@ -117,7 +117,7 @@ const options: ISourceOptions = { }, scale: 0.5, type: "inline", - url: "https://particles.js.org/images/smalldeer.svg", + url: "https://particles.js.org/images/hdr/smalldeer.svg", }, background: { color: "#000000", diff --git a/utils/configs/src/r/randomShapes.ts b/utils/configs/src/r/randomShapes.ts index f975a88a915..2f16fdd944f 100644 --- a/utils/configs/src/r/randomShapes.ts +++ b/utils/configs/src/r/randomShapes.ts @@ -319,97 +319,97 @@ const options: ISourceOptions = { }, preload: [ { - src: "https://particles.js.org/images/fruits/apple.png", + src: "https://particles.js.org/images/hdr/fruits/apple.png", name: "apple", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/avocado.png", + src: "https://particles.js.org/images/hdr/fruits/avocado.png", name: "avocado", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/banana.png", + src: "https://particles.js.org/images/hdr/fruits/banana.png", name: "banana", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/berries.png", + src: "https://particles.js.org/images/hdr/fruits/berries.png", name: "berries", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/cherry.png", + src: "https://particles.js.org/images/hdr/fruits/cherry.png", name: "cherry", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/grapes.png", + src: "https://particles.js.org/images/hdr/fruits/grapes.png", name: "grapes", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/lemon.png", + src: "https://particles.js.org/images/hdr/fruits/lemon.png", name: "lemon", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/orange.png", + src: "https://particles.js.org/images/hdr/fruits/orange.png", name: "orange", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/peach.png", + src: "https://particles.js.org/images/hdr/fruits/peach.png", name: "peach", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pear.png", + src: "https://particles.js.org/images/hdr/fruits/pear.png", name: "pear", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pepper.png", + src: "https://particles.js.org/images/hdr/fruits/pepper.png", name: "pepper", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/plum.png", + src: "https://particles.js.org/images/hdr/fruits/plum.png", name: "plum", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/star.png", + src: "https://particles.js.org/images/hdr/fruits/star.png", name: "star", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/strawberry.png", + src: "https://particles.js.org/images/hdr/fruits/strawberry.png", name: "strawberry", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon.png", name: "watermelon", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon_slice.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon_slice.png", name: "watermelon_slice", width: 32, height: 32, diff --git a/utils/configs/src/r/reactDefaults.ts b/utils/configs/src/r/reactDefaults.ts index 2ef011bb794..47bbad0f337 100644 --- a/utils/configs/src/r/reactDefaults.ts +++ b/utils/configs/src/r/reactDefaults.ts @@ -33,11 +33,6 @@ const options: ISourceOptions = { color: "#FFF", opacity: 0.6, width: 1, - shadow: { - enable: false, - blur: 5, - color: "lime", - }, }, move: { enable: true, diff --git a/utils/configs/src/r/reactMultipleImages.ts b/utils/configs/src/r/reactMultipleImages.ts index c1f559e3f5c..fac6f132853 100644 --- a/utils/configs/src/r/reactMultipleImages.ts +++ b/utils/configs/src/r/reactMultipleImages.ts @@ -46,7 +46,7 @@ const options: ISourceOptions = { { height: 20, replaceColor: true, - src: "https://particles.js.org/images/fruits/cherry.png", + src: "https://particles.js.org/images/hdr/fruits/cherry.png", width: 23, fill: true, close: true, @@ -54,7 +54,7 @@ const options: ISourceOptions = { { height: 20, replaceColor: true, - src: "https://particles.js.org/images/fruits/grapes.png", + src: "https://particles.js.org/images/hdr/fruits/grapes.png", width: 20, fill: true, close: true, @@ -62,7 +62,7 @@ const options: ISourceOptions = { { height: 20, replaceColor: true, - src: "https://particles.js.org/images/fruits/lemon.png", + src: "https://particles.js.org/images/hdr/fruits/lemon.png", width: 20, fill: true, close: true, diff --git a/utils/configs/src/r/reactNightSky.ts b/utils/configs/src/r/reactNightSky.ts index 9883ea43290..8af0cf63f8e 100644 --- a/utils/configs/src/r/reactNightSky.ts +++ b/utils/configs/src/r/reactNightSky.ts @@ -29,13 +29,6 @@ const options: ISourceOptions = { distance: 150, enable: true, opacity: 0.02, - shadow: { - blur: 5, - color: { - value: "lime", - }, - enable: false, - }, width: 1, }, move: { diff --git a/utils/configs/src/r/reactPolygonMask.ts b/utils/configs/src/r/reactPolygonMask.ts index d406de3a6b5..72d6b03b4c6 100644 --- a/utils/configs/src/r/reactPolygonMask.ts +++ b/utils/configs/src/r/reactPolygonMask.ts @@ -32,13 +32,6 @@ const options: ISourceOptions = { distance: 30, enable: true, opacity: 0.4, - shadow: { - blur: 5, - color: { - value: "lime", - }, - enable: false, - }, width: 1, }, move: { @@ -86,7 +79,7 @@ const options: ISourceOptions = { }, scale: 0.5, type: "inline", - url: "https://particles.js.org/images/smalldeer.svg", + url: "https://particles.js.org/images/hdr/smalldeer.svg", }, pauseOnBlur: true, background: { diff --git a/utils/configs/src/r/reactSimple.ts b/utils/configs/src/r/reactSimple.ts index 34308550347..9adcc48172d 100644 --- a/utils/configs/src/r/reactSimple.ts +++ b/utils/configs/src/r/reactSimple.ts @@ -30,13 +30,6 @@ const options: ISourceOptions = { distance: 150, enable: true, opacity: 0.6, - shadow: { - blur: 5, - color: { - value: "lime", - }, - enable: false, - }, width: 1, }, move: { @@ -67,17 +60,6 @@ const options: ISourceOptions = { size: { value: 3, }, - shadow: { - blur: 0, - color: { - value: "#000000", - }, - enable: false, - offset: { - x: 0, - y: 0, - }, - }, stroke: { color: { value: "#ff0000", diff --git a/utils/configs/src/r/reactSnow.ts b/utils/configs/src/r/reactSnow.ts index f306d3f2109..96b0b0a1bed 100644 --- a/utils/configs/src/r/reactSnow.ts +++ b/utils/configs/src/r/reactSnow.ts @@ -59,13 +59,6 @@ const options: ISourceOptions = { distance: 150, enable: false, opacity: 0.6, - shadow: { - blur: 5, - color: { - value: "lime", - }, - enable: false, - }, width: 1, }, move: { diff --git a/utils/configs/src/r/reduceDuplicates.ts b/utils/configs/src/r/reduceDuplicates.ts index bfae08de5db..c5c67e00af0 100644 --- a/utils/configs/src/r/reduceDuplicates.ts +++ b/utils/configs/src/r/reduceDuplicates.ts @@ -36,82 +36,82 @@ const options: ISourceOptions = { options: { image: [ { - src: "https://particles.js.org/images/fruits/apple.png", + src: "https://particles.js.org/images/hdr/fruits/apple.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/avocado.png", + src: "https://particles.js.org/images/hdr/fruits/avocado.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/banana.png", + src: "https://particles.js.org/images/hdr/fruits/banana.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/berries.png", + src: "https://particles.js.org/images/hdr/fruits/berries.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/cherry.png", + src: "https://particles.js.org/images/hdr/fruits/cherry.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/grapes.png", + src: "https://particles.js.org/images/hdr/fruits/grapes.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/lemon.png", + src: "https://particles.js.org/images/hdr/fruits/lemon.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/orange.png", + src: "https://particles.js.org/images/hdr/fruits/orange.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/peach.png", + src: "https://particles.js.org/images/hdr/fruits/peach.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pear.png", + src: "https://particles.js.org/images/hdr/fruits/pear.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/pepper.png", + src: "https://particles.js.org/images/hdr/fruits/pepper.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/plum.png", + src: "https://particles.js.org/images/hdr/fruits/plum.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/star.png", + src: "https://particles.js.org/images/hdr/fruits/star.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/strawberry.png", + src: "https://particles.js.org/images/hdr/fruits/strawberry.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon.png", width: 32, height: 32, }, { - src: "https://particles.js.org/images/fruits/watermelon_slice.png", + src: "https://particles.js.org/images/hdr/fruits/watermelon_slice.png", width: 32, height: 32, }, diff --git a/utils/configs/src/r/ring.ts b/utils/configs/src/r/ring.ts index 0350312df52..a167214bb81 100644 --- a/utils/configs/src/r/ring.ts +++ b/utils/configs/src/r/ring.ts @@ -23,11 +23,6 @@ const options: ISourceOptions = { value: 0.75, }, }, - trail: { - enable: true, - fill: { color: "#031927" }, - length: 1000, - }, }, shape: { type: "circle", @@ -66,6 +61,11 @@ const options: ISourceOptions = { }, startCount: 1000, }, + trail: { + enable: true, + fill: { color: "#031927" }, + length: 1000, + }, }; export default options; diff --git a/utils/configs/src/s/seaAnemone.ts b/utils/configs/src/s/seaAnemone.ts index 1002eaabdba..65ec3bc9970 100644 --- a/utils/configs/src/s/seaAnemone.ts +++ b/utils/configs/src/s/seaAnemone.ts @@ -22,11 +22,6 @@ const options: ISourceOptions = { generator: "curvesPathGenerator", }, speed: 1, - trail: { - fill: { color: "#000" }, - length: 30, - enable: true, - }, }, number: { density: { @@ -79,6 +74,11 @@ const options: ISourceOptions = { y: 50, }, }, + trail: { + fill: { color: "#000" }, + length: 30, + enable: true, + }, }; export default options; diff --git a/utils/configs/src/s/shadow.ts b/utils/configs/src/s/shadow.ts index 411d6c9c99f..56bb1351de6 100644 --- a/utils/configs/src/s/shadow.ts +++ b/utils/configs/src/s/shadow.ts @@ -14,13 +14,18 @@ const options: ISourceOptions = { color: { value: "#ffffff", }, - shadow: { - enable: true, - color: "#000000", - blur: 5, - offset: { - x: 3, - y: 3, + effect: { + type: "shadow", + options: { + shadow: { + enable: true, + color: "#000000", + blur: 5, + offset: { + x: 3, + y: 3, + }, + }, }, }, shape: { diff --git a/utils/configs/src/s/shapeOptions.ts b/utils/configs/src/s/shapeOptions.ts index c9019fe64cb..046130d5206 100644 --- a/utils/configs/src/s/shapeOptions.ts +++ b/utils/configs/src/s/shapeOptions.ts @@ -27,12 +27,12 @@ const options: ISourceOptions = { image: [ { height: 128, - src: "https://particles.js.org/images/plane_alt.png", + src: "https://particles.js.org/images/hdr/plane_alt.png", width: 128, }, { height: 128, - src: "https://particles.js.org/images/plane_alt.png", + src: "https://particles.js.org/images/hdr/plane_alt.png", width: 128, particles: { rotate: { diff --git a/utils/configs/src/s/speedDecay.ts b/utils/configs/src/s/speedDecay.ts index 6f1d9236d17..270fdff3913 100644 --- a/utils/configs/src/s/speedDecay.ts +++ b/utils/configs/src/s/speedDecay.ts @@ -45,11 +45,6 @@ const options: ISourceOptions = { right: "destroy", top: "none", }, - trail: { - enable: true, - fill: { color: "#000000" }, - length: 10, - }, }, }, interactivity: { @@ -140,6 +135,11 @@ const options: ISourceOptions = { }, }, }, + trail: { + enable: true, + fill: { color: "#000000" }, + length: 10, + }, }; export default options; diff --git a/utils/configs/src/s/spin.ts b/utils/configs/src/s/spin.ts index ca9c1160d14..3b0d932db3e 100644 --- a/utils/configs/src/s/spin.ts +++ b/utils/configs/src/s/spin.ts @@ -40,15 +40,15 @@ const options: ISourceOptions = { }, enable: true, }, - trail: { - enable: true, - fill: { color: "#000" }, - length: 30, - }, }, }, background: { color: "#000000", }, + trail: { + enable: true, + fill: { color: "#000" }, + length: 30, + }, }; export default options; diff --git a/utils/configs/src/s/style.ts b/utils/configs/src/s/style.ts index 7ab6dc3c79f..1b269c6e097 100644 --- a/utils/configs/src/s/style.ts +++ b/utils/configs/src/s/style.ts @@ -32,13 +32,6 @@ const options: ISourceOptions = { enable: true, speed: 6, direction: "none", - trail: { - enable: true, - length: 50, - fill: { - color: "#000", - }, - }, path: { enable: true, delay: { @@ -80,5 +73,12 @@ const options: ISourceOptions = { style: { filter: "blur(50px)", }, + trail: { + enable: true, + length: 50, + fill: { + color: "#000", + }, + }, }; export default options; diff --git a/utils/configs/src/t/trail.ts b/utils/configs/src/t/trail.ts index b9377b4f0e7..713b1fd2808 100644 --- a/utils/configs/src/t/trail.ts +++ b/utils/configs/src/t/trail.ts @@ -36,7 +36,7 @@ const options: ISourceOptions = { value: 1, }, size: { - value: 3, + value: 5, }, move: { enable: true, @@ -48,17 +48,12 @@ const options: ISourceOptions = { value: 0.1, }, options: { - size: 20, + size: 64, draw: false, increment: 0.001, }, generator: "perlinNoise", }, - trail: { - enable: true, - fill: { color: "#000000" }, - length: 20, - }, }, }, interactivity: { @@ -96,6 +91,11 @@ const options: ISourceOptions = { }, }, }, + trail: { + enable: true, + fill: { color: "#000000" }, + length: 20, + }, }; export default options; diff --git a/utils/configs/src/t/trailImage.ts b/utils/configs/src/t/trailImage.ts index bfd7c78ccea..a16532e8df2 100644 --- a/utils/configs/src/t/trailImage.ts +++ b/utils/configs/src/t/trailImage.ts @@ -5,7 +5,7 @@ const options: ISourceOptions = { name: "Trails Image", background: { color: "#ffffff", - image: "url('https://particles.js.org/images/background3.jpg')", + image: "url('https://particles.js.org/images/hdr/background3.jpg')", position: "50% 50%", repeat: "no-repeat", size: "cover", @@ -40,7 +40,7 @@ const options: ISourceOptions = { value: 1, }, size: { - value: 1, + value: 10, }, links: { enable: false, @@ -51,7 +51,7 @@ const options: ISourceOptions = { }, move: { enable: true, - speed: 1, + speed: 2, direction: "none", random: false, straight: false, @@ -64,17 +64,12 @@ const options: ISourceOptions = { value: 0.1, }, options: { - size: 5, + size: 64, draw: false, increment: 0.001, }, generator: "perlinNoise", }, - trail: { - enable: true, - fill: { image: "https://particles.js.org/images/background3.jpg" }, - length: 20, - }, }, }, interactivity: { @@ -112,6 +107,11 @@ const options: ISourceOptions = { }, }, }, + trail: { + enable: true, + fill: { image: "https://particles.js.org/images/hdr/background3.jpg" }, + length: 20, + }, }; export default options; diff --git a/utils/configs/src/v/virus.ts b/utils/configs/src/v/virus.ts index 5864bb3e972..b46b35a1362 100644 --- a/utils/configs/src/v/virus.ts +++ b/utils/configs/src/v/virus.ts @@ -56,7 +56,7 @@ const options: ISourceOptions = { image: { height: 32, replaceColor: true, - src: "https://particles.js.org/images/sars-cov-2.png", + src: "https://particles.js.org/images/hdr/sars-cov-2.png", width: 32, }, }, diff --git a/utils/configs/webpack.config.js b/utils/configs/webpack.config.js index e20be603e8a..40ff5cd9e70 100644 --- a/utils/configs/webpack.config.js +++ b/utils/configs/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "configs", bundleName: "Configs", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "configs", bundleName: "Configs", version, dir: __dirname }); diff --git a/utils/fractalNoise/.eslintignore b/utils/fractalNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/utils/fractalNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/utils/fractalNoise/.eslintrc.js b/utils/fractalNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/utils/fractalNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/utils/fractalNoise/CHANGELOG.md b/utils/fractalNoise/CHANGELOG.md index 74efa905227..e601b797f57 100644 --- a/utils/fractalNoise/CHANGELOG.md +++ b/utils/fractalNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/fractal-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/fractal-noise diff --git a/utils/fractalNoise/eslint.config.js b/utils/fractalNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/utils/fractalNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/utils/fractalNoise/package.dist.json b/utils/fractalNoise/package.dist.json index 3f3a4c06b32..161fe860f38 100644 --- a/utils/fractalNoise/package.dist.json +++ b/utils/fractalNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/fractal-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles fractal noise library", "homepage": "https://particles.js.org", "repository": { @@ -92,7 +92,7 @@ "module": "esm/index.js", "types": "types/index.d.ts", "dependencies": { - "@tsparticles/smooth-value-noise": "3.9.1" + "@tsparticles/smooth-value-noise": "4.0.0-alpha.0" }, "exports": { ".": { @@ -104,5 +104,6 @@ "default": "./cjs/index.js" }, "./package.json": "./package.json" - } + }, + "type": "module" } diff --git a/utils/fractalNoise/package.json b/utils/fractalNoise/package.json index 3c66102a0c1..036398a5bd2 100644 --- a/utils/fractalNoise/package.json +++ b/utils/fractalNoise/package.json @@ -1,118 +1,119 @@ { - "name": "@tsparticles/fractal-noise", - "version": "3.9.1", - "description": "tsParticles fractal noise path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/fractal-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles fractal noise path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/fractalNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/fractalNoise" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "dependencies": { - "@tsparticles/smooth-value-noise": "workspace:3.9.1" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/smooth-value-noise": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/utils/fractalNoise/webpack.config.js b/utils/fractalNoise/webpack.config.js index 7876a5fce65..3477f3a8477 100644 --- a/utils/fractalNoise/webpack.config.js +++ b/utils/fractalNoise/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "fractal.noise", bundle: false, bundleName: "Fractal Noise", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "fractal.noise", bundle: false, bundleName: "Fractal Noise", version, dir: __dirname }); diff --git a/utils/noiseField/.browserslistrc b/utils/noiseField/.browserslistrc new file mode 100644 index 00000000000..bd9a52c8d84 --- /dev/null +++ b/utils/noiseField/.browserslistrc @@ -0,0 +1,2 @@ +since 2019 +not dead diff --git a/utils/noiseField/.npmignore b/utils/noiseField/.npmignore new file mode 100644 index 00000000000..5c901533f98 --- /dev/null +++ b/utils/noiseField/.npmignore @@ -0,0 +1 @@ +report.html \ No newline at end of file diff --git a/utils/noiseField/CHANGELOG.md b/utils/noiseField/CHANGELOG.md new file mode 100644 index 00000000000..c77cd72712e --- /dev/null +++ b/utils/noiseField/CHANGELOG.md @@ -0,0 +1,8 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/noise-field diff --git a/utils/noiseField/LICENSE b/utils/noiseField/LICENSE new file mode 100644 index 00000000000..bdc05f528fa --- /dev/null +++ b/utils/noiseField/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Matteo Bruni + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/utils/noiseField/README.md b/utils/noiseField/README.md new file mode 100644 index 00000000000..5b380f8ea77 --- /dev/null +++ b/utils/noiseField/README.md @@ -0,0 +1,74 @@ +[![banner](https://particles.js.org/images/banner3.png)](https://particles.js.org) + +# tsParticles Fractal Noise Library + +[![jsDelivr](https://data.jsdelivr.com/v1/package/npm/@tsparticles/fractal-noise/badge)](https://www.jsdelivr.com/package/npm/@tsparticles/fractal-noise) +[![npmjs](https://badge.fury.io/js/@tsparticles/fractal-noise.svg)](https://www.npmjs.com/package/@tsparticles/fractal-noise) +[![npmjs](https://img.shields.io/npm/dt/@tsparticles/fractal-noise)](https://www.npmjs.com/package/@tsparticles/fractal-noise) [![GitHub Sponsors](https://img.shields.io/github/sponsors/matteobruni)](https://github.com/sponsors/matteobruni) + +[tsParticles](https://github.com/tsparticles/tsparticles) path plugin for fractal noise movement. + +## How to use it + +### CDN / Vanilla JS / jQuery + +The CDN/Vanilla version JS has one required file in vanilla configuration: + +Including the `tsparticles.fractal.noise.min.js` file will export the function to load the path plugin: + +```text +loadFractalNoisePath +``` + +### Usage + +Once the scripts are loaded you can set up `tsParticles` and the path plugin like this: + +```javascript +(async () => { + await loadFractalNoisePath(tsParticles); + + await tsParticles.load({ + id: "tsparticles", + options: { + /* options */ + }, + }); +})(); +``` + +### ESM / CommonJS + +This package is compatible also with ES or CommonJS modules, firstly this needs to be installed, like this: + +```shell +$ npm install @tsparticles/fractal-noise +``` + +or + +```shell +$ yarn add @tsparticles/fractal-noise +``` + +Then you need to import it in the app, like this: + +```javascript +const { tsParticles } = require("@tsparticles/engine"); +const { loadFractalNoisePath } = require("@tsparticles/fractal-noise"); + +(async () => { + await loadFractalNoisePath(tsParticles); +})(); +``` + +or + +```javascript +import { tsParticles } from "@tsparticles/engine"; +import { loadFractalNoisePath } from "@tsparticles/fractal-noise"; + +(async () => { + await loadFractalNoisePath(tsParticles); +})(); +``` diff --git a/utils/noiseField/eslint.config.js b/utils/noiseField/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/utils/noiseField/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/utils/noiseField/package.dist.json b/utils/noiseField/package.dist.json new file mode 100644 index 00000000000..b20f0ffa443 --- /dev/null +++ b/utils/noiseField/package.dist.json @@ -0,0 +1,109 @@ +{ + "name": "@tsparticles/noise-field", + "version": "4.0.0-alpha.0", + "description": "tsParticles noise field library", + "homepage": "https://particles.js.org", + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "utils/noiseField" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "publishConfig": { + "access": "public" + }, + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "sideEffects": false, + "jsdelivr": "tsparticles.noise.field.min.js", + "unpkg": "tsparticles.noise.field.min.js", + "browser": "browser/index.js", + "main": "cjs/index.js", + "module": "esm/index.js", + "types": "types/index.d.ts", + "dependencies": { + "@tsparticles/engine": "4.0.0-alpha.0" + }, + "exports": { + ".": { + "types": "./types/index.d.ts", + "browser": "./browser/index.js", + "import": "./esm/index.js", + "require": "./cjs/index.js", + "umd": "./umd/index.js", + "default": "./cjs/index.js" + }, + "./package.json": "./package.json" + }, + "type": "module" +} diff --git a/utils/noiseField/package.json b/utils/noiseField/package.json new file mode 100644 index 00000000000..e2edab81ae3 --- /dev/null +++ b/utils/noiseField/package.json @@ -0,0 +1,119 @@ +{ + "name": "@tsparticles/noise-field", + "version": "4.0.0-alpha.0", + "description": "tsParticles noise field library", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/noiseField" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" + }, + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" + }, + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" + } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "dependencies": { + "@tsparticles/engine": "workspace:4.0.0-alpha.0" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" +} diff --git a/paths/perlinNoise/src/IFactorOffsetValues.ts b/utils/noiseField/src/IFactorOffsetValues.ts similarity index 100% rename from paths/perlinNoise/src/IFactorOffsetValues.ts rename to utils/noiseField/src/IFactorOffsetValues.ts diff --git a/paths/perlinNoise/src/IPerlinOptions.ts b/utils/noiseField/src/INoiseFieldOptions.ts similarity index 89% rename from paths/perlinNoise/src/IPerlinOptions.ts rename to utils/noiseField/src/INoiseFieldOptions.ts index 8d8c24ebebd..d202d6db8ff 100644 --- a/paths/perlinNoise/src/IPerlinOptions.ts +++ b/utils/noiseField/src/INoiseFieldOptions.ts @@ -1,6 +1,6 @@ import type { IFactorValues, IOffsetValues } from "./IFactorOffsetValues.js"; -export interface IPerlinOptions { +export interface INoiseFieldOptions { columns: number; draw: boolean; factor: IFactorValues; diff --git a/utils/noiseField/src/INoiseGenerator.ts b/utils/noiseField/src/INoiseGenerator.ts new file mode 100644 index 00000000000..d4180fcabea --- /dev/null +++ b/utils/noiseField/src/INoiseGenerator.ts @@ -0,0 +1,4 @@ +export interface INoiseGenerator { + noise4d(x: number, y: number, z: number, w: number): number; + seed(seed: number): void; +} diff --git a/utils/noiseField/src/NoiseFieldGenerator.ts b/utils/noiseField/src/NoiseFieldGenerator.ts new file mode 100644 index 00000000000..afaea4a4961 --- /dev/null +++ b/utils/noiseField/src/NoiseFieldGenerator.ts @@ -0,0 +1,266 @@ +import { + type Container, + type IMovePathGenerator, + type Particle, + Vector, + deepExtend, + getRandom, +} from "@tsparticles/engine"; +import type { IFactorValues, IOffsetValues } from "./IFactorOffsetValues.js"; +import type { INoiseFieldOptions } from "./INoiseFieldOptions.js"; +import type { INoiseGenerator } from "./INoiseGenerator.js"; + +const originCoordinate = 0, + firstIndex = 0, + empty = 0, + optionsSizeOffset = 1, + transformDefaultValues = { + a: 1, + b: 0, + c: 0, + d: 1, + e: 0, + f: 0, + }, + double = 2, + doublePI = Math.PI * double, + defaultOptions: INoiseFieldOptions = { + draw: false, + size: 20, + increment: 0.004, + columns: 0, + rows: 0, + layers: 0, + width: 0, + height: 0, + factor: { + angle: 0.02, + length: 0.01, + }, + offset: { + x: 40000, + y: 40000, + z: 40000, + }, + }; + +export abstract class NoiseFieldGenerator implements IMovePathGenerator { + container?: Container; + field: Vector[][][]; + readonly noiseGen: INoiseGenerator; + noiseW: number; + readonly options: INoiseFieldOptions; + + protected constructor(noiseGen: INoiseGenerator) { + this.noiseGen = noiseGen; + this.field = []; + this.noiseW = 0; + this.options = deepExtend({}, defaultOptions) as INoiseFieldOptions; + } + + generate(particle: Particle): Vector { + const pos = particle.getPosition(), + { size } = this.options, + point = { + x: Math.max(Math.floor(pos.x / size), originCoordinate), + y: Math.max(Math.floor(pos.y / size), originCoordinate), + z: Math.max(Math.floor(pos.z / size), originCoordinate), + }, + { field } = this, + fieldPoint = field[point.x]?.[point.y]?.[point.z]; + + return fieldPoint ? fieldPoint.copy() : Vector.origin; + } + + init(container: Container): void { + this.container = container; + + this._setup(); + } + + reset(): void { + // nothing to do + } + + update(): void { + if (!this.container) { + return; + } + + this._calculateField(); + + this.noiseW += this.options.increment; + + if (!this.options.draw) { + return; + } + + this.container.canvas.draw(ctx => { + this._drawField(ctx); + }); + } + + private _calculateField(): void { + const { field, noiseGen, options, noiseW } = this, + lengthFactor = options.factor.length, + angleFactor = options.factor.angle; + + for (let x = 0; x < options.columns; x++) { + const xColumn = field[x]; + + if (!xColumn) { + continue; + } + + for (let y = 0; y < options.rows; y++) { + const yColumn = xColumn[y]; + + if (!yColumn) { + continue; + } + + for (let z = 0; z < options.layers; z++) { + const cell = yColumn[z]; + + if (!cell) { + continue; + } + + cell.length = noiseGen.noise4d( + x * lengthFactor + options.offset.x, + y * lengthFactor + options.offset.y, + z * lengthFactor + options.offset.z, + noiseW, + ); + cell.angle = noiseGen.noise4d(x * angleFactor, y * angleFactor, z * angleFactor, noiseW) * doublePI; + } + } + } + } + + private _drawField(ctx: CanvasRenderingContext2D): void { + const { field, options } = this; + + for (let x = 0; x < options.columns; x++) { + const xColumn = field[x]; + + if (!xColumn) { + continue; + } + + for (let y = 0; y < options.rows; y++) { + const yColumn = xColumn[y]; + + if (!yColumn) { + continue; + } + + const cell = yColumn[firstIndex]; // only 2D + + if (!cell) { + continue; + } + + const { angle, length } = cell; + + ctx.setTransform( + transformDefaultValues.a, + transformDefaultValues.b, + transformDefaultValues.c, + transformDefaultValues.d, + x * this.options.size, + y * this.options.size, + ); + ctx.rotate(angle); + ctx.strokeStyle = "white"; + ctx.beginPath(); + ctx.moveTo(originCoordinate, originCoordinate); + ctx.lineTo(originCoordinate, this.options.size * length); + ctx.stroke(); + ctx.setTransform( + transformDefaultValues.a, + transformDefaultValues.b, + transformDefaultValues.c, + transformDefaultValues.d, + transformDefaultValues.e, + transformDefaultValues.f, + ); + } + } + } + + private _initField(): void { + const { columns, rows, layers } = this.options; + + this.field = new Array(columns); + + for (let x = 0; x < columns; x++) { + const newX = new Array(rows); + + for (let y = 0; y < rows; y++) { + const newY = new Array(layers); + + for (let z = 0; z < layers; z++) { + newY[z] = Vector.origin; + } + + newX[y] = newY; + } + + this.field[x] = newX; + } + } + + private _resetField(): void { + const container = this.container; + + if (!container) { + return; + } + + const sourceOptions = container.actualOptions.particles.move.path.options, + { options } = this; + + options.width = container.canvas.size.width; + options.height = container.canvas.size.height; + + options.size = + (sourceOptions["size"] as number) > empty ? (sourceOptions["size"] as number) : defaultOptions.size; + options.increment = + (sourceOptions["increment"] as number) > empty + ? (sourceOptions["increment"] as number) + : defaultOptions.increment; + options.draw = !!sourceOptions["draw"]; + + const offset = sourceOptions["offset"] as IOffsetValues | undefined; + + options.offset.x = offset?.x ?? defaultOptions.offset.x; + options.offset.y = offset?.y ?? defaultOptions.offset.y; + options.offset.z = offset?.z ?? defaultOptions.offset.z; + + const factor = sourceOptions["factor"] as IFactorValues | undefined; + + options.factor.angle = factor?.angle ?? defaultOptions.factor.angle; + options.factor.length = factor?.length ?? defaultOptions.factor.length; + + options.seed = sourceOptions["seed"] as number | undefined; + + this.noiseGen.seed(options.seed ?? getRandom()); + + options.columns = Math.floor(options.width / options.size) + optionsSizeOffset; + options.rows = Math.floor(options.height / options.size) + optionsSizeOffset; + options.layers = Math.floor(container.zLayers / options.size) + optionsSizeOffset; + + this._initField(); + } + + private _setup(): void { + this.noiseW = 0; + + this._resetField(); + + addEventListener("resize", () => { + this._resetField(); + }); + } +} diff --git a/utils/noiseField/src/index.ts b/utils/noiseField/src/index.ts new file mode 100644 index 00000000000..5e2a6033eb3 --- /dev/null +++ b/utils/noiseField/src/index.ts @@ -0,0 +1,4 @@ +export type { IFactorValues, IOffsetValues } from "./IFactorOffsetValues.js"; +export type { INoiseFieldOptions } from "./INoiseFieldOptions.js"; +export type { INoiseGenerator } from "./INoiseGenerator.js"; +export { NoiseFieldGenerator } from "./NoiseFieldGenerator.js"; diff --git a/utils/noiseField/tsconfig.base.json b/utils/noiseField/tsconfig.base.json new file mode 100644 index 00000000000..d43f4eba9bd --- /dev/null +++ b/utils/noiseField/tsconfig.base.json @@ -0,0 +1,9 @@ +{ + "extends": "@tsparticles/tsconfig/tsconfig.base.json", + "compilerOptions": { + "rootDir": "./src" + }, + "include": [ + "./src" + ] +} diff --git a/utils/noiseField/tsconfig.browser.json b/utils/noiseField/tsconfig.browser.json new file mode 100644 index 00000000000..3bb4173186c --- /dev/null +++ b/utils/noiseField/tsconfig.browser.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.browser.json"], + "compilerOptions": { + "outDir": "./dist/browser" + } +} diff --git a/utils/noiseField/tsconfig.json b/utils/noiseField/tsconfig.json new file mode 100644 index 00000000000..4c843651531 --- /dev/null +++ b/utils/noiseField/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.json"], + "compilerOptions": { + "outDir": "./dist/cjs" + } +} diff --git a/utils/noiseField/tsconfig.module.json b/utils/noiseField/tsconfig.module.json new file mode 100644 index 00000000000..fa94c2a6293 --- /dev/null +++ b/utils/noiseField/tsconfig.module.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.module.json"], + "compilerOptions": { + "outDir": "./dist/esm" + } +} diff --git a/utils/noiseField/tsconfig.types.json b/utils/noiseField/tsconfig.types.json new file mode 100644 index 00000000000..8ec1d3edd57 --- /dev/null +++ b/utils/noiseField/tsconfig.types.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.types.json"], + "compilerOptions": { + "outDir": "./dist/types" + } +} diff --git a/utils/noiseField/tsconfig.umd.json b/utils/noiseField/tsconfig.umd.json new file mode 100644 index 00000000000..41b78634d8c --- /dev/null +++ b/utils/noiseField/tsconfig.umd.json @@ -0,0 +1,6 @@ +{ + "extends": ["./tsconfig.base.json", "@tsparticles/tsconfig/tsconfig.umd.json"], + "compilerOptions": { + "outDir": "./dist/umd" + } +} diff --git a/utils/noiseField/typedoc.json b/utils/noiseField/typedoc.json new file mode 100644 index 00000000000..8d31deb9097 --- /dev/null +++ b/utils/noiseField/typedoc.json @@ -0,0 +1,15 @@ +{ + "projectDocuments": ["../markdown/**/*.md"], + "entryPoints": [ + "./src/" + ], + "entryPointStrategy": "expand", + "name": "tsParticles Noise Field Library", + "includeVersion": true, + "hideGenerator": true, + "out": "./docs", + "validation": { + "invalidLink": true, + "notDocumented": true + } +} diff --git a/utils/noiseField/webpack.config.js b/utils/noiseField/webpack.config.js new file mode 100644 index 00000000000..63ab1daf948 --- /dev/null +++ b/utils/noiseField/webpack.config.js @@ -0,0 +1,12 @@ +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; + +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "noise.field", bundle: false, bundleName: "Noise Field", version, dir: __dirname }); diff --git a/utils/perlinNoise/.eslintignore b/utils/perlinNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/utils/perlinNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/utils/perlinNoise/.eslintrc.js b/utils/perlinNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/utils/perlinNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/utils/perlinNoise/CHANGELOG.md b/utils/perlinNoise/CHANGELOG.md index bcdf898f4a1..6bae7f2b4aa 100644 --- a/utils/perlinNoise/CHANGELOG.md +++ b/utils/perlinNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/perlin-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/perlin-noise diff --git a/utils/perlinNoise/eslint.config.js b/utils/perlinNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/utils/perlinNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/utils/perlinNoise/package.dist.json b/utils/perlinNoise/package.dist.json index 9657d41fee6..65c5b989556 100644 --- a/utils/perlinNoise/package.dist.json +++ b/utils/perlinNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/perlin-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles perlin noise library", "homepage": "https://particles.js.org", "repository": { @@ -101,5 +101,6 @@ "default": "./cjs/index.js" }, "./package.json": "./package.json" - } + }, + "type": "module" } diff --git a/utils/perlinNoise/package.json b/utils/perlinNoise/package.json index 4c09b866cb0..f83663dd6e8 100644 --- a/utils/perlinNoise/package.json +++ b/utils/perlinNoise/package.json @@ -1,115 +1,116 @@ { - "name": "@tsparticles/perlin-noise", - "version": "3.9.1", - "description": "tsParticles perlin noise path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/perlin-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles perlin noise path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/perlinNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/perlinNoise" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/utils/perlinNoise/src/PerlinNoise.ts b/utils/perlinNoise/src/PerlinNoise.ts index 90dbb08da3a..215df3e9678 100644 --- a/utils/perlinNoise/src/PerlinNoise.ts +++ b/utils/perlinNoise/src/PerlinNoise.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ import { Grad } from "./Grad.js"; @@ -321,10 +322,10 @@ export class PerlinNoise { Y &= 255; // Calculate noise contributions from each of the four corners - const n00 = _gradP[X + _perm[Y]].dot2(x, y), - n01 = _gradP[X + _perm[Y + 1]].dot2(x, y - 1), - n10 = _gradP[X + 1 + _perm[Y]].dot2(x - 1, y), - n11 = _gradP[X + 1 + _perm[Y + 1]].dot2(x - 1, y - 1), + const n00 = _gradP[X + _perm[Y]!]!.dot2(x, y), + n01 = _gradP[X + _perm[Y + 1]!]!.dot2(x, y - 1), + n10 = _gradP[X + 1 + _perm[Y]!]!.dot2(x - 1, y), + n11 = _gradP[X + 1 + _perm[Y + 1]!]!.dot2(x - 1, y - 1), // Compute the fade curve value for x u = this._fade(x); @@ -351,14 +352,14 @@ export class PerlinNoise { Z = Z & 255; // Calculate noise contributions from each of the eight corners - const n000 = gradP[X + perm[Y + perm[Z]]].dot3(x, y, z), - n001 = gradP[X + perm[Y + perm[Z + 1]]].dot3(x, y, z - 1), - n010 = gradP[X + perm[Y + 1 + perm[Z]]].dot3(x, y - 1, z), - n011 = gradP[X + perm[Y + 1 + perm[Z + 1]]].dot3(x, y - 1, z - 1), - n100 = gradP[X + 1 + perm[Y + perm[Z]]].dot3(x - 1, y, z), - n101 = gradP[X + 1 + perm[Y + perm[Z + 1]]].dot3(x - 1, y, z - 1), - n110 = gradP[X + 1 + perm[Y + 1 + perm[Z]]].dot3(x - 1, y - 1, z), - n111 = gradP[X + 1 + perm[Y + 1 + perm[Z + 1]]].dot3(x - 1, y - 1, z - 1), + const n000 = gradP[X + perm[Y + perm[Z]!]!]!.dot3(x, y, z), + n001 = gradP[X + perm[Y + perm[Z + 1]!]!]!.dot3(x, y, z - 1), + n010 = gradP[X + perm[Y + 1 + perm[Z]!]!]!.dot3(x, y - 1, z), + n011 = gradP[X + perm[Y + 1 + perm[Z + 1]!]!]!.dot3(x, y - 1, z - 1), + n100 = gradP[X + 1 + perm[Y + perm[Z]!]!]!.dot3(x - 1, y, z), + n101 = gradP[X + 1 + perm[Y + perm[Z + 1]!]!]!.dot3(x - 1, y, z - 1), + n110 = gradP[X + 1 + perm[Y + 1 + perm[Z]!]!]!.dot3(x - 1, y - 1, z), + n111 = gradP[X + 1 + perm[Y + 1 + perm[Z + 1]!]!]!.dot3(x - 1, y - 1, z - 1), // Compute the fade curve value for x, y, z u = this._fade(x), v = this._fade(y), @@ -399,7 +400,7 @@ export class PerlinNoise { t = this._fade(w), // Helper to get gradient index gi = (i: number, j: number, k: number, l: number): Grad => - gradP[X + i + perm[Y + j + perm[Z + k + perm[W + l]]]], + gradP[X + i + perm[Y + j + perm[Z + k + perm[W + l]!]!]!]!, // Contributions from 16 corners of 4D hypercube n0000 = gi(0, 0, 0, 0).dot4(x, y, z, w), n0001 = gi(0, 0, 0, 1).dot4(x, y, z, w - 1), @@ -455,11 +456,11 @@ export class PerlinNoise { const grad4Length = grad4.length; for (let i = 0; i < 256; i++) { - const v = i & 1 ? p[i] ^ (seed & 255) : p[i] ^ ((seed >> 8) & 255); + const v = i & 1 ? p[i]! ^ (seed & 255) : p[i]! ^ ((seed >> 8) & 255); perm[i] = perm[i + 256] = v; - gradP[i] = gradP[i + 256] = grad4[v % grad4Length]; + gradP[i] = gradP[i + 256] = grad4[v % grad4Length]!; } } diff --git a/utils/perlinNoise/webpack.config.js b/utils/perlinNoise/webpack.config.js index 97bd6022417..0022f15add1 100644 --- a/utils/perlinNoise/webpack.config.js +++ b/utils/perlinNoise/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "perlin.noise", bundle: false, bundleName: "Perlin Noise", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "perlin.noise", bundle: false, bundleName: "Perlin Noise", version, dir: __dirname }); diff --git a/utils/simplexNoise/.eslintignore b/utils/simplexNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/utils/simplexNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/utils/simplexNoise/.eslintrc.js b/utils/simplexNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/utils/simplexNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/utils/simplexNoise/CHANGELOG.md b/utils/simplexNoise/CHANGELOG.md index f41006096eb..2602bc65691 100644 --- a/utils/simplexNoise/CHANGELOG.md +++ b/utils/simplexNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/simplex-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/simplex-noise diff --git a/utils/simplexNoise/eslint.config.js b/utils/simplexNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/utils/simplexNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/utils/simplexNoise/package.dist.json b/utils/simplexNoise/package.dist.json index 184c7deb500..d822c9b9232 100644 --- a/utils/simplexNoise/package.dist.json +++ b/utils/simplexNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/simplex-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles simplex noise library", "homepage": "https://particles.js.org", "repository": { @@ -101,5 +101,6 @@ "default": "./cjs/index.js" }, "./package.json": "./package.json" - } + }, + "type": "module" } diff --git a/utils/simplexNoise/package.json b/utils/simplexNoise/package.json index e522378b677..e1c52772d8c 100644 --- a/utils/simplexNoise/package.json +++ b/utils/simplexNoise/package.json @@ -1,101 +1,102 @@ { - "name": "@tsparticles/simplex-noise", - "version": "3.9.1", - "description": "tsParticles simplex noise library", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/simplex-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles simplex noise library", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "utils/simplexNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "utils/simplexNoise" - }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true - } + "./package.json": "./dist/package.json" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/utils/simplexNoise/src/Classes/SimplexNoise2D.ts b/utils/simplexNoise/src/Classes/SimplexNoise2D.ts index dcdaf4313cb..07c6de2c691 100644 --- a/utils/simplexNoise/src/Classes/SimplexNoise2D.ts +++ b/utils/simplexNoise/src/Classes/SimplexNoise2D.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + import type { Contribution2D } from "../Contributions.js"; import { shuffleSeed } from "../utils.js"; @@ -124,9 +126,9 @@ export class SimplexNoise2D { if (attn > 0) { const px = xsb + c.xsb, py = ysb + c.ysb, - indexPartA = _perm[px & 0xff], - index = _perm2D[(indexPartA + py) & 0xff], - valuePart = _gradients2D[index] * dx + _gradients2D[index + 1] * dy; + indexPartA = _perm[px & 0xff]!, + index = _perm2D[(indexPartA + py) & 0xff]!, + valuePart = _gradients2D[index]! * dx + _gradients2D[index + 1]! * dy; value += attn * attn * attn * attn * valuePart; } @@ -141,13 +143,13 @@ export class SimplexNoise2D { const contributions: Contribution2D[] = []; for (let i = 0; i < _p2D.length; i += 4) { - const baseSet = _base2D[_p2D[i]]; + const baseSet = _base2D[_p2D[i]!]!; let previous: Contribution2D | null = null, current: Contribution2D | null = null; for (let k = 0; k < baseSet.length; k += 3) { - current = this._contribution2D(baseSet[k], baseSet[k + 1], baseSet[k + 2]); + current = this._contribution2D(baseSet[k]!, baseSet[k + 1]!, baseSet[k + 2]!); if (previous === null) { contributions[i / 4] = current; @@ -159,14 +161,14 @@ export class SimplexNoise2D { } if (current) { - current.next = this._contribution2D(_p2D[i + 1], _p2D[i + 2], _p2D[i + 3]); + current.next = this._contribution2D(_p2D[i + 1]!, _p2D[i + 2]!, _p2D[i + 3]!); } } this._lookup = []; for (let i = 0; i < _lookupPairs2D.length; i += 2) { - this._lookup[_lookupPairs2D[i]] = contributions[_lookupPairs2D[i + 1]]; + this._lookup[_lookupPairs2D[i]!] = contributions[_lookupPairs2D[i + 1]!]!; } this._perm = new Uint8Array(256); @@ -188,15 +190,15 @@ export class SimplexNoise2D { const r = new Uint32Array(1); - r[0] = (seed[0] + 31) % (i + 1); + r[0] = (seed[0]! + 31) % (i + 1); if (r[0] < 0) { r[0] += i + 1; } - this._perm[i] = source[r[0]]; - this._perm2D[i] = this._perm[i] & 0x0e; - source[r[0]] = source[i]; + this._perm[i] = source[r[0]]!; + this._perm2D[i] = this._perm[i]! & 0x0e; + source[r[0]] = source[i]!; } } diff --git a/utils/simplexNoise/src/Classes/SimplexNoise3D.ts b/utils/simplexNoise/src/Classes/SimplexNoise3D.ts index 5e12f385d4c..ffdcface21e 100644 --- a/utils/simplexNoise/src/Classes/SimplexNoise3D.ts +++ b/utils/simplexNoise/src/Classes/SimplexNoise3D.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + import type { Contribution3D } from "../Contributions.js"; import { shuffleSeed } from "../utils.js"; @@ -506,10 +508,11 @@ export class SimplexNoise3D { const px = xsb + c.xsb, py = ysb + c.ysb, pz = zsb + c.zsb, - indexPartA = _perm[px & 0xff], - indexPartB = _perm[(indexPartA + py) & 0xff], - index = _perm3D[(indexPartB + pz) & 0xff], - valuePart = _gradients3D[index] * dx + _gradients3D[index + 1] * dy + _gradients3D[index + 2] * dz; + indexPartA = _perm[px & 0xff]!, + indexPartB = _perm[(indexPartA + py) & 0xff]!, + index = _perm3D[(indexPartB + pz) & 0xff]!, + valuePart = + _gradients3D[index]! * dx + _gradients3D[index + 1]! * dy + _gradients3D[index + 2]! * dz; value += attn * attn * attn * attn * valuePart; } @@ -522,13 +525,13 @@ export class SimplexNoise3D { contributions: Contribution3D[] = []; for (let i = 0; i < _p3D.length; i += 9) { - const baseSet = _base3D[_p3D[i]]; + const baseSet = _base3D[_p3D[i]!]!; let previous: Contribution3D | null = null, current: Contribution3D | null = null; for (let k = 0; k < baseSet.length; k += 4) { - current = this._contribution3D(baseSet[k], baseSet[k + 1], baseSet[k + 2], baseSet[k + 3]); + current = this._contribution3D(baseSet[k]!, baseSet[k + 1]!, baseSet[k + 2]!, baseSet[k + 3]!); if (previous === null) { contributions[i / 9] = current; @@ -540,15 +543,15 @@ export class SimplexNoise3D { } if (current) { - current.next = this._contribution3D(_p3D[i + 1], _p3D[i + 2], _p3D[i + 3], _p3D[i + 4]); - current.next.next = this._contribution3D(_p3D[i + 5], _p3D[i + 6], _p3D[i + 7], _p3D[i + 8]); + current.next = this._contribution3D(_p3D[i + 1]!, _p3D[i + 2]!, _p3D[i + 3]!, _p3D[i + 4]!); + current.next.next = this._contribution3D(_p3D[i + 5]!, _p3D[i + 6]!, _p3D[i + 7]!, _p3D[i + 8]!); } } this._lookup = []; for (let i = 0; i < _lookupPairs3D.length; i += 2) { - this._lookup[_lookupPairs3D[i]] = contributions[_lookupPairs3D[i + 1]]; + this._lookup[_lookupPairs3D[i]!] = contributions[_lookupPairs3D[i + 1]!]!; } this._perm = new Uint8Array(256); @@ -570,15 +573,15 @@ export class SimplexNoise3D { const r = new Uint32Array(1); - r[0] = (seed[0] + 31) % (i + 1); + r[0] = (seed[0]! + 31) % (i + 1); if (r[0] < 0) { r[0] += i + 1; } - this._perm[i] = source[r[0]]; - this._perm3D[i] = (this._perm[i] % 24) * 3; - source[r[0]] = source[i]; + this._perm[i] = source[r[0]]!; + this._perm3D[i] = (this._perm[i]! % 24) * 3; + source[r[0]] = source[i]!; } } diff --git a/utils/simplexNoise/src/Classes/SimplexNoise4D.ts b/utils/simplexNoise/src/Classes/SimplexNoise4D.ts index a57c4a91b1c..accee4c7b60 100644 --- a/utils/simplexNoise/src/Classes/SimplexNoise4D.ts +++ b/utils/simplexNoise/src/Classes/SimplexNoise4D.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + import type { Contribution4D } from "../Contributions.js"; import { shuffleSeed } from "../utils.js"; @@ -2852,15 +2854,15 @@ export class SimplexNoise4D { py = ysb + c.ysb, pz = zsb + c.zsb, pw = wsb + c.wsb, - indexPartA = _perm[px & 0xff], - indexPartB = _perm[(indexPartA + py) & 0xff], - indexPartC = _perm[(indexPartB + pz) & 0xff], - index = _perm4D[(indexPartC + pw) & 0xff], + indexPartA = _perm[px & 0xff]!, + indexPartB = _perm[(indexPartA + py) & 0xff]!, + indexPartC = _perm[(indexPartB + pz) & 0xff]!, + index = _perm4D[(indexPartC + pw) & 0xff]!, valuePart = - _gradients4D[index] * dx + - _gradients4D[index + 1] * dy + - _gradients4D[index + 2] * dz + - _gradients4D[index + 3] * dw; + _gradients4D[index]! * dx + + _gradients4D[index + 1]! * dy + + _gradients4D[index + 2]! * dz + + _gradients4D[index + 3]! * dw; value += attn * attn * attn * attn * valuePart; } @@ -2873,18 +2875,18 @@ export class SimplexNoise4D { const contributions: Contribution4D[] = []; for (let i = 0; i < _p4D.length; i += 16) { - const baseSet = _base4D[_p4D[i]]; + const baseSet = _base4D[_p4D[i]!]!; let previous: Contribution4D | null = null, current: Contribution4D | null = null; for (let k = 0; k < baseSet.length; k += 5) { current = this._contribution4D( - baseSet[k], - baseSet[k + 1], - baseSet[k + 2], - baseSet[k + 3], - baseSet[k + 4], + baseSet[k]!, + baseSet[k + 1]!, + baseSet[k + 2]!, + baseSet[k + 3]!, + baseSet[k + 4]!, ); if (previous === null) { @@ -2897,20 +2899,26 @@ export class SimplexNoise4D { } if (current) { - current.next = this._contribution4D(_p4D[i + 1], _p4D[i + 2], _p4D[i + 3], _p4D[i + 4], _p4D[i + 5]); + current.next = this._contribution4D( + _p4D[i + 1]!, + _p4D[i + 2]!, + _p4D[i + 3]!, + _p4D[i + 4]!, + _p4D[i + 5]!, + ); current.next.next = this._contribution4D( - _p4D[i + 6], - _p4D[i + 7], - _p4D[i + 8], - _p4D[i + 9], - _p4D[i + 10], + _p4D[i + 6]!, + _p4D[i + 7]!, + _p4D[i + 8]!, + _p4D[i + 9]!, + _p4D[i + 10]!, ); current.next.next.next = this._contribution4D( - _p4D[i + 11], - _p4D[i + 12], - _p4D[i + 13], - _p4D[i + 14], - _p4D[i + 15], + _p4D[i + 11]!, + _p4D[i + 12]!, + _p4D[i + 13]!, + _p4D[i + 14]!, + _p4D[i + 15]!, ); } } @@ -2918,7 +2926,7 @@ export class SimplexNoise4D { this._lookup = []; for (let i = 0; i < _lookupPairs4D.length; i += 2) { - this._lookup[_lookupPairs4D[i]] = contributions[_lookupPairs4D[i + 1]]; + this._lookup[_lookupPairs4D[i]!] = contributions[_lookupPairs4D[i + 1]!]!; } this._perm = new Uint8Array(256); @@ -2939,15 +2947,15 @@ export class SimplexNoise4D { const r = new Uint32Array(1); - r[0] = (seed[0] + 31) % (i + 1); + r[0] = (seed[0]! + 31) % (i + 1); if (r[0] < 0) { r[0] += i + 1; } - this._perm[i] = source[r[0]]; - this._perm4D[i] = this._perm[i] & 0xfc; - source[r[0]] = source[i]; + this._perm[i] = source[r[0]]!; + this._perm4D[i] = this._perm[i]! & 0xfc; + source[r[0]] = source[i]!; } } diff --git a/utils/simplexNoise/src/utils.ts b/utils/simplexNoise/src/utils.ts index 6bac4bd38e1..84178e137ea 100644 --- a/utils/simplexNoise/src/utils.ts +++ b/utils/simplexNoise/src/utils.ts @@ -1,4 +1,6 @@ /* eslint-disable @typescript-eslint/no-magic-numbers */ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ + /** * @param seed - * @returns the new seed @@ -6,7 +8,7 @@ export function shuffleSeed(seed: Uint32Array): Uint32Array { const newSeed = new Uint32Array(1); - newSeed[0] = seed[0] * 1664525 + 1013904223; + newSeed[0] = seed[0]! * 1664525 + 1013904223; return newSeed; } diff --git a/utils/simplexNoise/webpack.config.js b/utils/simplexNoise/webpack.config.js index 348e209bcb2..02b95746e77 100644 --- a/utils/simplexNoise/webpack.config.js +++ b/utils/simplexNoise/webpack.config.js @@ -1,7 +1,15 @@ -const {loadParticlesBundle} = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "simplex.noise", bundle: false, bundleName: "Simplex Noise", diff --git a/utils/smoothValueNoise/.eslintignore b/utils/smoothValueNoise/.eslintignore deleted file mode 100644 index db4c6d9b679..00000000000 --- a/utils/smoothValueNoise/.eslintignore +++ /dev/null @@ -1,2 +0,0 @@ -dist -node_modules \ No newline at end of file diff --git a/utils/smoothValueNoise/.eslintrc.js b/utils/smoothValueNoise/.eslintrc.js deleted file mode 100644 index cf15ec434b8..00000000000 --- a/utils/smoothValueNoise/.eslintrc.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ] -}; diff --git a/utils/smoothValueNoise/CHANGELOG.md b/utils/smoothValueNoise/CHANGELOG.md index 5f4ae4d5d6b..fc8c5de1856 100644 --- a/utils/smoothValueNoise/CHANGELOG.md +++ b/utils/smoothValueNoise/CHANGELOG.md @@ -3,6 +3,10 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +**Note:** Version bump only for package @tsparticles/smooth-value-noise + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/smooth-value-noise diff --git a/utils/smoothValueNoise/eslint.config.js b/utils/smoothValueNoise/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/utils/smoothValueNoise/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/utils/smoothValueNoise/package.dist.json b/utils/smoothValueNoise/package.dist.json index fb89fab23ce..d39cc95d78f 100644 --- a/utils/smoothValueNoise/package.dist.json +++ b/utils/smoothValueNoise/package.dist.json @@ -1,6 +1,6 @@ { "name": "@tsparticles/smooth-value-noise", - "version": "3.9.1", + "version": "4.0.0-alpha.0", "description": "tsParticles smooth value noise library", "homepage": "https://particles.js.org", "repository": { @@ -101,5 +101,6 @@ "default": "./cjs/index.js" }, "./package.json": "./package.json" - } + }, + "type": "module" } diff --git a/utils/smoothValueNoise/package.json b/utils/smoothValueNoise/package.json index b91409dce75..860303457a4 100644 --- a/utils/smoothValueNoise/package.json +++ b/utils/smoothValueNoise/package.json @@ -1,115 +1,116 @@ { - "name": "@tsparticles/smooth-value-noise", - "version": "3.9.1", - "description": "tsParticles smooth value noise path", - "homepage": "https://particles.js.org", - "scripts": { - "build": "tsparticles-cli build", - "build:ci": "tsparticles-cli build --ci", - "version": "tsparticles-cli build -d && git add package.dist.json", - "prepack": "pnpm run build" + "name": "@tsparticles/smooth-value-noise", + "version": "4.0.0-alpha.0", + "description": "tsParticles smooth value noise path", + "homepage": "https://particles.js.org", + "scripts": { + "build": "tsparticles-cli build", + "build:ci": "tsparticles-cli build --ci", + "version": "tsparticles-cli build -d && git add package.dist.json", + "prepack": "pnpm run build" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tsparticles/tsparticles.git", + "directory": "paths/smoothValueNoise" + }, + "keywords": [ + "front-end", + "frontend", + "tsparticles", + "particles.js", + "particlesjs", + "particles", + "particle", + "canvas", + "jsparticles", + "xparticles", + "particles-js", + "particles-bg", + "particles-bg-vue", + "particles-ts", + "particles.ts", + "react-particles-js", + "react-particles.js", + "react-particles", + "react", + "reactjs", + "vue-particles", + "ngx-particles", + "angular-particles", + "particleground", + "vue", + "vuejs", + "preact", + "preactjs", + "jquery", + "angularjs", + "angular", + "typescript", + "javascript", + "animation", + "web", + "html5", + "web-design", + "webdesign", + "css", + "html", + "css3", + "animated", + "background", + "confetti", + "canvas", + "fireworks", + "fireworks-js", + "confetti-js", + "confettijs", + "fireworksjs", + "canvas-confetti", + "tsparticles-plugin" + ], + "author": "Matteo Bruni ", + "license": "MIT", + "bugs": { + "url": "https://github.com/tsparticles/tsparticles/issues" + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/matteobruni" }, - "repository": { - "type": "git", - "url": "git+https://github.com/tsparticles/tsparticles.git", - "directory": "paths/smoothValueNoise" + { + "type": "github", + "url": "https://github.com/sponsors/tsparticles" }, - "keywords": [ - "front-end", - "frontend", - "tsparticles", - "particles.js", - "particlesjs", - "particles", - "particle", - "canvas", - "jsparticles", - "xparticles", - "particles-js", - "particles-bg", - "particles-bg-vue", - "particles-ts", - "particles.ts", - "react-particles-js", - "react-particles.js", - "react-particles", - "react", - "reactjs", - "vue-particles", - "ngx-particles", - "angular-particles", - "particleground", - "vue", - "vuejs", - "preact", - "preactjs", - "jquery", - "angularjs", - "angular", - "typescript", - "javascript", - "animation", - "web", - "html5", - "web-design", - "webdesign", - "css", - "html", - "css3", - "animated", - "background", - "confetti", - "canvas", - "fireworks", - "fireworks-js", - "confetti-js", - "confettijs", - "fireworksjs", - "canvas-confetti", - "tsparticles-plugin" - ], - "author": "Matteo Bruni ", - "license": "MIT", - "bugs": { - "url": "https://github.com/tsparticles/tsparticles/issues" - }, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/matteobruni" - }, - { - "type": "github", - "url": "https://github.com/sponsors/tsparticles" - }, - { - "type": "buymeacoffee", - "url": "https://www.buymeacoffee.com/matteobruni" - } - ], - "prettier": "@tsparticles/prettier-config", - "files": [ - "dist" - ], - "sideEffects": false, - "browser": "dist/browser/index.js", - "main": "dist/cjs/index.js", - "module": "dist/esm/index.js", - "types": "dist/types/index.d.ts", - "exports": { - ".": { - "types": "./dist/types/index.d.ts", - "browser": "./dist/browser/index.js", - "import": "./dist/esm/index.js", - "require": "./dist/cjs/index.js", - "umd": "./dist/umd/index.js", - "default": "./dist/cjs/index.js" - }, - "./package.json": "./dist/package.json" - }, - "publishConfig": { - "access": "public", - "directory": "dist", - "linkDirectory": true + { + "type": "buymeacoffee", + "url": "https://www.buymeacoffee.com/matteobruni" } + ], + "prettier": "@tsparticles/prettier-config", + "files": [ + "dist" + ], + "sideEffects": false, + "browser": "dist/browser/index.js", + "main": "dist/cjs/index.js", + "module": "dist/esm/index.js", + "types": "dist/types/index.d.ts", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "browser": "./dist/browser/index.js", + "import": "./dist/esm/index.js", + "require": "./dist/cjs/index.js", + "umd": "./dist/umd/index.js", + "default": "./dist/cjs/index.js" + }, + "./package.json": "./dist/package.json" + }, + "publishConfig": { + "access": "public", + "directory": "dist", + "linkDirectory": true + }, + "type": "module" } diff --git a/utils/smoothValueNoise/webpack.config.js b/utils/smoothValueNoise/webpack.config.js index 7460e45b03f..6eef0884211 100644 --- a/utils/smoothValueNoise/webpack.config.js +++ b/utils/smoothValueNoise/webpack.config.js @@ -1,4 +1,12 @@ -const { loadParticlesBundle } = require("@tsparticles/webpack-plugin"); -const version = require("./package.json").version; +import { loadParticlesBundle } from "@tsparticles/webpack-plugin"; +import { fileURLToPath } from "url"; +import fs from "fs-extra"; +import path from "path"; -module.exports = loadParticlesBundle({ moduleName: "smooth.value.noise", bundle: false, bundleName: "Smooth Value Noise", version, dir: __dirname }); +const __filename = fileURLToPath(import.meta.url), + __dirname = path.dirname(__filename), + rootPkgPath = path.join(__dirname, "package.json"), + pkg = await fs.readJson(rootPkgPath), + version = pkg.version; + +export default loadParticlesBundle({ moduleName: "smooth.value.noise", bundle: false, bundleName: "Smooth Value Noise", version, dir: __dirname }); diff --git a/utils/tests/.eslintrc.js b/utils/tests/.eslintrc.js deleted file mode 100644 index 2f57604bfab..00000000000 --- a/utils/tests/.eslintrc.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - extends: [ - "@tsparticles/eslint-config", - ], - parserOptions: { - project: "./tsconfig.json" - } -}; diff --git a/utils/tests/CHANGELOG.md b/utils/tests/CHANGELOG.md index e5065005a62..81d19dd93a1 100644 --- a/utils/tests/CHANGELOG.md +++ b/utils/tests/CHANGELOG.md @@ -3,6 +3,12 @@ All notable changes to this project will be documented in this file. See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. +# [4.0.0-alpha.0](https://github.com/tsparticles/tsparticles/compare/v3.9.1...v4.0.0-alpha.0) (2026-01-07) + +### Features + +- improved hdr management, improved also big particles config ([92af429](https://github.com/tsparticles/tsparticles/commit/92af429a2c18976267579cc732492dbb7cb3f67a)) + ## [3.9.1](https://github.com/tsparticles/tsparticles/compare/v3.9.0...v3.9.1) (2025-08-03) **Note:** Version bump only for package @tsparticles/tests diff --git a/utils/tests/eslint.config.js b/utils/tests/eslint.config.js new file mode 100644 index 00000000000..a461ddbce48 --- /dev/null +++ b/utils/tests/eslint.config.js @@ -0,0 +1,6 @@ +import tsParticlesESLintConfig from "@tsparticles/eslint-config"; +import { defineConfig } from "eslint/config"; + +export default defineConfig([ + tsParticlesESLintConfig, +]); diff --git a/utils/tests/package.json b/utils/tests/package.json index eecf231ef0e..25031168323 100644 --- a/utils/tests/package.json +++ b/utils/tests/package.json @@ -1,7 +1,7 @@ { "name": "@tsparticles/tests", "private": true, - "version": "3.9.1", + "version": "4.0.0-alpha.0", "scripts": { "prettify:ci": "prettier --check ./src", "prettify": "prettier --write ./src", @@ -16,10 +16,11 @@ "test:ci": "vitest run" }, "dependencies": { - "@tsparticles/engine": "workspace:3.9.1", - "@tsparticles/plugin-hex-color": "workspace:3.9.1", - "@tsparticles/plugin-hsl-color": "workspace:3.9.1", - "@tsparticles/plugin-hsv-color": "workspace:3.9.1", - "@tsparticles/plugin-rgb-color": "workspace:3.9.1" - } + "@tsparticles/engine": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hex-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hsl-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-hsv-color": "workspace:4.0.0-alpha.0", + "@tsparticles/plugin-rgb-color": "workspace:4.0.0-alpha.0" + }, + "type": "module" } diff --git a/utils/tests/src/Fixture/CustomCanvas.ts b/utils/tests/src/Fixture/CustomCanvas.ts index 02a21972ea6..7920b92b1e5 100644 --- a/utils/tests/src/Fixture/CustomCanvas.ts +++ b/utils/tests/src/Fixture/CustomCanvas.ts @@ -8,7 +8,6 @@ import { type Canvas, createCanvas } from "canvas"; * @returns the custom canvas */ export function createCustomCanvas(width: number, height: number): Canvas { - // eslint-disable-next-line @typescript-eslint/no-unsafe-call const canvas = createCanvas(width, height), augmentCanvas = canvas as any; @@ -19,15 +18,15 @@ export function createCustomCanvas(width: number, height: number): Canvas { augmentCanvas.style[qualifiedName] = value; }; augmentCanvas.style = { - height: `${height}px`, - width: `${width}px`, + height: `${height.toString()}px`, + width: `${width.toString()}px`, setProperty(property: string, value: string | null, priority?: string): void { - this[property] = priority ? `${value} !important` : value; + this[property] = priority ? `${value?.toString() ?? ""} !important` : value; }, removeProperty(property: string): string { const value = this[property]; - delete this[property]; + this[property] = undefined; return value as string; }, diff --git a/utils/tests/src/tests/ColorUtils.ts b/utils/tests/src/tests/ColorUtils.ts index e3997142f58..c9e9b250c6b 100644 --- a/utils/tests/src/tests/ColorUtils.ts +++ b/utils/tests/src/tests/ColorUtils.ts @@ -21,10 +21,14 @@ import { loadHsvColorPlugin } from "@tsparticles/plugin-hsv-color"; import { loadRgbColorPlugin } from "@tsparticles/plugin-rgb-color"; describe("ColorUtils", async () => { - await loadHexColorPlugin(tsParticles); - await loadHslColorPlugin(tsParticles); - await loadHsvColorPlugin(tsParticles); - await loadRgbColorPlugin(tsParticles); + tsParticles.register(engine => { + loadHexColorPlugin(engine); + loadHslColorPlugin(engine); + loadHsvColorPlugin(engine); + loadRgbColorPlugin(engine); + }); + + await tsParticles.init(); const red: IRgb = { b: 0, @@ -327,7 +331,7 @@ describe("ColorUtils", async () => { describe("getStyleFromColor", () => { it("IRgb to rgba string", () => { - expect(getStyleFromRgb(red)).to.equal("rgba(255, 0, 0, 1)"); + expect(getStyleFromRgb(red, false)).to.equal("rgba(255, 0, 0, 1)"); }); it("IHsl to hsla string", () => { @@ -337,7 +341,7 @@ describe("ColorUtils", async () => { s: 100, }; - expect(getStyleFromHsl(color)).to.equal("hsla(0, 100%, 50%, 1)"); + expect(getStyleFromHsl(color, false)).to.equal("hsla(0, 100%, 50%, 1)"); }); // it("IHsv to hsla string", () => { diff --git a/utils/tests/src/tests/Options.ts b/utils/tests/src/tests/Options.ts index 507789aa37f..ae2e1ac9c15 100644 --- a/utils/tests/src/tests/Options.ts +++ b/utils/tests/src/tests/Options.ts @@ -1,6 +1,5 @@ /* eslint-disable @typescript-eslint/no-magic-numbers,@typescript-eslint/no-unused-expressions */ import { - CollisionMode, type IParticlesOptions, type ISourceOptions, InteractivityDetect, @@ -42,10 +41,6 @@ describe("Options tests", () => { expect(options.background.size).to.be.equal(""); expect(options.background.opacity).to.be.equal(1); - /* background mask */ - expect(options.backgroundMask.cover).to.be.an("object").to.have.property("opacity").to.equal(1); - expect(options.backgroundMask.enable).to.be.false; - /* detect retina */ expect(options.detectRetina).to.be.true; @@ -84,10 +79,6 @@ describe("Options tests", () => { // expect(options.interactivity.modes.slow.radius).to.equal(200); /* particles */ - /* particles collisions */ - expect(options.particles.collisions.enable).to.be.false; - expect(options.particles.collisions.mode).to.equal(CollisionMode.bounce); - /* particles color */ expect(options.particles.color).to.be.an("object").to.have.property("value").to.equal("#fff"); @@ -113,9 +104,6 @@ describe("Options tests", () => { expect(options.particles.move.random).to.be.false; expect(options.particles.move.speed).to.equal(2); expect(options.particles.move.straight).to.be.false; - expect(options.particles.move.trail.fill.color).to.be.undefined; - expect(options.particles.move.trail.enable).to.be.false; - expect(options.particles.move.trail.length).to.equal(10); /* particles number */ expect(options.particles.number.density.width).to.equal(1920); @@ -138,13 +126,6 @@ describe("Options tests", () => { // expect(options.particles.rotate.direction).to.equal(RotateDirection.clockwise); // expect(options.particles.rotate.value).to.be.equal(0); - /* particles shadow */ - expect(options.particles.shadow.blur).to.equal(0); - expect(options.particles.shadow.color).to.be.an("object").to.have.property("value").to.equal("#000"); - expect(options.particles.shadow.enable).to.be.false; - expect(options.particles.shadow.offset.x).to.equal(0); - expect(options.particles.shadow.offset.y).to.equal(0); - /* particles shape */ expect(options.particles.shape.type).to.equal("circle"); @@ -480,10 +461,6 @@ describe("Options tests", () => { // expect(options.interactivity.modes.repulse.distance).to.equal(200); /* particles */ - /* particles collisions */ - expect(options.particles.collisions.enable).to.be.false; - expect(options.particles.collisions.mode).to.equal(CollisionMode.bounce); - /* particles color */ expect(options.particles.color).to.be.an("object").to.have.property("value").to.equal("#ffffff"); @@ -504,9 +481,6 @@ describe("Options tests", () => { expect(options.particles.move.random).to.be.false; expect(options.particles.move.speed).to.equal(2); expect(options.particles.move.straight).to.be.false; - expect(options.particles.move.trail.fill.color).to.be.undefined; - expect(options.particles.move.trail.enable).to.be.false; - expect(options.particles.move.trail.length).to.equal(10); /* particles number */ expect(options.particles.number.density.width).to.equal(1920); diff --git a/utils/tests/src/tests/Particle.ts b/utils/tests/src/tests/Particle.ts index 29d4f51b4a3..0eba03fc643 100644 --- a/utils/tests/src/tests/Particle.ts +++ b/utils/tests/src/tests/Particle.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-magic-numbers,@typescript-eslint/no-unused-expressions */ -import { type ICoordinates, calcExactPositionOrRandomFromSize, errorPrefix, tsParticles } from "@tsparticles/engine"; +import { type ICoordinates, calcExactPositionOrRandomFromSize, tsParticles } from "@tsparticles/engine"; import { afterAll, beforeEach, describe, expect, it } from "vitest"; import { TestWindow } from "../Fixture/Window.js"; import { createCustomCanvas } from "../Fixture/CustomCanvas.js"; @@ -19,12 +19,12 @@ describe("Particle", async () => { options: { autoPlay: false, }, - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any + // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment element: canvas, }); if (!container) { - throw new Error(`${errorPrefix} test container not initialized`); + throw new Error("test container not initialized"); } describe("constructor/initialization", () => { @@ -123,11 +123,11 @@ describe("Particle", async () => { expectedShapeData = multipleShapeTypeOptions.particles.shape.options.polygon; break; default: - throw new Error(`${errorPrefix} Unexpected shape type "${particle?.shape}"`); + throw new Error(`Unexpected shape type "${particle?.shape ?? ""}"`); } - expect(particle?.shapeClose).to.eql(expectedShapeData.close); - expect(particle?.shapeFill).to.eql(expectedShapeData.fill); + expect(particle.shapeClose).to.eql(expectedShapeData.close); + expect(particle.shapeFill).to.eql(expectedShapeData.fill); }); afterAll(async () => { @@ -166,10 +166,10 @@ describe("Particle", async () => { return; } - expect(particle?.position.x).to.be.at.least(0); - expect(particle?.position.x).to.be.at.most(width); - expect(particle?.position.y).to.be.at.least(0); - expect(particle?.position.y).to.be.at.most(height); + expect(particle.position.x).to.be.at.least(0); + expect(particle.position.x).to.be.at.most(width); + expect(particle.position.y).to.be.at.least(0); + expect(particle.position.y).to.be.at.most(height); }); afterAll(async () => { diff --git a/utils/tests/src/tests/Particles.ts b/utils/tests/src/tests/Particles.ts index 36e2b8e25fb..8ad032b55a2 100644 --- a/utils/tests/src/tests/Particles.ts +++ b/utils/tests/src/tests/Particles.ts @@ -1,11 +1,10 @@ /* eslint-disable */ -import { type ICoordinates3d, errorPrefix, getLogger, getRandom, tsParticles } from "@tsparticles/engine"; +import { type ICoordinates3d, getLogger, getRandom, tsParticles } from "@tsparticles/engine"; import { describe, expect, it } from "vitest"; import { TestWindow } from "../Fixture/Window.js"; import { createCustomCanvas } from "../Fixture/CustomCanvas.js"; describe("Particles", async () => { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment globalThis.window = TestWindow; const container = await tsParticles.load({ @@ -13,12 +12,12 @@ describe("Particles", async () => { options: { autoPlay: false, }, - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-explicit-any + element: createCustomCanvas(1920, 1080) as any, }); if (!container) { - throw new Error(`${errorPrefix} test container not initialized`); + throw new Error(`Error test container not initialized`); } // Common options used when initializing Particles with a set number of particles diff --git a/utils/tests/src/tests/Themes.ts b/utils/tests/src/tests/Themes.ts index 61a0b95cee9..19f0310f70d 100644 --- a/utils/tests/src/tests/Themes.ts +++ b/utils/tests/src/tests/Themes.ts @@ -98,9 +98,10 @@ describe("Themes", async () => { it("Set theme", async () => { await container.loadTheme(); - const theme = container.options.themes.find(t => t.default); + const firstItem = 0, + theme = container.options.themes[firstItem]; - expect(container.actualOptions.particles.color.value).to.be.equal(theme?.options?.particles?.color?.value); + expect(container.actualOptions.particles.color.value).to.be.equal(theme.options?.particles?.color?.value); }); it("Set dark theme", async () => { @@ -115,7 +116,7 @@ describe("Themes", async () => { return; } - expect(container.actualOptions.particles.color.value).to.be.equal(theme?.options?.particles?.color?.value); + expect(container.actualOptions.particles.color.value).to.be.equal(theme.options.particles?.color?.value); }); it("Set light theme", async () => { @@ -130,6 +131,6 @@ describe("Themes", async () => { return; } - expect(container.actualOptions.particles.color.value).to.be.equal(theme?.options?.particles?.color?.value); + expect(container.actualOptions.particles.color.value).to.be.equal(theme.options.particles?.color?.value); }); }); diff --git a/utils/tests/src/tests/Utils.ts b/utils/tests/src/tests/Utils.ts index b64f019184c..fa244d2ecb7 100644 --- a/utils/tests/src/tests/Utils.ts +++ b/utils/tests/src/tests/Utils.ts @@ -14,7 +14,7 @@ import { isPointInside, itemFromArray, mix, - randomInRange, + randomInRangeValue, setRangeValue, tsParticles, } from "@tsparticles/engine"; @@ -122,7 +122,9 @@ describe("Utils", () => { const weight1 = Math.floor(getRandom() * (size - 1) + 1); const weight2 = 0; - expect(mix(comp1, comp2, weight1, weight2), `weight 1: ${weight1}`).to.be.equal(Math.floor(comp1)); + expect(mix(comp1, comp2, weight1, weight2), `weight 1: ${weight1.toString()}`).to.be.equal( + Math.floor(comp1), + ); }); it("should return comp2 when weight1 is 0 (and weight2 > 0)", () => { @@ -206,7 +208,7 @@ describe("Utils", () => { it("should generate a random number in the specified range, range in positive reals", () => { const min = 1; const max = 10; - const randomNumber = randomInRange(setRangeValue(min, max)); + const randomNumber = randomInRangeValue(setRangeValue(min, max)); expect(randomNumber).to.be.within(min, max); }); @@ -214,7 +216,7 @@ describe("Utils", () => { it("should generate a random number in the specified range, range in negative reals", () => { const min = -10; const max = -1; - const randomNumber = randomInRange(setRangeValue(min, max)); + const randomNumber = randomInRangeValue(setRangeValue(min, max)); expect(randomNumber).to.be.within(min, max); }); @@ -222,7 +224,7 @@ describe("Utils", () => { it("should generate a random number in the specified range, range crossing negative and positive reals", () => { const min = -10; const max = 10; - const randomNumber = randomInRange(setRangeValue(min, max)); + const randomNumber = randomInRangeValue(setRangeValue(min, max)); expect(randomNumber).to.be.within(min, max); }); @@ -230,7 +232,7 @@ describe("Utils", () => { it("should set min as 0 when max equals to min", () => { const min = 10; const max = 10; - const randomNumber = randomInRange(setRangeValue(min, max)); + const randomNumber = randomInRangeValue(setRangeValue(min, max)); expect(randomNumber).to.be.within(0, max); });