From f724cbff6d740332ea4911203a35d491f2eb323d Mon Sep 17 00:00:00 2001 From: Vincent van der Wal Date: Sun, 19 Jul 2026 10:04:08 +0200 Subject: [PATCH] move to vite, landing page, add more shapes --- README.md | 43 + package-lock.json | 5079 ++++++++---------------------------------- package.json | 17 +- src/css/styles.scss | 253 ++- src/flower.html | 17 + src/flower.js | 86 +- src/index.html | 49 +- src/index.js | 767 +------ src/lib/chrome.js | 51 + src/lib/edgeTubes.js | 46 + src/lib/stage.js | 88 + src/lib/theme.js | 34 + src/lib/transit.js | 31 + src/matrix.html | 17 + src/matrix.js | 119 + src/metatron.html | 17 + src/metatron.js | 725 ++++++ src/phyllotaxis.html | 17 + src/phyllotaxis.js | 96 + src/seed.html | 17 + src/seed.js | 91 +- src/torus.html | 17 + src/torus.js | 109 + vite.config.js | 17 + webpack.config.js | 55 - 25 files changed, 2841 insertions(+), 5017 deletions(-) create mode 100644 src/flower.html create mode 100644 src/lib/chrome.js create mode 100644 src/lib/edgeTubes.js create mode 100644 src/lib/stage.js create mode 100644 src/lib/theme.js create mode 100644 src/lib/transit.js create mode 100644 src/matrix.html create mode 100644 src/matrix.js create mode 100644 src/metatron.html create mode 100644 src/metatron.js create mode 100644 src/phyllotaxis.html create mode 100644 src/phyllotaxis.js create mode 100644 src/seed.html create mode 100644 src/torus.html create mode 100644 src/torus.js create mode 100644 vite.config.js delete mode 100644 webpack.config.js diff --git a/README.md b/README.md index 96d4cbf..1a44c51 100644 --- a/README.md +++ b/README.md @@ -1 +1,44 @@ # Thrive + +Sacred geometry, lifted into three dimensions with [three.js](https://threejs.org/). + +Most sacred-geometry figures are drawn flat. This project asks what they look like +when they are built in real 3D space: the Fruit of Life as a rotated cubic sphere +packing, the Platonic solids nested inside it with their vertices on the circle +centres, the torus as a field of winding strands, and so on. Every page is an +interactive scene with orbit controls and a lil-gui panel for playing with the +parameters. + +## Pages + +| Page | File | What it shows | +| --- | --- | --- | +| Landing | `src/index.js` | Overview of all explorations, with an animated seed-of-life backdrop | +| Metatron's Cube | `src/metatron.js` | The 3D Fruit of Life circle grid with the five Platonic solids (fire, earth, air, water, aether) aligned to it, plus the Merkaba and the full Metatron web | +| Toroidal Field | `src/torus.js` | A torus with field-line strands winding around the surface and particles flowing along them | +| Vector Equilibrium | `src/matrix.js` | The cuboctahedron: radial spokes equal to the edges, and the 12-around-1 kissing-sphere packing | +| Golden Spiral | `src/phyllotaxis.js` | Phyllotaxis at the golden angle: sunflower disc, pinecone and Fibonacci sphere; nudge the angle to watch the pattern collapse | +| Flower of Life | `src/flower.js` | A cubic grid of interlocking spheres | +| Seed of Life | `src/seed.js` | The seven seed circles rotated through space | + +## Development + +```sh +npm install +npm start # dev server with hot reload +npm run build # production build into build/ +``` + +Each page is its own webpack entry; the page list lives at the top of +`webpack.config.js`. To add a new exploration, add `src/.js` (the shared +scene setup is in `src/lib/stage.js`) and one line to the `pages` array. + +Every page shares the chrome in `src/lib/chrome.js`: fade transitions between +pages and a dark/light toggle (bottom right, persisted in localStorage). Dark +mode matches the landing page; light mode is the original orange room. + +## Debug flags (Metatron page) + +* `?noaa` - disable antialiasing +* `?noshadow` - disable shadow maps +* `?only=` - show a single solid diff --git a/package-lock.json b/package-lock.json index 0dc728d..f7ee66c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,503 +5,460 @@ "packages": { "": { "dependencies": { - "css-loader": "^7.1.4", - "html-webpack-plugin": "^5.6.7", + "three": "^0.185.1" + }, + "devDependencies": { "sass": "^1.101.0", - "sass-loader": "^17.0.0", - "style-loader": "^4.0.0", - "three": "^0.185.1", - "webpack": "^5.108.4", - "webpack-cli": "^7.2.1", - "webpack-dev-server": "^6.0.0" + "vite": "^7.3.0" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-1.1.0.tgz", - "integrity": "sha512-Xc3VhU02wqZ1HvHRJUwL09HkZSTvidqY5Ya0NXBSYOxAp+Ln9dcJr9fySI+CkONzP3PekQo9WdzCv0PGER/mOA==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", + "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", + "cpu": [ + "ppc64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "aix" + ], "engines": { - "node": ">=14.17.0" + "node": ">=18" } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "node_modules/@esbuild/android-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", + "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "node_modules/@esbuild/android-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", + "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "android" + ], "engines": { - "node": ">=6.0.0" + "node": ">=18" } }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.11", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", - "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==", + "node_modules/@esbuild/android-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", + "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25" + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" } }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", + "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jsonjoy.com/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA==", - "license": "Apache-2.0", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" + "node": ">=18" } }, - "node_modules/@jsonjoy.com/buffers": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-17.67.0.tgz", - "integrity": "sha512-tfExRpYxBvi32vPs9ZHaTjSP4fHAfzSmcahOfNxtvGHcyJel+aibkPlGeBB+7AoC6hL7lXIE++8okecBxx7lcw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/codegen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-1.0.0.tgz", - "integrity": "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-core": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-core/-/fs-core-4.64.0.tgz", - "integrity": "sha512-zs2TAq7Six5jgMuoMNjpspAvOP3mhtgq/k1UyQodEzCtQi/N83y2/y+zcvnZSGp/Rxq96DBN+bValOBQAyn/ew==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-fsa": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-fsa/-/fs-fsa-4.64.0.tgz", - "integrity": "sha512-nMWOVbkLFyEgmXZih3wyvxA9XpgyyqyfrINMHvEFqhi7uqfRl7c9ERJt6yX7vgMPrB9Uo+OJO+Spa0cFzPD01w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node/-/fs-node-4.64.0.tgz", - "integrity": "sha512-dO+NNkODbUli4uV42bcNrrLvq5rE7SNpdZ5TNd0dtbLsAaNK3MDiIC9lUi+brboGoIjW6vd2fB1qao60nrk5xA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "@jsonjoy.com/fs-print": "4.64.0", - "@jsonjoy.com/fs-snapshot": "4.64.0", - "glob-to-regex.js": "^1.0.0", - "thingies": "^2.5.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-builtins": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-builtins/-/fs-node-builtins-4.64.0.tgz", - "integrity": "sha512-/o7WRFhUWaM/fOrslwLZGnzn4RmRILykn+lAL+mNObqqRNw+CQSiij6hpCeZ+C7buhdoVo7go/OYqzaSUfDYmA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-to-fsa": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-to-fsa/-/fs-node-to-fsa-4.64.0.tgz", - "integrity": "sha512-WDD9WVs0hb7UAEKTgZW2f66WDrbj7gIIWwpP3spbLyXa0rghtUaFTB8L4gdR3ZCWwiKIsj38/CNijpVmpnuPUw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-fsa": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-node-utils": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-node-utils/-/fs-node-utils-4.64.0.tgz", - "integrity": "sha512-k5Indsx9hWW9xSF7Y6oSKKwtCUNhzZxadub3owhIlitc+iMRVlPPdX2duTKQWBL3qNWpXya8jykgaaWpheeS4w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "glob-to-regex.js": "^1.0.1" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-print": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-print/-/fs-print-4.64.0.tgz", - "integrity": "sha512-PHZFccchvkhWrwPWHjmVAhbC3vSHCtyZvlZfJJ3ho2bnzl450hXri6/8e6pbkWdH+SkmLXNml0sV8e5HDAfxKw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-node-utils": "4.64.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/fs-snapshot/-/fs-snapshot-4.64.0.tgz", - "integrity": "sha512-oM7UDeL83q6NBzzsfKAsYKXKVXlykKFqqOLh4xZZKAzzROTlInkPbc6LTDGThEOnPiFiUzA7tYziHG9xavd76Q==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^17.65.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "@jsonjoy.com/json-pack": "^17.65.0", - "@jsonjoy.com/util": "^17.65.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/base64": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/base64/-/base64-17.67.0.tgz", - "integrity": "sha512-5SEsJGsm15aP8TQGkDfJvz9axgPwAEm98S5DxOuYe8e1EbfajcDmgeXXzccEjh+mLnjqEKrkBdjHWS5vFNwDdw==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/codegen": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/codegen/-/codegen-17.67.0.tgz", - "integrity": "sha512-idnkUplROpdBOV0HMcwhsCUS5TRUi9poagdGs70A6S4ux9+/aPuKbh8+UYRTLYQHtXvAdNfQWXDqZEx5k4Dj2Q==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pack": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-17.67.0.tgz", - "integrity": "sha512-t0ejURcGaZsn1ClbJ/3kFqSOjlryd92eQY465IYrezsXmPcfHPE/av4twRSxf6WE+TkZgLY+71vCZbiIiFKA/w==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "17.67.0", - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0", - "@jsonjoy.com/json-pointer": "17.67.0", - "@jsonjoy.com/util": "17.67.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/json-pointer": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-17.67.0.tgz", - "integrity": "sha512-+iqOFInH+QZGmSuaybBUNdh7yvNrXvqR+h3wjXm0N/3JK1EyyFAeGJvqnmQL61d1ARLlk/wJdFKSL+LHJ1eaUA==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/util": "17.67.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/fs-snapshot/node_modules/@jsonjoy.com/util": { - "version": "17.67.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-17.67.0.tgz", - "integrity": "sha512-6+8xBaz1rLSohlGh68D1pdw3AwDi9xydm8QNlAFkvnavCJYSze+pxoW2VKP8p308jtlMRLs5NTHfPlZLd4w7ew==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "17.67.0", - "@jsonjoy.com/codegen": "17.67.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack": { - "version": "1.21.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pack/-/json-pack-1.21.0.tgz", - "integrity": "sha512-+AKG+R2cfZMShzrF2uQw34v3zbeDYUqnQ+jg7ORic3BGtfw9p/+N6RJbq/kkV8JmYZaINknaEQ2m0/f693ZPpg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/base64": "^1.1.2", - "@jsonjoy.com/buffers": "^1.2.0", - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/json-pointer": "^1.0.2", - "@jsonjoy.com/util": "^1.9.0", - "hyperdyperid": "^1.2.0", - "thingies": "^2.5.0", - "tree-dump": "^1.1.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pack/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/json-pointer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/json-pointer/-/json-pointer-1.0.2.tgz", - "integrity": "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/codegen": "^1.0.0", - "@jsonjoy.com/util": "^1.9.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.9.0.tgz", - "integrity": "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/buffers": "^1.0.0", - "@jsonjoy.com/codegen": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@jsonjoy.com/util/node_modules/@jsonjoy.com/buffers": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/buffers/-/buffers-1.2.1.tgz", - "integrity": "sha512-12cdlDwX4RUM3QxmUbVJWqZ/mrK6dFQH4Zxq6+r1YXKXYBNgZXndx2qbCJwh3+WWkCSn67IjnlG3XYTvmvYtgA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", - "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", - "license": "MIT" - }, - "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", + "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", + "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", + "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", + "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", + "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", + "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", + "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", + "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", + "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", + "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", + "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", + "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", + "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", + "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", + "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", + "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", + "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", + "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", + "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", + "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", + "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" } }, "node_modules/@parcel/watcher": { "version": "2.5.6", "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, @@ -541,6 +498,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -561,6 +519,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -581,6 +540,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -601,6 +561,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -621,6 +582,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": [ "glibc" ], @@ -644,6 +606,7 @@ "cpu": [ "arm" ], + "dev": true, "libc": [ "musl" ], @@ -667,6 +630,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "glibc" ], @@ -690,6 +654,7 @@ "cpu": [ "arm64" ], + "dev": true, "libc": [ "musl" ], @@ -713,6 +678,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "glibc" ], @@ -736,6 +702,7 @@ "cpu": [ "x64" ], + "dev": true, "libc": [ "musl" ], @@ -759,6 +726,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -779,6 +747,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -799,6 +768,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "MIT", "optional": true, "os": [ @@ -812,808 +782,407 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@peculiar/asn1-cms": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-cms/-/asn1-cms-2.8.0.tgz", - "integrity": "sha512-NgekZOrSJFSBFLFoLfwePguAWAx7z1+f2TEsWFUMyiqqfntZ4+S/S5hzqME3q4pCA0iOsFKdwiQ35dwY24eVqA==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.2.tgz", + "integrity": "sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==", + "cpu": [ + "arm" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@peculiar/asn1-csr": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-csr/-/asn1-csr-2.8.0.tgz", - "integrity": "sha512-akbF8+uvleHs8sejNPQxwmVFuInAg6FMNHOwMILXfP518YfFJwdR3jr6oNUPOaEJfuEhn/vkNOCIT6ASUd4mbg==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.2.tgz", + "integrity": "sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@peculiar/asn1-ecc": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-ecc/-/asn1-ecc-2.8.0.tgz", - "integrity": "sha512-ohwlk+u9Rv2NOAY1c6MfHj45ATVF8R1DUN/WCgABiRtLi2ZftlZWZX7KvpAbU8v9xPcmoILfELeEABj/rn18AQ==", + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.2.tgz", + "integrity": "sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@peculiar/asn1-pfx": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pfx/-/asn1-pfx-2.8.0.tgz", - "integrity": "sha512-5yof1ytoB++RQtaFbqSUJ8pxDJtZT6vbVqZ8XoJ61ph7UjNVvfFwAilnCodqkNsAodpy13gDhoxZXw00pghnyg==", + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.2.tgz", + "integrity": "sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-rsa": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "darwin" + ] }, - "node_modules/@peculiar/asn1-pkcs8": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs8/-/asn1-pkcs8-2.8.0.tgz", - "integrity": "sha512-qAKXtLpBEw9LqhKpjw3ajZSXlBur+ipW+y2ivVBQAG6F6qRx94yO+1ZR4mvw+YaCfKSaOzLeYEzsPaBp4SJELA==", + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.2.tgz", + "integrity": "sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==", + "cpu": [ + "arm64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@peculiar/asn1-pkcs9": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-pkcs9/-/asn1-pkcs9-2.8.0.tgz", - "integrity": "sha512-b5nDWCnkV60+cQ141D6sVVwK9nz64R5n3zSVnklGd+ECdkW2Ol3U1a6yYFlalpSOaD557yuJB64A+q42jG7lUQ==", + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.2.tgz", + "integrity": "sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.8.0", - "@peculiar/asn1-pfx": "^2.8.0", - "@peculiar/asn1-pkcs8": "^2.8.0", - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "@peculiar/asn1-x509-attr": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "freebsd" + ] }, - "node_modules/@peculiar/asn1-rsa": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-rsa/-/asn1-rsa-2.8.0.tgz", - "integrity": "sha512-zHEUlCqB2mk7x2lxDwHHJy7hWZOPdGHVlsmITWKB5/PbQo61atbu9PJ/0r9dQNMwFzbKPXZ8uK8/91eUhRznSg==", + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.2.tgz", + "integrity": "sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@peculiar/asn1-schema": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.8.0.tgz", - "integrity": "sha512-7YT0U/ze0tF2QOBbE15gKZwy5tvgGyLRiRHLzhlbOpf7BT032oBSd0haZqXn5W6l26WLlu3dyxzjM+2638/z2Q==", + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.2.tgz", + "integrity": "sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "@peculiar/utils": "^2.0.2", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@peculiar/asn1-x509": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509/-/asn1-x509-2.8.0.tgz", - "integrity": "sha512-N0CMuhWUzsWEVq6F1q9X6+VKUnWzSW+cSVg+aPaGGwDdbFoFWTYgin5MHwXgpWd6y9COMBxnfy/Qc+Xc7F0Zwg==", + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.2.tgz", + "integrity": "sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/utils": "^2.0.2", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@peculiar/asn1-x509-attr": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/@peculiar/asn1-x509-attr/-/asn1-x509-attr-2.8.0.tgz", - "integrity": "sha512-tHjkfS/qhMnmrlB2J9NhflQlQ7In3khO3CfmVrriOlpTeErY9ZIKOso1hQ5JQiyrJ7ShvqVPk7E5fQmbclkSKA==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.2.tgz", + "integrity": "sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-schema": "^2.8.0", - "@peculiar/asn1-x509": "^2.8.0", - "asn1js": "^3.0.10", - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@peculiar/utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@peculiar/utils/-/utils-2.0.3.tgz", - "integrity": "sha512-+oL3HPFRIZ1St2K50lWCXiioIgSoxzz7R1J3uF6neO2yl1sgmpgY6XXJH4BdpoDkMWznQTeYF6oWNDZLCdQ4eQ==", + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.2.tgz", + "integrity": "sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@peculiar/x509": { - "version": "1.14.3", - "resolved": "https://registry.npmjs.org/@peculiar/x509/-/x509-1.14.3.tgz", - "integrity": "sha512-C2Xj8FZ0uHWeCXXqX5B4/gVFQmtSkiuOolzAgutjTfseNOHT3pUjljDZsTSxXFGgio54bCzVFqmEOUrIVk8RDA==", + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.2.tgz", + "integrity": "sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "@peculiar/asn1-cms": "^2.6.0", - "@peculiar/asn1-csr": "^2.6.0", - "@peculiar/asn1-ecc": "^2.6.0", - "@peculiar/asn1-pkcs9": "^2.6.0", - "@peculiar/asn1-rsa": "^2.6.0", - "@peculiar/asn1-schema": "^2.6.0", - "@peculiar/asn1-x509": "^2.6.0", - "pvtsutils": "^1.3.6", - "reflect-metadata": "^0.2.2", - "tslib": "^2.8.1", - "tsyringe": "^4.10.0" - }, - "engines": { - "node": ">=20.0.0" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.2.tgz", + "integrity": "sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/bonjour": { - "version": "3.5.13", - "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz", - "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==", + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.2.tgz", + "integrity": "sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.2.tgz", + "integrity": "sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", - "dependencies": { - "@types/node": "*" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@types/connect-history-api-fallback": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz", - "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==", + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.2.tgz", + "integrity": "sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "dependencies": { - "@types/express-serve-static-core": "*", - "@types/node": "*" - } + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.2.tgz", + "integrity": "sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.2.tgz", + "integrity": "sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.2.tgz", + "integrity": "sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.2.tgz", + "integrity": "sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.2.tgz", + "integrity": "sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.2.tgz", + "integrity": "sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.2.tgz", + "integrity": "sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.2.tgz", + "integrity": "sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz", + "integrity": "sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, "node_modules/@types/estree": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, "license": "MIT" }, - "node_modules/@types/express": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.6.tgz", - "integrity": "sha512-sKYVuV7Sv9fbPIt/442koC7+IIwK5olP1KWeD88e/idgoJqDm3JV/YUiPwkoKK92ylff2MGxSz1CSjsXelx0YA==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "^2" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.1.2.tgz", - "integrity": "sha512-d3KvEXBSo/lOAMc2u6fkyDHBvetBHeqD7wm/AcXfLpSOQwlmG9D/aQ0SFswVjv05p7ullQS7Mjohj6/VdbZuTg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "license": "MIT" - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "26.1.1", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz", - "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==", - "license": "MIT", - "dependencies": { - "undici-types": "~8.3.0" - } - }, - "node_modules/@types/qs": { - "version": "6.15.1", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.15.1.tgz", - "integrity": "sha512-GZHUBZR9hckSUhrxmp1nG6NwdpM9fCunJwyThLW1X3AyHgd9IlHb6VANpQQqDr2o/qQp6McZ3y/IA2rVzKzSbw==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@types/send/-/send-1.2.1.tgz", - "integrity": "sha512-arsCikDvlU99zl1g69TcAB3mzZPpxgw0UQnaHeC1Nwb015xp8bknZv5rIfri9xTOcMuaVgvabfIRA7PSZVuZIQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/serve-index": { - "version": "1.9.4", - "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz", - "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-8mam4H1NHLtu7nmtalF7eyBH14QyOASmcxHhSfEoRyr0nP/YdoesEtU+uSRvMe96TW/HPTtkoKqQLl53N7UXMQ==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*" - } - }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", - "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" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", - "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" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", - "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" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", - "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" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", - "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/accepts/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", - "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "acorn": "^8.14.0" - } - }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", - "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/ansi-html-community": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/asn1js": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-3.0.10.tgz", - "integrity": "sha512-S2s3aOytiKdFRdulw2qPE51MzjzVOisppcVv7jVFR+Kw0kxwvFrDcYA0h7Ndqbmj0HkMIXYWaoj7fli8kgx1eg==", - "license": "BSD-3-Clause", - "dependencies": { - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.5", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/baseline-browser-mapping": { - "version": "2.10.43", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.43.tgz", - "integrity": "sha512-AjYpR78kDWAY3Efj+cDTFH9t9SCoL7OoTp1BOb0mQV7S+6CiLwnWM3FyxhJtdPufDFKzmCSFoUncKjWgJEZTCQ==", - "license": "Apache-2.0", - "bin": { - "baseline-browser-mapping": "dist/cli.cjs" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/batch": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", - "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==", - "license": "MIT" - }, - "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^2.0.0", - "debug": "^4.4.3", - "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", - "on-finished": "^2.4.1", - "qs": "^6.15.2", - "raw-body": "^3.0.2", - "type-is": "^2.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/bonjour-service": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.4.3.tgz", - "integrity": "sha512-2Kd5UYlFUVgAKMTyuBLl6w49wqfOnbxHqmuH0oCl/n7TfAikR0zoowNOP5BU4dfXmm+Vr9JyEN370auSMx+CNg==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "multicast-dns": "^7.2.5" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "license": "ISC" - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.28.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.6.tgz", - "integrity": "sha512-FQBYNK15VMslhLHpA7+n+n1GOlF1kId2xcCg7/j95f24AOF6VDYMNH4mFxF7KuaTdv627faazpOAjFzMrfJOUw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "baseline-browser-mapping": "^2.10.42", - "caniuse-lite": "^1.0.30001803", - "electron-to-chromium": "^1.5.389", - "node-releases": "^2.0.51", - "update-browserslist-db": "^1.2.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/bundle-name": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", - "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", - "license": "MIT", - "dependencies": { - "run-applescript": "^7.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/bytestreamjs": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/bytestreamjs/-/bytestreamjs-2.0.1.tgz", - "integrity": "sha512-U1Z/ob71V/bXfVABvNr/Kumf5VyeQRBEm6Txb0PQ6S7V5GpBM3w4Cbqz/xPDicR5tN0uvDifng8C+5qECeGwyQ==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "license": "MIT", - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001806", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001806.tgz", - "integrity": "sha512-72Cuvd95zbSYPKq6Fhg8eDJRlzgWDf7/mtoZv6Qe/DYNCEBdNxoA3+rZAU2ZhGCpZlns3EssFavaZomckT5Uuw==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, "node_modules/chokidar": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", + "dev": true, "license": "MIT", "dependencies": { "readdirp": "^5.0.0" @@ -1625,657 +1194,64 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/chrome-trace-event": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", - "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", - "license": "MIT", - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clean-css": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.3.tgz", - "integrity": "sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==", - "license": "MIT", - "dependencies": { - "source-map": "~0.6.0" - }, - "engines": { - "node": ">= 10.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "license": "MIT", - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "license": "MIT", - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", - "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/connect-history-api-fallback": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", - "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/content-disposition": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", - "integrity": "sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-loader": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.4.tgz", - "integrity": "sha512-vv3J9tlOl04WjiMvHQI/9tmIrCxVrj6PFbHemBB1iihpeRbi/I4h033eoFIhwxBBqLhI0KYFS7yvynBFhIZfTw==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.1.0", - "postcss": "^8.4.40", - "postcss-modules-extract-imports": "^3.1.0", - "postcss-modules-local-by-default": "^4.0.5", - "postcss-modules-scope": "^3.2.0", - "postcss-modules-values": "^4.0.0", - "postcss-value-parser": "^4.2.0", - "semver": "^7.6.3" - }, - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "webpack": "^5.27.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/css-loader/node_modules/semver": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", - "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/css-select": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", - "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.0.1", - "domhandler": "^4.3.1", - "domutils": "^2.8.0", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.2.2.tgz", - "integrity": "sha512-u/O3vwbptzhMs3L1fQE82ZSLHQQfto5gyZzwteVIEyeaY5Fc7R4dapF/BvRoSYFeqfBk4m0V1Vafq5Pjv25wvA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/default-browser": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.5.0.tgz", - "integrity": "sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==", - "license": "MIT", - "dependencies": { - "bundle-name": "^4.1.0", - "default-browser-id": "^5.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/default-browser-id": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.1.tgz", - "integrity": "sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/define-lazy-prop": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", - "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" } }, - "node_modules/dns-packet": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz", - "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==", - "license": "MIT", - "dependencies": { - "@leichtgewicht/ip-codec": "^2.0.1" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/dom-converter": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", - "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "license": "MIT", - "dependencies": { - "utila": "~0.4" - } - }, - "node_modules/dom-serializer": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", - "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "license": "BSD-2-Clause" - }, - "node_modules/domhandler": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", - "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "license": "BSD-2-Clause", - "dependencies": { - "domelementtype": "^2.2.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "license": "BSD-2-Clause", - "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.393", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.393.tgz", - "integrity": "sha512-kiDJdIUawuEIcp9XoICKp1iTYDEbgguIPq526N1Q7jIQDeQ3CqoMx71025PI/7E48Ddtw2HuWsVjY7afEgNxmg==", - "license": "ISC" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/enhanced-resolve": { - "version": "5.24.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz", - "integrity": "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.3.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "license": "BSD-2-Clause", - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/envinfo": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz", - "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==", + "node_modules/esbuild": { + "version": "0.28.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", + "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", "bin": { - "envinfo": "dist/cli.js" + "esbuild": "bin/esbuild" }, "engines": { - "node": ">=4" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-module-lexer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz", - "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==", - "license": "MIT" - }, - "node_modules/es-object-atoms": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", - "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" + "node": ">=18" }, - "engines": { - "node": ">= 0.4" + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.1", + "@esbuild/android-arm": "0.28.1", + "@esbuild/android-arm64": "0.28.1", + "@esbuild/android-x64": "0.28.1", + "@esbuild/darwin-arm64": "0.28.1", + "@esbuild/darwin-x64": "0.28.1", + "@esbuild/freebsd-arm64": "0.28.1", + "@esbuild/freebsd-x64": "0.28.1", + "@esbuild/linux-arm": "0.28.1", + "@esbuild/linux-arm64": "0.28.1", + "@esbuild/linux-ia32": "0.28.1", + "@esbuild/linux-loong64": "0.28.1", + "@esbuild/linux-mips64el": "0.28.1", + "@esbuild/linux-ppc64": "0.28.1", + "@esbuild/linux-riscv64": "0.28.1", + "@esbuild/linux-s390x": "0.28.1", + "@esbuild/linux-x64": "0.28.1", + "@esbuild/netbsd-arm64": "0.28.1", + "@esbuild/netbsd-x64": "0.28.1", + "@esbuild/openbsd-arm64": "0.28.1", + "@esbuild/openbsd-x64": "0.28.1", + "@esbuild/openharmony-arm64": "0.28.1", + "@esbuild/sunos-x64": "0.28.1", + "@esbuild/win32-arm64": "0.28.1", + "@esbuild/win32-ia32": "0.28.1", + "@esbuild/win32-x64": "0.28.1" } }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "license": "BSD-2-Clause", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "license": "BSD-2-Clause", - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "license": "MIT", - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "license": "MIT" - }, - "node_modules/fast-uri": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.3.tgz", - "integrity": "sha512-i70LwGWUduXqzicKXWshooq+sWL1K3WUU5rKZNG/0i3a1OSoX3HqhH5WbWwTmqWfor4urUakGPiRQcleRZTwOg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" @@ -2289,496 +1265,35 @@ } } }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "license": "BSD-3-Clause", - "bin": { - "flat": "cli.js" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "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" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-to-regex.js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/glob-to-regex.js/-/glob-to-regex.js-1.2.0.tgz", - "integrity": "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", - "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "license": "MIT", - "bin": { - "he": "bin/he" - } - }, - "node_modules/html-minifier-terser": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "license": "MIT", - "dependencies": { - "camel-case": "^4.1.2", - "clean-css": "^5.2.2", - "commander": "^8.3.0", - "he": "^1.2.0", - "param-case": "^3.0.4", - "relateurl": "^0.2.7", - "terser": "^5.10.0" - }, - "bin": { - "html-minifier-terser": "cli.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/html-webpack-plugin": { - "version": "5.6.7", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.6.7.tgz", - "integrity": "sha512-md+vXtdCAe60s1k6AU3dUyMJnDxUyQAwfwPKoLisvgUF1IXjtlLsk2se54+qfL9Mdm26bbwvjJybpNx48NKRLw==", - "license": "MIT", - "dependencies": { - "@types/html-minifier-terser": "^6.0.0", - "html-minifier-terser": "^6.0.2", - "lodash": "^4.17.21", - "pretty-error": "^4.0.0", - "tapable": "^2.0.0" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/html-webpack-plugin" - }, - "peerDependencies": { - "@rspack/core": "0.x || 1.x", - "webpack": "^5.20.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/htmlparser2": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", - "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } + "optional": true, + "os": [ + "darwin" ], - "license": "MIT", - "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.0.0", - "domutils": "^2.5.2", - "entities": "^2.0.0" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/http-proxy-middleware": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-4.2.0.tgz", - "integrity": "sha512-ZA+oNOoM+GLoFTIzhkJptVQov73Srep2LBqhF8hG8CIPKO3nam1jonXVQ/QUH8RbwsmaaVz2SOJdzBNBHNtKbw==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "httpxy": "^0.5.4", - "is-glob": "^4.0.3", - "is-plain-obj": "^4.1.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": "^22.15.0 || ^24.0.0 || >=26.0.0" - } - }, - "node_modules/httpxy": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/httpxy/-/httpxy-0.5.5.tgz", - "integrity": "sha512-uDjmnPyp1q4Sgzf3w+J/Fc6UqcCEj0x4Wjp7OqK5dGhNeDgpyrAmnS6ey8QWrX3SWDon2DMKf9sBa5X9+CVyMA==", - "license": "MIT" - }, - "node_modules/hyperdyperid": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperdyperid/-/hyperdyperid-1.2.0.tgz", - "integrity": "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A==", - "license": "MIT", - "engines": { - "node": ">=10.18" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", - "integrity": "sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/icss-utils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", - "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/immutable": { "version": "5.1.9", "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.9.tgz", "integrity": "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg==", + "dev": true, "license": "MIT" }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/import-local/node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/interpret": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", - "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/ipaddr.js": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.4.0.tgz", - "integrity": "sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/is-core-module": { - "version": "2.16.2", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", - "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "license": "MIT", - "dependencies": { - "hasown": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-docker": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", - "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", - "license": "MIT", - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.10.0" } @@ -2787,7 +1302,9 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, "license": "MIT", + "optional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2795,382 +1312,11 @@ "node": ">=0.10.0" } }, - "node_modules/is-in-ssh": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-in-ssh/-/is-in-ssh-1.0.0.tgz", - "integrity": "sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-inside-container": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", - "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", - "license": "MIT", - "dependencies": { - "is-docker": "^3.0.0" - }, - "bin": { - "is-inside-container": "cli.js" - }, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-network-error": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.2.tgz", - "integrity": "sha512-PhBY86zaxNZUuWP6h13Vu5oFe0XY6/UlKzQnYFELzGVHygP3MxmvTfYSG7GN3aIab/iWudSMgjSnG9Dq+nHrgA==", - "license": "MIT", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "license": "MIT", - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-wsl": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz", - "integrity": "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==", - "license": "MIT", - "dependencies": { - "is-inside-container": "^1.0.0" - }, - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/launch-editor": { - "version": "2.14.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz", - "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==", - "license": "MIT", - "dependencies": { - "picocolors": "^1.1.1", - "shell-quote": "^1.8.4" - } - }, - "node_modules/loader-runner": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.2.tgz", - "integrity": "sha512-DFEqQ3ihfS9blba08cLfYf1NRAIEm+dDjic073DRDc3/JspI/8wYmtDsHwd3+4hwvdxSK7PGaElfTmm0awWJ4w==", - "license": "MIT", - "engines": { - "node": ">=6.11.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/lodash": { - "version": "4.18.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", - "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", - "license": "MIT" - }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/memfs": { - "version": "4.64.0", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.64.0.tgz", - "integrity": "sha512-Kw72fgY7Wn+sD8KmtNWSafl1dz0UvAsE/PHs3YVfLiaZuA3HxNm9sRLqAu0ATiBGJvME1PxZXbBZPv5GycDeAw==", - "license": "Apache-2.0", - "dependencies": { - "@jsonjoy.com/fs-core": "4.64.0", - "@jsonjoy.com/fs-fsa": "4.64.0", - "@jsonjoy.com/fs-node": "4.64.0", - "@jsonjoy.com/fs-node-builtins": "4.64.0", - "@jsonjoy.com/fs-node-to-fsa": "4.64.0", - "@jsonjoy.com/fs-node-utils": "4.64.0", - "@jsonjoy.com/fs-print": "4.64.0", - "@jsonjoy.com/fs-snapshot": "4.64.0", - "@jsonjoy.com/json-pack": "^1.11.0", - "@jsonjoy.com/util": "^1.9.0", - "glob-to-regex.js": "^1.0.1", - "thingies": "^2.5.0", - "tree-dump": "^1.0.3", - "tslib": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "license": "MIT" - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/micromatch/node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/minimizer-webpack-plugin": { - "version": "5.6.1", - "resolved": "https://registry.npmjs.org/minimizer-webpack-plugin/-/minimizer-webpack-plugin-5.6.1.tgz", - "integrity": "sha512-DoeAZz8Q1C1znwsUzej1fdoi4jCf7/+Em27ouLqfK/+3m8G+D7yDhUwrc3CNhjSzGUN1kn7Iv4sWmjflQHenpw==", - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "terser": "^5.31.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@minify-html/node": { - "optional": true - }, - "@swc/core": { - "optional": true - }, - "@swc/css": { - "optional": true - }, - "@swc/html": { - "optional": true - }, - "clean-css": { - "optional": true - }, - "cssnano": { - "optional": true - }, - "csso": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "html-minifier-terser": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "postcss": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multicast-dns": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", - "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "license": "MIT", - "dependencies": { - "dns-packet": "^5.2.2", - "thunky": "^1.0.2" - }, - "bin": { - "multicast-dns": "cli.js" - } - }, "node_modules/nanoid": { "version": "3.3.16", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "dev": true, "funding": [ { "type": "github", @@ -3185,209 +1331,26 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, - "node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "license": "MIT" - }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "license": "MIT", - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-addon-api": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, "license": "MIT", "optional": true }, - "node_modules/node-releases": { - "version": "2.0.51", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.51.tgz", - "integrity": "sha512-wRNIrw4DmVLKQlbgOMdkMx27Wrpzes2hh5Jtbi2bjPd+4wJstWIqP5A+lscnqbm0xxmT5Bpg8Lec5ItEBwx6BQ==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "license": "BSD-2-Clause", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/open": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/open/-/open-11.0.0.tgz", - "integrity": "sha512-smsWv2LzFjP03xmvFoJ331ss6h+jixfA4UUV/Bsiyuu4YJPfN+FIQGOIiv4w9/+MoHkfkJ22UIaQWRVFRfH6Vw==", - "license": "MIT", - "dependencies": { - "default-browser": "^5.4.0", - "define-lazy-prop": "^3.0.0", - "is-in-ssh": "^1.0.0", - "is-inside-container": "^1.0.0", - "powershell-utils": "^0.1.0", - "wsl-utils": "^0.3.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-retry": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-8.0.0.tgz", - "integrity": "sha512-kFVqH1HxOHp8LupNsOys7bSV09VYTRLxarH/mokO4Rqhk6wGi70E0jh4VzvVGXfEVNggHoHLAMWsQqHyU1Ey9A==", - "license": "MIT", - "dependencies": { - "is-network-error": "^1.3.0" - }, - "engines": { - "node": ">=22" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "license": "MIT", - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "license": "MIT", - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "license": "MIT" - }, - "node_modules/path-to-regexp": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.4.2.tgz", - "integrity": "sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz", "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==", + "dev": true, "license": "MIT", "engines": { "node": ">=12" @@ -3396,27 +1359,11 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkijs": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/pkijs/-/pkijs-3.4.0.tgz", - "integrity": "sha512-emEcLuomt2j03vxD54giVB4SxTjnsqkU692xZOZXHDVoYyypEm+b3jpiTcc+Cf+myooc+/Ly0z01jqeNHVgJGw==", - "license": "BSD-3-Clause", - "dependencies": { - "@noble/hashes": "1.4.0", - "asn1js": "^3.0.6", - "bytestreamjs": "^2.0.1", - "pvtsutils": "^1.3.6", - "pvutils": "^1.1.3", - "tslib": "^2.8.1" - }, - "engines": { - "node": ">=16.0.0" - } - }, "node_modules/postcss": { "version": "8.5.19", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.19.tgz", "integrity": "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ==", + "dev": true, "funding": [ { "type": "opencollective", @@ -3441,194 +1388,11 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-modules-extract-imports": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", - "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", - "license": "ISC", - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-local-by-default": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz", - "integrity": "sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==", - "license": "MIT", - "dependencies": { - "icss-utils": "^5.0.0", - "postcss-selector-parser": "^7.0.0", - "postcss-value-parser": "^4.1.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-scope": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz", - "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==", - "license": "ISC", - "dependencies": { - "postcss-selector-parser": "^7.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-modules-values": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", - "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "license": "ISC", - "dependencies": { - "icss-utils": "^5.0.0" - }, - "engines": { - "node": "^10 || ^12 || >= 14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, - "node_modules/postcss-selector-parser": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.4.tgz", - "integrity": "sha512-HeP7D2wyhkR+XaK6v4W8oRF62Dsz4flyuczALJp61GckGm42u1saSSJ/0auvcBqxs3jMRFEcPK34At/0JBKdOg==", - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "license": "MIT" - }, - "node_modules/powershell-utils": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/powershell-utils/-/powershell-utils-0.1.0.tgz", - "integrity": "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==", - "license": "MIT", - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pretty-error": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", - "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.20", - "renderkid": "^3.0.0" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/proxy-addr/node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pvtsutils": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.3.6.tgz", - "integrity": "sha512-PLgQXQ6H2FWCaeRak8vvk1GW462lMxB5s3Jm673N82zI4vqtVUPuZdffdZbPDFRoU8kAhItWFtPCWiPpp4/EDg==", - "license": "MIT", - "dependencies": { - "tslib": "^2.8.1" - } - }, - "node_modules/pvutils": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.1.5.tgz", - "integrity": "sha512-KTqnxsgGiQ6ZAzZCVlJH5eOjSnvlyEgx1m8bkRJfOhmGRqfo5KLvmAlACQkrjEtOQ4B7wF9TdSLIs9O90MX9xA==", - "license": "MIT", - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/qs": { - "version": "6.15.3", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", - "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==", - "license": "BSD-3-Clause", - "dependencies": { - "es-define-property": "^1.0.1", - "side-channel": "^1.1.1" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.3.0.tgz", - "integrity": "sha512-hek2mFQpPuI4E1BBKrSto+BU3e3x4xuarsbiwr3+lf7p44juvFMV0XFWQAP3xUyqXA4RrXLIoaSUGbSt056ZMw==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/readdirp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.0.0.tgz", "integrity": "sha512-9u/XQ1pvrQtYyMpZe7DXKv2p5CNvyVwzUB6uhLAnQwHMSgKMBR62lc7AHljaeteeHXn11XTAaLLUVZYVZyuRBQ==", + "dev": true, "license": "MIT", "engines": { "node": ">= 20.19.0" @@ -3638,155 +1402,56 @@ "url": "https://paulmillr.com/funding/" } }, - "node_modules/rechoir": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz", - "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==", + "node_modules/rollup": { + "version": "4.62.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.2.tgz", + "integrity": "sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==", + "dev": true, "license": "MIT", "dependencies": { - "resolve": "^1.20.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0" - }, - "node_modules/relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/renderkid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", - "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "license": "MIT", - "dependencies": { - "css-select": "^4.1.3", - "dom-converter": "^0.2.0", - "htmlparser2": "^6.1.0", - "lodash": "^4.17.21", - "strip-ansi": "^6.0.1" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.12", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", - "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "is-core-module": "^2.16.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" + "@types/estree": "1.0.9" }, "bin": { - "resolve": "bin/resolve" + "rollup": "dist/bin/rollup" }, "engines": { - "node": ">= 0.4" + "node": ">=18.0.0", + "npm": ">=8.0.0" }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.62.2", + "@rollup/rollup-android-arm64": "4.62.2", + "@rollup/rollup-darwin-arm64": "4.62.2", + "@rollup/rollup-darwin-x64": "4.62.2", + "@rollup/rollup-freebsd-arm64": "4.62.2", + "@rollup/rollup-freebsd-x64": "4.62.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.62.2", + "@rollup/rollup-linux-arm-musleabihf": "4.62.2", + "@rollup/rollup-linux-arm64-gnu": "4.62.2", + "@rollup/rollup-linux-arm64-musl": "4.62.2", + "@rollup/rollup-linux-loong64-gnu": "4.62.2", + "@rollup/rollup-linux-loong64-musl": "4.62.2", + "@rollup/rollup-linux-ppc64-gnu": "4.62.2", + "@rollup/rollup-linux-ppc64-musl": "4.62.2", + "@rollup/rollup-linux-riscv64-gnu": "4.62.2", + "@rollup/rollup-linux-riscv64-musl": "4.62.2", + "@rollup/rollup-linux-s390x-gnu": "4.62.2", + "@rollup/rollup-linux-x64-gnu": "4.62.2", + "@rollup/rollup-linux-x64-musl": "4.62.2", + "@rollup/rollup-openbsd-x64": "4.62.2", + "@rollup/rollup-openharmony-arm64": "4.62.2", + "@rollup/rollup-win32-arm64-msvc": "4.62.2", + "@rollup/rollup-win32-ia32-msvc": "4.62.2", + "@rollup/rollup-win32-x64-gnu": "4.62.2", + "@rollup/rollup-win32-x64-msvc": "4.62.2", + "fsevents": "~2.3.2" } }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/run-applescript": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.1.0.tgz", - "integrity": "sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, "node_modules/sass": { "version": "1.101.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.101.0.tgz", "integrity": "sha512-OL3GoQyoUdDt843DpVmDO6y2k1sc5IhUDSpu8XucEI+35neq5QivZ1iuegnpraEVTJXlQGK1gl27zKcTLEPbQw==", + "dev": true, "license": "MIT", "dependencies": { "chokidar": "^5.0.0", @@ -3803,514 +1468,27 @@ "@parcel/watcher": "^2.4.1" } }, - "node_modules/sass-loader": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-17.0.0.tgz", - "integrity": "sha512-0Ybm8ohBQ9LcrycVrFQp/KQBNX5a3Wda9/smS0mE/xLffzEnwvV8nykOzrbiSWNzTE3IB/jiXx8O4QmDPG2+Gw==", - "license": "MIT", - "engines": { - "node": ">= 22.11.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "@rspack/core": "0.x || ^1.0.0 || ^2.0.0-0", - "sass": "^1.3.0", - "sass-embedded": "*", - "webpack": "^5.0.0" - }, - "peerDependenciesMeta": { - "@rspack/core": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "webpack": { - "optional": true - } - } - }, - "node_modules/schema-utils": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.3.tgz", - "integrity": "sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/selfsigned": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-5.5.0.tgz", - "integrity": "sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==", - "license": "MIT", - "dependencies": { - "@peculiar/x509": "^1.14.2", - "pkijs": "^3.3.3" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "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.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-index": { - "version": "1.9.2", - "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.2.tgz", - "integrity": "sha512-KDj11HScOaLmrPxl70KYNW1PksP4Nb/CLL2yvC+Qd2kHMPEEpfc4Re2e4FOay+bC/+XQl/7zAcWON3JVo5v3KQ==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.8", - "batch": "0.6.1", - "debug": "2.6.9", - "escape-html": "~1.0.3", - "http-errors": "~1.8.0", - "mime-types": "~2.1.35", - "parseurl": "~1.3.3" - }, - "engines": { - "node": ">= 0.8.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-index/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/serve-index/node_modules/depd": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/http-errors": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", - "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "license": "MIT", - "dependencies": { - "depd": "~1.1.2", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/serve-index/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-index/node_modules/statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "license": "MIT", - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.10.0.tgz", - "integrity": "sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.1.tgz", - "integrity": "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4", - "side-channel-list": "^1.0.1", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz", - "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/style-loader": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-4.0.0.tgz", - "integrity": "sha512-1V4WqhhZZgjVAVJyt7TdDPZoPBPNHbekX4fWnCJL1yQukhCeZhJySUL+gL9y6sNdN95uEOS83Y55SqHcP7MzLA==", - "license": "MIT", - "engines": { - "node": ">= 18.12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.27.0" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz", - "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==", - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/terser": { - "version": "5.49.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.49.0.tgz", - "integrity": "sha512-SNiDnXyHSrxVcIOtVbULzcTmniUiwcV7Nwdyj1twVubeTmbjoa8p69KKDpfkdoOavuM4/GRm1+ykI8qqnavHoA==", - "license": "BSD-2-Clause", - "dependencies": { - "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.15.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser/node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "license": "MIT" - }, - "node_modules/thingies": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/thingies/-/thingies-2.6.0.tgz", - "integrity": "sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==", - "license": "MIT", - "engines": { - "node": ">=10.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "^2" - } - }, "node_modules/three": { "version": "0.185.1", "resolved": "https://registry.npmjs.org/three/-/three-0.185.1.tgz", "integrity": "sha512-5aojFCXKwnjBRZvUnt3WFfEcvUJgkN5LlijRFN95hMy8WVkG4I0QNcJE+OuWvuJ0bOdStrbfXn0pkd6/QyiAlg==", "license": "MIT" }, - "node_modules/thunky": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "license": "MIT" - }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", @@ -4323,449 +1501,80 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, "license": "MIT", "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/tree-dump": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.1.0.tgz", - "integrity": "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA==", - "license": "Apache-2.0", - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/tsyringe": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/tsyringe/-/tsyringe-4.10.0.tgz", - "integrity": "sha512-axr3IdNuVIxnaK5XGEUFTu3YmAQ6lllgrvqfEoR16g/HGnYY/6We4oWENtAnzK6/LpJ2ur9PAb80RBt7/U4ugw==", - "license": "MIT", - "dependencies": { - "tslib": "^1.9.3" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/tsyringe/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "license": "0BSD" - }, - "node_modules/type-is": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.1.0.tgz", - "integrity": "sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==", - "license": "MIT", - "dependencies": { - "content-type": "^2.0.0", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/type-is/node_modules/content-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-2.0.0.tgz", - "integrity": "sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/undici-types": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", - "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "esbuild": "^0.27.0 || ^0.28.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" }, "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "license": "MIT" - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/watchpack": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.5.2.tgz", - "integrity": "sha512-6i/00NBjP4yGPs+caKSyRfpTF/8Torsu0MOW3mMzIbhgISFder8i7xbqgHlLMwJrdiN8ndBV3UA1/AfzPSr+jg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.1.2" + "vite": "bin/vite.js" }, "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.108.4", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.108.4.tgz", - "integrity": "sha512-yur8LyJoeiWh47dErD+Ok7vlbmDsJ3UbbRPAoxbGJ54WpE2y5yVo5G/inUzujnYgw3tPmBRdn+G7PoxXaYC33w==", - "license": "MIT", - "dependencies": { - "@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.16.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.28.1", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.22.2", - "es-module-lexer": "^2.1.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "graceful-fs": "^4.2.11", - "loader-runner": "^4.3.2", - "mime-db": "^1.54.0", - "minimizer-webpack-plugin": "^5.6.1", - "neo-async": "^2.6.2", - "schema-utils": "^4.3.3", - "tapable": "^2.3.0", - "watchpack": "^2.5.2", - "webpack-sources": "^3.5.0" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" + "node": "^20.19.0 || >=22.12.0" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "url": "https://github.com/vitejs/vite?sponsor=1" }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-7.2.1.tgz", - "integrity": "sha512-YwSGbcZdfz12DM8JIseVPr3oBb09IgVCVc4vY3oDvZnI/mALTGPAP1QiqOi4/bBLSJrRHaqDIXeHcNA0+G38aw==", - "license": "MIT", - "dependencies": { - "@discoveryjs/json-ext": "^1.1.0", - "commander": "^14.0.3", - "cross-spawn": "^7.0.6", - "envinfo": "^7.21.0", - "import-local": "^3.2.0", - "interpret": "^3.1.1", - "rechoir": "^0.8.0", - "webpack-merge": "^6.0.1" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=20.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" + "optionalDependencies": { + "fsevents": "~2.3.3" }, "peerDependencies": { - "js-yaml": "^4.0.0 || ^5.0.0", - "json5": "^2.2.3", - "toml": "^3.0.0 || ^4.0.0", - "webpack": "^5.101.0", - "webpack-bundle-analyzer": "^4.0.0 || ^5.0.0", - "webpack-dev-server": "^5.0.0 || ^6.0.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", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { - "js-yaml": { + "@types/node": { "optional": true }, - "json5": { + "jiti": { "optional": true }, - "toml": { + "less": { "optional": true }, - "webpack-bundle-analyzer": { + "lightningcss": { "optional": true }, - "webpack-dev-server": { + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { "optional": true } } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/webpack-dev-middleware": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-8.0.3.tgz", - "integrity": "sha512-zWrde9VZDiRaFuWsjHO40wm9LxxtXEk8DdzFXdU7eU5ZpiANnZZDBbZgN3guxbEoKqUHd9YupBmynyioz42nkA==", - "license": "MIT", - "dependencies": { - "memfs": "^4.56.10", - "mime-types": "^3.0.2", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "schema-utils": "^4.3.3" - }, - "engines": { - "node": ">= 20.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.101.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - } - } - }, - "node_modules/webpack-dev-server": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-6.0.0.tgz", - "integrity": "sha512-q9SD4ItOGhZLeU6EGT10caDZdHjF50Pz1DtkRZZOPsfluMXOkacWKKOtSBSLVkPqKiF67eFUC0rI88U/tSFPEw==", - "license": "MIT", - "dependencies": { - "@types/bonjour": "^3.5.13", - "@types/connect-history-api-fallback": "^1.5.4", - "@types/express": "^5.0.6", - "@types/express-serve-static-core": "^5.1.1", - "@types/serve-index": "^1.9.4", - "@types/serve-static": "^2.2.0", - "@types/ws": "^8.18.1", - "ansi-html-community": "^0.0.8", - "bonjour-service": "^1.3.0", - "chokidar": "^5.0.0", - "compression": "^1.8.1", - "connect-history-api-fallback": "^2.0.0", - "express": "^5.2.1", - "graceful-fs": "^4.2.11", - "http-proxy-middleware": "^4.1.1", - "ipaddr.js": "^2.3.0", - "launch-editor": "^2.14.1", - "open": "^11.0.0", - "p-retry": "^8.0.0", - "schema-utils": "^4.3.3", - "selfsigned": "^5.5.0", - "serve-index": "^1.9.2", - "tinyglobby": "^0.2.15", - "webpack-dev-middleware": "^8.0.3", - "ws": "^8.20.0" - }, - "bin": { - "webpack-dev-server": "bin/webpack-dev-server.js" - }, - "engines": { - "node": ">= 22.15.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.101.0" - }, - "peerDependenciesMeta": { - "webpack": { - "optional": true - }, - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-merge": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-6.0.1.tgz", - "integrity": "sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==", - "license": "MIT", - "dependencies": { - "clone-deep": "^4.0.1", - "flat": "^5.0.2", - "wildcard": "^2.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.5.1.tgz", - "integrity": "sha512-jyuiGJdtvY434z5bUZrjz67v76/ePNvFZTp9Mdz29IlH4+GPsgyGjiv0fKI+M7BdkU6ADjulUcKAd3tUK3WlEw==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", - "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", - "license": "MIT" - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/ws": { - "version": "8.21.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.1.tgz", - "integrity": "sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/wsl-utils": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/wsl-utils/-/wsl-utils-0.3.1.tgz", - "integrity": "sha512-g/eziiSUNBSsdDJtCLB8bdYEUMj4jR7AGeUo96p/3dTafgjHhpF4RiCFPiRILwjQoDXx5MqkBr4fwWtR3Ky4Wg==", - "license": "MIT", - "dependencies": { - "is-wsl": "^3.1.0", - "powershell-utils": "^0.1.0" - }, - "engines": { - "node": ">=20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } } } } diff --git a/package.json b/package.json index 281f4fe..9f77791 100644 --- a/package.json +++ b/package.json @@ -1,17 +1,14 @@ { "dependencies": { - "css-loader": "^7.1.4", - "html-webpack-plugin": "^5.6.7", + "three": "^0.185.1" + }, + "devDependencies": { "sass": "^1.101.0", - "sass-loader": "^17.0.0", - "style-loader": "^4.0.0", - "three": "^0.185.1", - "webpack": "^5.108.4", - "webpack-cli": "^7.2.1", - "webpack-dev-server": "^6.0.0" + "vite": "^7.3.0" }, "scripts": { - "start": "webpack serve --env mode=development", - "build": "webpack --config webpack.config.js --env mode=production" + "start": "vite", + "build": "vite build", + "preview": "vite preview" } } diff --git a/src/css/styles.scss b/src/css/styles.scss index 4e41b69..91d1d51 100644 --- a/src/css/styles.scss +++ b/src/css/styles.scss @@ -1,3 +1,254 @@ +// theme variables; dark is the default (also covers the instant before JS sets +// the data-theme attribute), light is the same landing palette inverted. +// Every page shares --page-bg: the scene canvases are transparent, so the +// landing gradient is the scenery background, 1:1. +:root { + --page-bg: radial-gradient(ellipse at 50% 30%, #2a1204 0%, #120701 60%, #000 100%); + --fade-bg: #120701; + --ink: #f5e9de; + --ink-soft: rgba(245, 233, 222, 0.7); + --ink-faint: rgba(245, 233, 222, 0.55); + --panel-bg: rgba(18, 7, 1, 0.75); + --panel-border: rgba(244, 79, 4, 0.35); +} + +html[data-theme='light'] { + --page-bg: radial-gradient(ellipse at 50% 30%, #fff8f0 0%, #ffe7d3 60%, #ffd4b3 100%); + --fade-bg: #ffe7d3; + --ink: #1b0a02; + --ink-soft: rgba(27, 10, 2, 0.7); + --ink-faint: rgba(27, 10, 2, 0.5); + --panel-bg: rgba(255, 248, 240, 0.85); + --panel-border: rgba(244, 79, 4, 0.4); +} + +html, +body { + min-height: 100vh; +} + body { margin: 0; -} \ No newline at end of file + background: var(--page-bg); + font-family: Georgia, 'Times New Roman', serif; + color: var(--ink); +} + +canvas { + display: block; +} + +// page transition: opaque at first paint, faded out by chrome.js once the page +// is ready, faded back in before navigating away. High z-index so it also +// covers stats (z-index 10000) and lil-gui. +.fade { + position: fixed; + inset: 0; + z-index: 10001; + background: var(--fade-bg); + opacity: 1; + pointer-events: none; + transition: opacity 0.35s ease; + + &.done { + opacity: 0; + } +} + +.theme-toggle { + position: fixed; + bottom: 16px; + right: 16px; + z-index: 20; + width: 40px; + height: 40px; + border: 1px solid var(--panel-border); + border-radius: 50%; + background: var(--panel-bg); + color: var(--ink); + font-size: 18px; + line-height: 1; + cursor: pointer; + + &:hover { + border-color: #f44f04; + } +} + +// back-link on the exploration pages; bottom-left because stats sits top-left +// and lil-gui top-right +.page-nav { + position: fixed; + bottom: 16px; + left: 16px; + z-index: 10; + display: flex; + gap: 12px; + align-items: baseline; + font-family: Georgia, 'Times New Roman', serif; + + a { + color: var(--ink); + background: var(--panel-bg); + border: 1px solid var(--panel-border); + text-decoration: none; + padding: 6px 12px; + border-radius: 999px; + font-size: 14px; + + &:hover { + border-color: #f44f04; + } + } + + span { + color: var(--ink-soft); + font-size: 14px; + letter-spacing: 0.04em; + } +} + +// ---------- control panel (lil-gui reskin) ---------- // + +.lil-gui { + --background-color: var(--panel-bg); + --text-color: var(--ink); + --title-background-color: transparent; + --title-text-color: #f44f04; + --widget-color: rgba(244, 79, 4, 0.18); + --hover-color: rgba(244, 79, 4, 0.3); + --focus-color: rgba(244, 79, 4, 0.45); + --number-color: #ff9a5c; + --string-color: #ff9a5c; + --font-family: Georgia, 'Times New Roman', serif; + --font-size: 13px; + --input-font-size: 13px; + --widget-border-radius: 6px; + + &.root { + margin: 12px; + border: 1px solid var(--panel-border); + border-radius: 12px; + overflow: hidden; + backdrop-filter: blur(6px); + } + + &.root > .title { + letter-spacing: 0.08em; + } +} + +html[data-theme='light'] .lil-gui { + --number-color: #c2410c; + --string-color: #c2410c; +} + +// ---------- landing ---------- // + +body.landing { + --card-bg: rgba(18, 7, 1, 0.65); + --card-bg-hover: rgba(42, 18, 4, 0.85); +} + +html[data-theme='light'] body.landing { + --card-bg: rgba(255, 255, 255, 0.6); + --card-bg-hover: rgba(255, 255, 255, 0.95); +} + +.landing-bg { + position: fixed; + inset: 0; + z-index: 0; + pointer-events: none; +} + +.landing-content { + position: relative; + z-index: 1; + max-width: 960px; + margin: 0 auto; + padding: 10vh 24px 12vh; + + header { + text-align: center; + margin-bottom: 64px; + + h1 { + font-size: 64px; + font-weight: normal; + letter-spacing: 0.12em; + margin: 0; + color: #f44f04; + } + + p { + margin: 12px 0 0; + font-size: 18px; + letter-spacing: 0.06em; + color: var(--ink-soft); + } + } +} + +.cards { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); + gap: 20px; +} + +.card { + display: block; + padding: 24px; + border: 1px solid var(--panel-border); + border-radius: 12px; + background: var(--card-bg); + color: inherit; + text-decoration: none; + transition: transform 0.2s ease, border-color 0.2s ease, background 0.2s ease; + + &:hover { + transform: translateY(-4px); + border-color: #f44f04; + background: var(--card-bg-hover); + } + + h2 { + margin: 0 0 10px; + font-size: 22px; + font-weight: normal; + color: #f44f04; + } + + p { + margin: 0; + font-size: 14px; + line-height: 1.55; + color: var(--ink-soft); + } +} + +.soon { + margin-top: 72px; + text-align: center; + + h3 { + font-weight: normal; + font-size: 15px; + letter-spacing: 0.2em; + text-transform: uppercase; + color: var(--ink-faint); + margin: 0 0 16px; + } + + ul { + list-style: none; + margin: 0; + padding: 0; + + li { + font-size: 14px; + color: var(--ink-faint); + margin: 6px 0; + } + } +} diff --git a/src/flower.html b/src/flower.html new file mode 100644 index 0000000..fb1bea9 --- /dev/null +++ b/src/flower.html @@ -0,0 +1,17 @@ + + + + + Flower of Life + + + + +
+ + + + diff --git a/src/flower.js b/src/flower.js index e746ccc..5135004 100644 --- a/src/flower.js +++ b/src/flower.js @@ -4,12 +4,19 @@ import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; -import Stats from 'three/addons/libs/stats.module.js'; -import './css/styles.scss'; +import './lib/chrome.js'; +import { sceneColors } from './lib/theme.js'; +import { bindWorld } from './lib/transit.js'; +const colors = sceneColors(); + +// the landing gradient shows through a transparent canvas; all shapes live in +// `world`, which page transitions fly in and out const scene = new THREE.Scene(); -scene.background = new THREE.Color(0xf44f04); +const world = new THREE.Group(); +scene.add( world ); +const updateWorld = bindWorld( world ); const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 500 ); @@ -18,7 +25,7 @@ camera.position.x = 10; camera.position.y = 4; -const renderer = new THREE.WebGLRenderer( { antialias: true } ); +const renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setPixelRatio( Math.min( window.devicePixelRatio, 2 ) ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.shadowMap.enabled = true; @@ -42,13 +49,13 @@ controls.target.set( -4, 0, 0 ); // const torus = new THREE.Mesh( geometry_torus, material_torus ); // torus.rotation.x = Math.PI / 2; // torus.castShadow = true; -// scene.add( torus ); +// world.add( torus ); // const icoGeometry = new THREE.IcosahedronGeometry( 5 ); // const icoMaterial= new THREE.MeshBasicMaterial( {color: 0x049ef4, wireframe: true, wireframeLinewidth: 8 } ); // const iso = new THREE.Mesh( icoGeometry, icoMaterial ); // iso.castShadow = true; -// scene.add( iso ); +// world.add( iso ); // --------- Mekaraba ---------- // // const tetraGeometry = new THREE.TetrahedronGeometry( 2 ); @@ -58,7 +65,7 @@ controls.target.set( -4, 0, 0 ); // // tetra.rotation.x = Math.PI / 4 ; // tetra.rotation.z = Math.PI / 6 ; -// // scene.add( tetra ); +// // world.add( tetra ); // const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); // const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); @@ -69,7 +76,7 @@ controls.target.set( -4, 0, 0 ); // // tetraEdgesLine.rotation.y = Math.PI / 6; // tetraEdgesLine.castShadow = true; -// scene.add( tetraEdgesLine ); +// world.add( tetraEdgesLine ); // const tetraGeometry2 = new THREE.TetrahedronGeometry( 2 ); // const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); @@ -78,7 +85,7 @@ controls.target.set( -4, 0, 0 ); // tetra2.rotation.x = Math.PI / 4 ; // // tetra2.rotation.y = Math.PI / 4 ; // tetra2.rotation.z = Math.PI / 4 ; -// // scene.add( tetra2 ); +// // world.add( tetra2 ); // const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); // const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); @@ -87,7 +94,7 @@ controls.target.set( -4, 0, 0 ); // tetraEdgesLine2.rotation.x = Math.PI / 4 ; // // tetraEdgesLine2.rotation.y = Math.PI / 4 ; // tetraEdgesLine2.rotation.z = Math.PI / 4 ; -// scene.add( tetraEdgesLine2 ); +// world.add( tetraEdgesLine2 ); // ---------- David ------------ // @@ -96,14 +103,14 @@ controls.target.set( -4, 0, 0 ); // const tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); // tetra.rotation.y = Math.PI / 6 ; // tetra.position.y = 1 / 2 -// scene.add( tetra ); +// world.add( tetra ); // const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); // const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); // tetraEdgesLine.rotation.y = Math.PI / 6 ; // tetraEdgesLine.position.y = 1 / 2 // tetraEdgesLine.castShadow = true; -// scene.add( tetraEdgesLine ); +// world.add( tetraEdgesLine ); // const tetraGeometry2 = new THREE.ConeGeometry( 2, 3, 3 ); // const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); @@ -111,7 +118,7 @@ controls.target.set( -4, 0, 0 ); // tetra2.rotation.y = Math.PI + Math.PI / 6 ; // tetra2.rotation.z = Math.PI; // tetra2.position.y = - 1 / 2 -// scene.add( tetra2 ); +// world.add( tetra2 ); // const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); // const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); @@ -119,7 +126,7 @@ controls.target.set( -4, 0, 0 ); // tetraEdgesLine2.rotation.y = Math.PI + Math.PI / 6 ; // tetraEdgesLine2.rotation.z = Math.PI; // tetraEdgesLine2.position.y = - 1 / 2 -// scene.add( tetraEdgesLine2 ); +// world.add( tetraEdgesLine2 ); // ---------- Flower of life ------------ // @@ -127,11 +134,11 @@ controls.target.set( -4, 0, 0 ); // const circleMaterial = new THREE.MeshBasicMaterial( { color: 0x049ef4, side: THREE.DoubleSide } ); // const circle = new THREE.Mesh( circleGeometry, circleMaterial ); // circle.castShadow = true; -// scene.add( circle ); +// world.add( circle ); // const circleLine = new THREE.LineSegments( circleGeometry, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); // circleLine.castShadow = true; -// scene.add( circleLine ); +// world.add( circleLine ); let rotatePoint2D = (cx, cy, angle, px, py) => { angle = - angle * (Math.PI / 180) @@ -217,8 +224,8 @@ let renderFlower = (size = 3, radius = 1) => { [xtemp2, ytemp2, ztemp2] = rotatePoint3D(x, y, z, params['yangle'], params['xangle'], params['zangle']) let sphereGeometry = new THREE.SphereGeometry( radius, 64, 64 ); - let sphereMaterial = new THREE.MeshStandardMaterial( { - color: 0x0063e4, + let sphereMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.sphere, metalness: 0.7, roughness: 0.3, opacity: 0.8, @@ -228,11 +235,11 @@ let renderFlower = (size = 3, radius = 1) => { sphere.position.x = xtemp2; sphere.position.y = ytemp2; sphere.position.z = ztemp2; - scene.add( sphere ); + world.add( sphere ); let circleGeometry = new THREE.TorusGeometry( radius, 0.02, 64, 64 ); - let circleMaterial = new THREE.MeshBasicMaterial( { - color: 0x000000, + let circleMaterial = new THREE.MeshBasicMaterial( { + color: colors.line, opacity: 0.1, transparent: true } ); @@ -242,7 +249,7 @@ let renderFlower = (size = 3, radius = 1) => { circleCircum.position.x = xtemp2; circleCircum.position.y = ytemp2; circleCircum.position.z = ztemp2; - scene.add( circleCircum ); + world.add( circleCircum ); sphere.start_x = x; sphere.start_y = y; @@ -267,7 +274,7 @@ let renderFlower = (size = 3, radius = 1) => { circleCircum = new THREE.Mesh( circleGeometry, circleMaterial ); circleCircum.rotation.y = Math.PI / 2; circleCircum.castShadow = true; - scene.add( circleCircum ); + world.add( circleCircum ); const gui = new GUI(); @@ -300,22 +307,22 @@ let renderFlower = (size = 3, radius = 1) => { }); gui.add( params, 'size', 2, 5).step(1).onChange( (value) => { for (let sphere of spheres) { - scene.remove(sphere) + world.remove(sphere) } for (let sphereLine of spheresLines) { - scene.remove(sphereLine) + world.remove(sphereLine) } - scene.remove(circleCircum) + world.remove(circleCircum) renderFlower (value, params['radius']) }); gui.add( params, 'radius', 0.5, 3).onChange( (value) => { for (let sphere of spheres) { - scene.remove(sphere) + world.remove(sphere) } for (let sphereLine of spheresLines) { - scene.remove(sphereLine) + world.remove(sphereLine) } - scene.remove(circleCircum) + world.remove(circleCircum) renderFlower (params['size'], value) }); gui.close(); @@ -323,8 +330,11 @@ let renderFlower = (size = 3, radius = 1) => { renderFlower() +// dark mode gets a soft warm ambient so unlit faces keep their colour +if ( colors.dark ) scene.add( new THREE.AmbientLight( colors.light, 0.9 ) ); + // legacy lighting was removed in three r155: intensities need the old value times pi -const spotLight = new THREE.DirectionalLight( 0xeaa7a7, 1.5 * Math.PI ); +const spotLight = new THREE.DirectionalLight( colors.light, 1.5 * Math.PI ); spotLight.position.set( 10, 0, 0 ); spotLight.castShadow = true; spotLight.shadow.mapSize.width = 2048; @@ -338,11 +348,11 @@ spotLight.shadow.camera.bottom = -10; // spotLight.shadow.camera.fov = 35; scene.add( spotLight ); -//Create a plane that receives shadows (but does not cast them) +// the wall itself is invisible: only the shadow "projection" shows, in light +// orange, floating on the gradient const planeGeometry = new THREE.PlaneGeometry( 20, 20, 10, 10 ); -const planeMaterial = new THREE.MeshStandardMaterial( { color: 0xffffff } ) +const planeMaterial = new THREE.ShadowMaterial( { color: colors.shadow, opacity: 0.9 } ) const plane = new THREE.Mesh( planeGeometry, planeMaterial ); -planeMaterial.side = THREE.DoubleSide; plane.rotation.y = Math.PI / 2; plane.position.x = -10 plane.receiveShadow = true; @@ -350,16 +360,14 @@ scene.add( plane ); //Create a helper for the shadow camera (optional) const helper = new THREE.CameraHelper( spotLight.shadow.camera ); -// scene.add( helper ); +// world.add( helper ); const axesHelper = new THREE.AxesHelper( 40 ); -scene.add( axesHelper ); +// scene.add( axesHelper ); // const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 0.2 ); -// scene.add( light ); +// world.add( light ); -let stats = new Stats(); -document.body.appendChild( stats.dom ); // var axis = new THREE.Vector3(0, 1, 0); @@ -378,8 +386,8 @@ function animate () { // sphereLine.position.z = - Math.sin( time ) * sphereLine.start_z; // } + updateWorld(); controls.update(); - stats.update(); renderer.render( scene, camera ); }; diff --git a/src/index.html b/src/index.html index d12e09f..91e927a 100644 --- a/src/index.html +++ b/src/index.html @@ -4,7 +4,52 @@ Thrive + - + +
+
+
+

Thrive

+

Sacred geometry, lifted into three dimensions.

+
+ +
+ +

Metatron’s Cube

+

The five Platonic solids — fire, earth, air, water and aether — nested in the 3D Fruit of Life, every vertex on a circle centre.

+
+ +

Toroidal Field

+

The self-sustaining field: strands winding around the torus, through the centre and back around the outside.

+
+ +

Vector Equilibrium

+

The cuboctahedron, where centre and neighbour are the same distance apart — 12 spheres kissing a 13th.

+
+ +

Golden Spiral

+

Phyllotaxis: seeds placed one golden angle apart become a sunflower, a pinecone, a perfectly even sphere.

+
+ +

Flower of Life

+

The flower unfolded into a cubic grid of interlocking spheres.

+
+ +

Seed of Life

+

The seven circles of the seed, rotated through space into a sphere of spheres.

+
+
+ +
+

Still unfolding

+
    +
  • Sri Yantra — the nine interlocking triangles raised into Mount Meru
  • +
  • Tesseract — the cube’s shadow from the fourth dimension
  • +
  • Tree of Life — ten sephirot and twenty-two paths in space
  • +
+
+
+ - \ No newline at end of file + diff --git a/src/index.js b/src/index.js index 1032f37..9e26a10 100644 --- a/src/index.js +++ b/src/index.js @@ -1,31 +1,19 @@ - import * as THREE from 'three'; -import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; -import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; - -import Stats from 'three/addons/libs/stats.module.js'; - -import './css/styles.scss'; +import './lib/chrome.js'; +import { bindWorld } from './lib/transit.js'; +// Landing page backdrop: a slowly turning seed of life and icosahedron drawn in +// faint orange lines behind the cards. No controls, no stats - just ambience. const scene = new THREE.Scene(); -scene.background = new THREE.Color(0xf44f04); -const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 500 ); -camera.position.z = 12; -camera.position.x = 10; -camera.position.y = 4; +const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 100 ); +camera.position.z = 14; -// debug switches to bisect driver issues: ?noaa disables MSAA, ?noshadow disables shadow maps -const debugFlags = new URLSearchParams( window.location.search ); - -const renderer = new THREE.WebGLRenderer( { antialias: !debugFlags.has( 'noaa' ) } ); +const renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setPixelRatio( Math.min( window.devicePixelRatio, 2 ) ); renderer.setSize( window.innerWidth, window.innerHeight ); -renderer.shadowMap.enabled = !debugFlags.has( 'noshadow' ); -renderer.shadowMap.type = THREE.PCFSoftShadowMap; -renderer.toneMapping = THREE.ACESFilmicToneMapping; -renderer.toneMappingExposure = 1; +renderer.domElement.classList.add( 'landing-bg' ); document.body.appendChild( renderer.domElement ); window.addEventListener( 'resize', () => { @@ -34,729 +22,40 @@ window.addEventListener( 'resize', () => { renderer.setSize( window.innerWidth, window.innerHeight ); } ); -const controls = new OrbitControls( camera, renderer.domElement ); -controls.target.set( -4, 0, 0 ); +const group = new THREE.Group(); +scene.add( group ); +const updateWorld = bindWorld( group ); +const ringMaterial = new THREE.MeshBasicMaterial( { color: 0xf44f04, opacity: 0.35, transparent: true } ); +const ringGeometry = new THREE.TorusGeometry( 2, 0.015, 16, 128 ); -// const geometry_torus = new THREE.TorusGeometry( 2.5, 2.5, 32, 128 ); -// const material_torus = new THREE.MeshBasicMaterial( { color: 0x049ef4, wireframe: true, wireframeLinewidth: 1} ); -// const torus = new THREE.Mesh( geometry_torus, material_torus ); -// torus.rotation.x = Math.PI / 2; -// torus.castShadow = true; -// scene.add( torus ); +// seed of life: one central ring plus six on its circumference +const centreRing = new THREE.Mesh( ringGeometry, ringMaterial ); +group.add( centreRing ); -// const icoGeometry = new THREE.IcosahedronGeometry( 5 ); -// const icoMaterial= new THREE.MeshBasicMaterial( {color: 0x049ef4, wireframe: true, wireframeLinewidth: 8 } ); -// const iso = new THREE.Mesh( icoGeometry, icoMaterial ); -// iso.castShadow = true; -// scene.add( iso ); - -// --------- Mekaraba ---------- // -// const tetraGeometry = new THREE.TetrahedronGeometry( 2 ); -// const tetraMaterial = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); -// const tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); -// // tetra.position.y = - 0.81 - -// // tetra.rotation.x = Math.PI / 4 ; -// tetra.rotation.z = Math.PI / 6 ; -// // scene.add( tetra ); - -// const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); -// const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); -// // tetraEdgesLine.position.y = -0.81 - -// tetraEdgesLine.rotation.x = Math.PI / 4; -// // tetraEdgesLine.rotation.y = Math.PI ; -// // tetraEdgesLine.rotation.y = Math.PI / 6; - -// tetraEdgesLine.castShadow = true; -// scene.add( tetraEdgesLine ); - -// const tetraGeometry2 = new THREE.TetrahedronGeometry( 2 ); -// const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); -// const tetra2 = new THREE.Mesh( tetraGeometry2, tetraMaterial2 ); -// tetra2.position.y = 0.81 -// tetra2.rotation.x = Math.PI / 4 ; -// // tetra2.rotation.y = Math.PI / 4 ; -// tetra2.rotation.z = Math.PI / 4 ; -// // scene.add( tetra2 ); - -// const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); -// const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); -// tetraEdgesLine2.castShadow = true; -// tetraEdgesLine2.position.y = 0.81 -// tetraEdgesLine2.rotation.x = Math.PI / 4 ; -// // tetraEdgesLine2.rotation.y = Math.PI / 4 ; -// tetraEdgesLine2.rotation.z = Math.PI / 4 ; -// scene.add( tetraEdgesLine2 ); - - -// ---------- David ------------ // -// const tetraGeometry = new THREE.ConeGeometry( 2, 3, 3 ); -// const tetraMaterial = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); -// const tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); -// tetra.rotation.y = Math.PI / 6 ; -// tetra.position.y = 1 / 2 -// scene.add( tetra ); - -// const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); -// const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); -// tetraEdgesLine.rotation.y = Math.PI / 6 ; -// tetraEdgesLine.position.y = 1 / 2 -// tetraEdgesLine.castShadow = true; -// scene.add( tetraEdgesLine ); - -// const tetraGeometry2 = new THREE.ConeGeometry( 2, 3, 3 ); -// const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); -// const tetra2 = new THREE.Mesh( tetraGeometry2, tetraMaterial2 ); -// tetra2.rotation.y = Math.PI + Math.PI / 6 ; -// tetra2.rotation.z = Math.PI; -// tetra2.position.y = - 1 / 2 -// scene.add( tetra2 ); - -// const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); -// const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); -// tetraEdgesLine2.castShadow = true; -// tetraEdgesLine2.rotation.y = Math.PI + Math.PI / 6 ; -// tetraEdgesLine2.rotation.z = Math.PI; -// tetraEdgesLine2.position.y = - 1 / 2 -// scene.add( tetraEdgesLine2 ); - -// ---------- Flower of life ------------ // - - -let rotatePoint2D = (cx, cy, angle, px, py) => { - angle = - angle * (Math.PI / 180) - let s = Math.sin(angle); - let c = Math.cos(angle); - - // translate point back to origin: - px -= cx; - py -= cy; - - // rotatePoint3D point - let xnew = px * c + py * s; - let ynew = px * s - py * c; - - // translate point back: - px = xnew + cx; - py = ynew + cy; - return [px, py]; +for ( let i = 0; i < 6; i++ ) { + const angle = ( i / 6 ) * Math.PI * 2; + const ring = new THREE.Mesh( ringGeometry, ringMaterial ); + ring.position.set( 2 * Math.cos( angle ), 2 * Math.sin( angle ), 0 ); + group.add( ring ); } -function rotatePoint3D(px, py, pz, pitch, roll, yaw) { - pitch = - pitch * (Math.PI / 180) - roll = - roll * (Math.PI / 180) - yaw = - yaw * (Math.PI / 180) +const icosa = new THREE.LineSegments( + new THREE.EdgesGeometry( new THREE.IcosahedronGeometry( 5.2 ) ), + new THREE.LineBasicMaterial( { color: 0xf44f04, opacity: 0.25, transparent: true } ) +); +group.add( icosa ); - var cosa = Math.cos(yaw); - var sina = Math.sin(yaw); - - var cosb = Math.cos(pitch); - var sinb = Math.sin(pitch); - - var cosc = Math.cos(roll); - var sinc = Math.sin(roll); - - var Axx = cosa*cosb; - var Axy = cosa*sinb*sinc - sina*cosc; - var Axz = cosa*sinb*cosc + sina*sinc; - - var Ayx = sina*cosb; - var Ayy = sina*sinb*sinc + cosa*cosc; - var Ayz = sina*sinb*cosc - cosa*sinc; - - var Azx = -sinb; - var Azy = cosb*sinc; - var Azz = cosb*cosc; - - let x = Axx*px + Axy*py + Axz*pz; - let y = Ayx*px + Ayy*py + Ayz*pz; - let z = Azx*px + Azy*py + Azz*pz; - - return [x, y, z] -} - -// WebGL draws lines at 1px regardless of linewidth, so the shape edges are built -// from real cylinder tubes instead - same 0.03 thickness as the circle tori -function makeEdgeTubes( geometry, color, tubeRadius = 0.03 ) { - const edges = new THREE.EdgesGeometry( geometry ); - const positions = edges.attributes.position; - const group = new THREE.Group(); - const material = new THREE.MeshBasicMaterial( { color } ); - const up = new THREE.Vector3( 0, 1, 0 ); - const start = new THREE.Vector3(); - const end = new THREE.Vector3(); - - for ( let i = 0; i < positions.count; i += 2 ) { - start.fromBufferAttribute( positions, i ); - end.fromBufferAttribute( positions, i + 1 ); - const direction = new THREE.Vector3().subVectors( end, start ); - const length = direction.length(); - - const cylinder = new THREE.CylinderGeometry( tubeRadius, tubeRadius, length, 12 ); - cylinder.translate( 0, length / 2, 0 ); - - const tube = new THREE.Mesh( cylinder, material ); - tube.position.copy( start ); - tube.quaternion.setFromUnitVectors( up, direction.normalize() ); - tube.castShadow = true; - group.add( tube ); - } - - return group; -} - -const params = { - xangle: 45, - yangle: 0, - zangle: 54.72972973, - radius: 1, - tube: 0.03, -}; - -// const params = { -// xangle: 0, -// yangle: 0, -// zangle: 0, -// size: 5, -// radius: 1 -// }; - -let sphere, circleCircum, cube, cubeLines; -let spheres = []; -let spheresLines = []; -let gui; -let solids = []; - -let renderFlower = (radius = 1) => { - spheres = []; - spheresLines = []; - - // tear down the previous render's shapes and GUI so re-rendering never stacks duplicates - if ( gui ) gui.destroy(); - for ( let obj of solids ) scene.remove( obj ); - solids = []; - - // 3D fruit of life: a circle on the centre, on every cube corner and on - // every cube edge midpoint (the inner ring of the 2D pattern) - const d = 4 * 0.612 * radius; - const points = [ [ 0, 0, 0 ] ]; - - for ( let sx of [ -1, 1 ] ) { - for ( let sy of [ -1, 1 ] ) { - for ( let sz of [ -1, 1 ] ) { - points.push( [ sx * d, sy * d, sz * d ] ); - } - } - } - - // only the edge midpoints whose coordinates share a sign: the other six sit on - // the projection equator and would add circles between the two rings - for ( let s of [ -1, 1 ] ) { - points.push( [ s * d, s * d, 0 ] ); - points.push( [ s * d, 0, s * d ] ); - points.push( [ 0, s * d, s * d ] ); - } - - const addCircleAt = ( x, y, z, parent ) => { - let xtemp, ytemp, ztemp; - - [xtemp, ytemp, ztemp] = rotatePoint3D(x, y, z, params['yangle'], params['xangle'], params['zangle']) - - let sphereGeometry = new THREE.SphereGeometry( radius, 64, 64 ); - let sphereMaterial = new THREE.MeshStandardMaterial( { - color: 0x0063e4, - metalness: 0.7, - roughness: 0.3, - opacity: 0.8, - transparent: true - } ); - sphere = new THREE.Mesh( sphereGeometry, sphereMaterial ); - sphere.position.x = xtemp; - sphere.position.y = ytemp; - sphere.position.z = ztemp; - parent.add( sphere ); - - let circleGeometry = new THREE.TorusGeometry( radius, params['tube'], 64, 64 ); - let circleMaterial = new THREE.MeshBasicMaterial( { - color: 0x000000, - opacity: 0.1, - transparent: true - } ); - let ring = new THREE.Mesh( circleGeometry, circleMaterial ); - ring.castShadow = true; - ring.rotation.y = Math.PI / 2; - ring.position.x = xtemp; - ring.position.y = ytemp; - ring.position.z = ztemp; - parent.add( ring ); - - circleGeometry = new THREE.TorusGeometry( 0.01, 0.01, 64, 64 ); - circleMaterial = new THREE.MeshBasicMaterial( { - color: 0x000000, - opacity: 0.1, - transparent: true - } ); - circleCircum = new THREE.Mesh( circleGeometry, circleMaterial ); - circleCircum.castShadow = true; - circleCircum.rotation.y = Math.PI / 2; - circleCircum.position.x = xtemp; - circleCircum.position.y = ytemp; - circleCircum.position.z = ztemp; - parent.add( circleCircum ); - - sphere.start_x = x; - sphere.start_y = y; - sphere.start_z = z; - ring.start_x = x; - ring.start_y = y; - ring.start_z = z; - circleCircum.start_x = x; - circleCircum.start_y = y; - circleCircum.start_z = z; - - spheres.push(sphere) - spheresLines.push(ring) - spheresLines.push(circleCircum) - }; - - for ( let point of points ) { - addCircleAt( ...point, scene ); - } - - // the remaining cube circles: the six equatorial edge midpoints and the six - // face centres, hidden behind the "allCubeCircles" toggle - const extraCircles = new THREE.Group(); - extraCircles.visible = false; - - for ( let s of [ -1, 1 ] ) { - for ( let extraPoint of [ - [ s * d, -s * d, 0 ], [ s * d, 0, -s * d ], [ 0, s * d, -s * d ], - [ s * d, 0, 0 ], [ 0, s * d, 0 ], [ 0, 0, s * d ], - ] ) { - addCircleAt( ...extraPoint, extraCircles ); - } - } - - scene.add( extraCircles ); - - // Metatron's web: every circle centre connected to every other one - let web = new THREE.Group(); - const webMaterial = new THREE.MeshBasicMaterial( { color: 0x000000, opacity: 0.5, transparent: true } ); - const webUp = new THREE.Vector3( 0, 1, 0 ); - - for ( let i = 0; i < points.length; i++ ) { - for ( let j = i + 1; j < points.length; j++ ) { - const [ ax, ay, az ] = rotatePoint3D( ...points[ i ], params[ 'yangle' ], params[ 'xangle' ], params[ 'zangle' ] ); - const [ bx, by, bz ] = rotatePoint3D( ...points[ j ], params[ 'yangle' ], params[ 'xangle' ], params[ 'zangle' ] ); - const a = new THREE.Vector3( ax, ay, az ); - const b = new THREE.Vector3( bx, by, bz ); - const direction = new THREE.Vector3().subVectors( b, a ); - const length = direction.length(); - - const webTube = params['tube'] * 0.4; - const cylinder = new THREE.CylinderGeometry( webTube, webTube, length, 6 ); - cylinder.translate( 0, length / 2, 0 ); - - const strand = new THREE.Mesh( cylinder, webMaterial ); - strand.position.copy( a ); - strand.quaternion.setFromUnitVectors( webUp, direction.clone().normalize() ); - web.add( strand ); - } - } - - web.visible = false; - scene.add( web ); - - // the exact rotation the circle grid uses, as a matrix - solids aligned with - // this coincide with the dots instead of approximating them with tuned angles - const gridRotation = new THREE.Matrix4().makeBasis( - new THREE.Vector3( ...rotatePoint3D( 1, 0, 0, params['yangle'], params['xangle'], params['zangle'] ) ), - new THREE.Vector3( ...rotatePoint3D( 0, 1, 0, params['yangle'], params['xangle'], params['zangle'] ) ), - new THREE.Vector3( ...rotatePoint3D( 0, 0, 1, params['yangle'], params['xangle'], params['zangle'] ) ) - ); - - - // earth - width 2d puts every corner exactly on a corner dot - const boxGeometry = new THREE.BoxGeometry( 2 * d, 2 * d, 2 * d ); - const boxMaterial = new THREE.MeshStandardMaterial( { - color: 0x994f28, - metalness: 0.7, - roughness: 0.3, - opacity: 0.8, - transparent: true, - // wireframe: true, - } ); - cube = new THREE.Mesh( boxGeometry, boxMaterial ); - cube.setRotationFromMatrix( gridRotation ); - - cubeLines = makeEdgeTubes( boxGeometry, 0x1b0a02, params['tube'] ); - cubeLines.setRotationFromMatrix( gridRotation ); - cubeLines.castShadow = true; - - scene.add( cubeLines ); - scene.add( cube ); - - // fire - radius sqrt(3)d puts every vertex exactly on a corner dot - const tetraGeometry = new THREE.TetrahedronGeometry( Math.sqrt( 3 ) * d ) - const tetraMaterial = new THREE.MeshStandardMaterial( { - color: 0xdb1212, - metalness: 0.7, - roughness: 0.3, - opacity: 0.8, - transparent: true - } ); - let tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); - - let tetraLines = makeEdgeTubes( tetraGeometry, 0x140101, params['tube'] ); - - - - tetraLines.setRotationFromMatrix( gridRotation ); - tetra.setRotationFromMatrix( gridRotation ); - tetraLines.castShadow = true; - - scene.add( tetraLines ); - scene.add( tetra ); - - // second tetrahedron of the star tetrahedron (Merkaba): the same shape - // rotated a quarter turn so it interlocks with the first - const tetraGeometry2 = new THREE.TetrahedronGeometry( Math.sqrt( 3 ) * d ); - tetraGeometry2.rotateZ( Math.PI / 2 ); - let tetra2 = new THREE.Mesh( tetraGeometry2, tetraMaterial ); - let tetraLines2 = makeEdgeTubes( tetraGeometry2, 0x140101, params['tube'] ); - - tetra2.rotation.copy( tetra.rotation ); - tetraLines2.rotation.copy( tetraLines.rotation ); - - scene.add( tetraLines2 ); - scene.add( tetra2 ); - - // radius 2d puts the projected corners exactly on the outer circle centres - const octaGeometry = new THREE.OctahedronGeometry( 2 * d ) - const octaMaterial = new THREE.MeshStandardMaterial( { - color: 0x9dedf6, - metalness: 0.7, - roughness: 0.3, - opacity: 0.8, - transparent: true - } ); - let octa = new THREE.Mesh( octaGeometry, octaMaterial ); - - let octaLines = makeEdgeTubes( octaGeometry, 0x0a2528, params['tube'] ); - - octaLines.setRotationFromMatrix( gridRotation ); - octa.setRotationFromMatrix( gridRotation ); - octaLines.castShadow = true; - - scene.add( octaLines ); - scene.add( octa ); - - // radius 1.663d puts the projected corners on the outer circle centres - const icosaGeometry = new THREE.IcosahedronGeometry( 1.663 * d ) - const icosaMaterial = new THREE.MeshStandardMaterial( { - color: 0x0063e4, - metalness: 0.7, - roughness: 0.3, - opacity: 0.8, - transparent: true - } ); - let icosa = new THREE.Mesh( icosaGeometry, icosaMaterial ); - - let icosaLines = makeEdgeTubes( icosaGeometry, 0x000000, params['tube'] ); - - // a grid-aligned icosahedron projects its corners 22.2 degrees off the dot - // hexagon, so it gets an extra twist about the view diagonal to meet the dots - const PHI = ( 1 + Math.sqrt( 5 ) ) / 2; - const icosaTwist = Math.PI / 6 - Math.atan( ( PHI + 2 ) / ( Math.sqrt( 3 ) * PHI ) ); - const icosaRotation = new THREE.Matrix4().multiplyMatrices( - gridRotation, - new THREE.Matrix4().makeRotationAxis( new THREE.Vector3( 1, 1, 1 ).normalize(), icosaTwist ) - ); - - icosaLines.setRotationFromMatrix( icosaRotation ); - icosa.setRotationFromMatrix( icosaRotation ); - icosaLines.castShadow = true; - - scene.add( icosaLines ); - scene.add( icosa ); - - // 2.29 * 1.003: tuned against the circle pattern - const dodecaGeometry = new THREE.DodecahedronGeometry( 2.297 * radius ) - const dodecaMaterial = new THREE.MeshStandardMaterial( { - color: 0x0063e4, - metalness: 0.7, - roughness: 0.3, - opacity: 0.8, - transparent: true - } ); - let dodeca = new THREE.Mesh( dodecaGeometry, dodecaMaterial ); - - let dodecaLines = makeEdgeTubes( dodecaGeometry, 0x000000, params['tube'] ); - - // aether: a dodecahedron vertex sits on the cube diagonal, so the plain grid - // rotation points a vertex straight at the light and shares the cube's frame, - // with a tuned x-angle on top - dodecaLines.setRotationFromMatrix( gridRotation ); - dodeca.setRotationFromMatrix( gridRotation ); - dodecaLines.rotation.x = 52.25 * (Math.PI / 180); - dodeca.rotation.x = 52.25 * (Math.PI / 180); - dodecaLines.castShadow = true; - - scene.add( dodecaLines ); - scene.add( dodeca ); - - - // Big circle: visible as a solid tube, same thickness as the shape edges - let circleGeometry = new THREE.TorusGeometry( 5 * radius, params['tube'], 64, 64); - let circleMaterial = new THREE.MeshBasicMaterial( { color: 0x000000 } ); - circleCircum = new THREE.Mesh( circleGeometry, circleMaterial ); - circleCircum.rotation.y = Math.PI / 2; - circleCircum.castShadow = true; - scene.add( circleCircum ); - - solids.push( cube, cubeLines, tetra, tetraLines, tetra2, tetraLines2, octa, octaLines, icosa, icosaLines, dodeca, dodecaLines, circleCircum, web, extraCircles ); - - - gui = new GUI(); - - let guiDict = {}; - - let fire = gui.addFolder('Fire'); - guiDict['fire'] = {'folder': fire, 'object': tetra, 'objectLines': tetraLines}; - - let fire2 = gui.addFolder('Fire 2'); - guiDict['fire2'] = {'folder': fire2, 'object': tetra2, 'objectLines': tetraLines2}; - - let air = gui.addFolder('Air'); - guiDict['air'] = {'folder': air, 'object': octa, 'objectLines': octaLines}; - - let earth = gui.addFolder('Earth'); - guiDict['earth'] = {'folder': earth, 'object': cube, 'objectLines': cubeLines}; - - let water = gui.addFolder('Water'); - guiDict['water'] = {'folder': water, 'object': icosa, 'objectLines': icosaLines}; - - let aether = gui.addFolder('Aether') - guiDict['aether'] = {'folder': aether, 'object': dodeca, 'objectLines': dodecaLines}; - - let circles = gui.addFolder('Circles') - guiDict['circles'] = {'folder': circles}; - - circles.add( { web: false }, 'web' ).onChange( ( value ) => { - web.visible = value; - } ); - - circles.add( { allCubeCircles: false }, 'allCubeCircles' ).onChange( ( value ) => { - extraCircles.visible = value; - } ); - - let folderStandard = { - show: true, - fill: true, - frame: true, - xAngle: 45, - yAngle: 0, - zAngle: 54.72972973, - size: 5, - radius: 1, - scale: 1, - } - - circles.add( folderStandard, 'show', true).onChange((value) => { - if (value) { - for (let sphere of spheres) { - sphere.visible = true; - } - for (let sphereLine of spheresLines) { - sphereLine.visible = true; - } - } else { - for (let sphere of spheres) { - sphere.visible = false; - } - for (let sphereLine of spheresLines) { - sphereLine.visible = false; - } - } - }); - - for (let fld of Object.keys(guiDict)) { - // guiDict[fld]['folder'].close() - if (fld === "circles") { - continue - } - folderStandard.show = true; - - folderStandard.xAngle = guiDict[fld]['object'].rotation.x / (Math.PI / 180); - folderStandard.yAngle = guiDict[fld]['object'].rotation.y / (Math.PI / 180); - folderStandard.zAngle = guiDict[fld]['object'].rotation.z / (Math.PI / 180); - - guiDict[fld]['folder'].add( folderStandard, 'scale', 0, 2 ).step(0.001).onChange( (value) => { - guiDict[fld]['object'].scale.x = value - guiDict[fld]['object'].scale.y = value - guiDict[fld]['object'].scale.z = value - guiDict[fld]['objectLines'].scale.x = value - guiDict[fld]['objectLines'].scale.y = value - guiDict[fld]['objectLines'].scale.z = value - }); - - guiDict[fld]['folder'].add( folderStandard, 'show', true).onChange((value) => { - if (value) { - guiDict[fld]['object'].visible = true; - guiDict[fld]['objectLines'].visible = true; - } else { - guiDict[fld]['object'].visible = false; - guiDict[fld]['objectLines'].visible = false; - } - }); - guiDict[fld]['folder'].add( folderStandard, 'fill', true).onChange((value) => { - if (value) { - guiDict[fld]['object'].visible = true; - } else { - guiDict[fld]['object'].visible = false; - } - }); - guiDict[fld]['folder'].add( folderStandard, 'frame', true).onChange((value) => { - if (value) { - guiDict[fld]['objectLines'].visible = true; - } else { - guiDict[fld]['objectLines'].visible = false; - } - }); - - guiDict[fld]['folder'].add( folderStandard, 'xAngle', 0, 360 ).step(0.1).onChange( (value) => { - guiDict[fld]['object'].rotation.x = value * (Math.PI / 180) - guiDict[fld]['objectLines'].rotation.x = value * (Math.PI / 180) - }); - - guiDict[fld]['folder'].add( folderStandard, 'yAngle', 0, 360 ).step(0.1).onChange( (value) => { - guiDict[fld]['object'].rotation.y = value * (Math.PI / 180) - guiDict[fld]['objectLines'].rotation.y = value * (Math.PI / 180) - }); - guiDict[fld]['folder'].add( folderStandard, 'zAngle', 0, 360 ).step(0.1).onChange( (value) => { - guiDict[fld]['object'].rotation.z = value * (Math.PI / 180) - guiDict[fld]['objectLines'].rotation.z = value * (Math.PI / 180) - }); - } - - circles.add( params, 'xangle', 0, 360 ).step(0.1).onChange( (value) => { - for (let sphere of spheres) { - [sphere.position.x, sphere.position.y, sphere.position.z] = rotatePoint3D(sphere.start_x, sphere.start_y, sphere.start_z, params['yangle'], value, params['zangle']) - } - for (let sphereLine of spheresLines) { - [sphereLine.position.x, sphereLine.position.y, sphereLine.position.z] = rotatePoint3D(sphereLine.start_x, sphereLine.start_y, sphereLine.start_z, params['yangle'], value, params['zangle']) - } - - }); - circles.add( params, 'yangle', 0, 360 ).step(0.1).onChange( (value) => { - for (let sphere of spheres) { - [sphere.position.x, sphere.position.y, sphere.position.z] = rotatePoint3D(sphere.start_x, sphere.start_y, sphere.start_z, value, params['xangle'], params['zangle']) - } - for (let sphereLine of spheresLines) { - [sphereLine.position.x, sphereLine.position.y, sphereLine.position.z] = rotatePoint3D(sphereLine.start_x, sphereLine.start_y, sphereLine.start_z, value, params['xangle'], params['zangle']) - } - }); - circles.add( params, 'zangle', 0, 360 ).step(0.1).onChange( (value) => { - for (let sphere of spheres) { - [sphere.position.x, sphere.position.y, sphere.position.z] = rotatePoint3D(sphere.start_x, sphere.start_y, sphere.start_z, params['yangle'], params['xangle'], value) - } - for (let sphereLine of spheresLines) { - [sphereLine.position.x, sphereLine.position.y, sphereLine.position.z] = rotatePoint3D(sphereLine.start_x, sphereLine.start_y, sphereLine.start_z, params['yangle'], params['xangle'], value) - } - }); - gui.add( params, 'radius', 0.5, 1.5).onChange( (value) => { - for (let sphere of spheres) { - scene.remove(sphere) - } - for (let sphereLine of spheresLines) { - scene.remove(sphereLine) - } - renderFlower (value) - }); - gui.add( params, 'tube', 0.01, 0.1 ).step( 0.005 ).onChange( () => { - for (let sphere of spheres) { - scene.remove(sphere) - } - for (let sphereLine of spheresLines) { - scene.remove(sphereLine) - } - renderFlower (params['radius']) - }); - - // ?only= hides the other solids, for - // checking a single shape against the reference - const only = debugFlags.get( 'only' ); - if ( only && guiDict[ only ] ) { - for ( let fld of Object.keys( guiDict ) ) { - if ( fld === only || ! guiDict[ fld ][ 'object' ] ) continue; - guiDict[ fld ][ 'object' ].visible = false; - guiDict[ fld ][ 'objectLines' ].visible = false; - } - } - - gui.close(); -} - -renderFlower() - -// legacy lighting was removed in three r155: intensities need the old value times pi -const spotLight = new THREE.DirectionalLight( 0xeaa7a7, 1.5 * Math.PI ); -spotLight.position.set( 10, 0, 0 ); -spotLight.castShadow = true; -spotLight.shadow.mapSize.width = 2048; -spotLight.shadow.mapSize.height = 2048; -spotLight.shadow.camera.far = 21; -spotLight.shadow.camera.left = -10; -spotLight.shadow.camera.right = 10; -spotLight.shadow.camera.top = 10; -spotLight.shadow.camera.bottom = -10; - -// spotLight.shadow.camera.fov = 35; -scene.add( spotLight ); - -//Create a plane that receives shadows (but does not cast them) -const planeGeometry = new THREE.PlaneGeometry( 20, 20, 10, 10 ); -const planeMaterial = new THREE.MeshStandardMaterial( { color: 0xffffff } ) -const plane = new THREE.Mesh( planeGeometry, planeMaterial ); -planeMaterial.side = THREE.DoubleSide; -plane.rotation.y = Math.PI / 2; -plane.position.x = -10 -plane.receiveShadow = true; -scene.add( plane ); - -//Create a helper for the shadow camera (optional) -// const helper = new THREE.CameraHelper( spotLight.shadow.camera ); -// scene.add( helper ); - -// const axesHelper = new THREE.AxesHelper( 40 ); -// scene.add( axesHelper ); - -let stats = new Stats(); -document.body.appendChild( stats.dom ); - -// var axis = new THREE.Vector3(0, 1, 0); - -function animate () { +function animate() { requestAnimationFrame( animate ); + // in-plane rotation only: the flower turns with the site, never edge-on const time = performance.now() / 1000; + group.rotation.z = time * 0.05; + icosa.rotation.z = -time * 0.08; - // for (let sphere of spheres) { - // sphere.position.x = Math.cos( time ) * sphere.start_x; - // sphere.position.z = - Math.sin( time ) * sphere.start_z; - // } - - // for (let sphereLine of spheresLines) { - // sphereLine.position.x = Math.cos( time ) * sphereLine.start_x; - // sphereLine.position.z = - Math.sin( time ) * sphereLine.start_z; - // } - - controls.update(); - stats.update(); - + updateWorld(); renderer.render( scene, camera ); -}; +} -animate(); \ No newline at end of file +animate(); diff --git a/src/lib/chrome.js b/src/lib/chrome.js new file mode 100644 index 0000000..485f21d --- /dev/null +++ b/src/lib/chrome.js @@ -0,0 +1,51 @@ +import { currentTheme, toggleTheme } from './theme.js'; +import { EXIT_MS } from './transit.js'; + +// Shared page chrome: theme attribute for the CSS, fade transitions between +// pages, and the dark/light toggle. Imported for its side effects by every page. +document.documentElement.dataset.theme = currentTheme(); + +const FADE_MS = 350; + +window.addEventListener( 'DOMContentLoaded', () => { + // the overlay lives in the HTML templates so it covers the very first paint; + // pages without one (shouldn't happen) still get a working fallback + let fade = document.querySelector( '.fade' ); + if ( ! fade ) { + fade = document.createElement( 'div' ); + fade.className = 'fade'; + document.body.appendChild( fade ); + } + + // double rAF so the browser commits the opaque state before transitioning + requestAnimationFrame( () => requestAnimationFrame( () => fade.classList.add( 'done' ) ) ); + + // fly the shapes out first, fade through the background for the tail of the + // flight, then navigate + const fadeTo = ( action ) => { + window.dispatchEvent( new Event( 'thrive:exit' ) ); + setTimeout( () => fade.classList.remove( 'done' ), EXIT_MS - FADE_MS + 100 ); + setTimeout( action, EXIT_MS + 100 ); + }; + + document.addEventListener( 'click', ( event ) => { + const link = event.target.closest( 'a[href]' ); + if ( ! link || link.origin !== location.origin ) return; + event.preventDefault(); + fadeTo( () => { location.href = link.href; } ); + } ); + + const button = document.createElement( 'button' ); + button.className = 'theme-toggle'; + button.textContent = currentTheme() === 'dark' ? '☀' : '☾'; + button.title = 'toggle dark / light'; + button.addEventListener( 'click', () => { + // the scenes build their materials once at startup, so switching theme + // reloads the page - the fade makes that read as a transition + fadeTo( () => { + toggleTheme(); + location.reload(); + } ); + } ); + document.body.appendChild( button ); +} ); diff --git a/src/lib/edgeTubes.js b/src/lib/edgeTubes.js new file mode 100644 index 0000000..de41feb --- /dev/null +++ b/src/lib/edgeTubes.js @@ -0,0 +1,46 @@ +import * as THREE from 'three'; + +// WebGL draws lines at 1px regardless of linewidth, so shape edges are built +// from real cylinder tubes instead - same trick as the Metatron page +export function makeEdgeTubes( geometry, color, tubeRadius = 0.03 ) { + const edges = new THREE.EdgesGeometry( geometry ); + const positions = edges.attributes.position; + const group = new THREE.Group(); + const material = new THREE.MeshBasicMaterial( { color } ); + const up = new THREE.Vector3( 0, 1, 0 ); + const start = new THREE.Vector3(); + const end = new THREE.Vector3(); + + for ( let i = 0; i < positions.count; i += 2 ) { + start.fromBufferAttribute( positions, i ); + end.fromBufferAttribute( positions, i + 1 ); + const direction = new THREE.Vector3().subVectors( end, start ); + const length = direction.length(); + + const cylinder = new THREE.CylinderGeometry( tubeRadius, tubeRadius, length, 12 ); + cylinder.translate( 0, length / 2, 0 ); + + const tube = new THREE.Mesh( cylinder, material ); + tube.position.copy( start ); + tube.quaternion.setFromUnitVectors( up, direction.normalize() ); + tube.castShadow = true; + group.add( tube ); + } + + return group; +} + +// A straight tube between two points, for edges that don't come from a geometry +export function makeTube( a, b, material, tubeRadius = 0.03 ) { + const direction = new THREE.Vector3().subVectors( b, a ); + const length = direction.length(); + + const cylinder = new THREE.CylinderGeometry( tubeRadius, tubeRadius, length, 12 ); + cylinder.translate( 0, length / 2, 0 ); + + const tube = new THREE.Mesh( cylinder, material ); + tube.position.copy( a ); + tube.quaternion.setFromUnitVectors( new THREE.Vector3( 0, 1, 0 ), direction.normalize() ); + tube.castShadow = true; + return tube; +} diff --git a/src/lib/stage.js b/src/lib/stage.js new file mode 100644 index 0000000..9379745 --- /dev/null +++ b/src/lib/stage.js @@ -0,0 +1,88 @@ +import * as THREE from 'three'; + +import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; + +import './chrome.js'; +import { sceneColors } from './theme.js'; +import { bindWorld } from './transit.js'; + +// Shared scene setup for the exploration pages: the landing page gradient shows +// through a transparent canvas, a side light throws a light orange shadow onto +// an invisible wall, and every shape lives in a `world` group that flies in and +// out on page transitions. Returns hooks instead of globals so pages stay small. +export function createStage( { target = [ 0, 0, 0 ] } = {} ) { + const colors = sceneColors(); + + const scene = new THREE.Scene(); + + const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 500 ); + camera.position.set( 10, 4, 12 ); + + const renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); + renderer.setPixelRatio( Math.min( window.devicePixelRatio, 2 ) ); + renderer.setSize( window.innerWidth, window.innerHeight ); + renderer.shadowMap.enabled = true; + renderer.shadowMap.type = THREE.PCFSoftShadowMap; + renderer.toneMapping = THREE.ACESFilmicToneMapping; + renderer.toneMappingExposure = 1; + document.body.appendChild( renderer.domElement ); + + window.addEventListener( 'resize', () => { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize( window.innerWidth, window.innerHeight ); + } ); + + const controls = new OrbitControls( camera, renderer.domElement ); + controls.target.set( ...target ); + + // dark mode gets a soft warm ambient so unlit faces keep their colour + if ( colors.dark ) scene.add( new THREE.AmbientLight( colors.light, 0.9 ) ); + + // legacy lighting was removed in three r155: intensities need the old value times pi + const spotLight = new THREE.DirectionalLight( colors.light, 1.5 * Math.PI ); + spotLight.position.set( 10, 0, 0 ); + spotLight.castShadow = true; + spotLight.shadow.mapSize.width = 2048; + spotLight.shadow.mapSize.height = 2048; + spotLight.shadow.camera.far = 21; + spotLight.shadow.camera.left = -10; + spotLight.shadow.camera.right = 10; + spotLight.shadow.camera.top = 10; + spotLight.shadow.camera.bottom = -10; + scene.add( spotLight ); + + // the wall itself is invisible: only the shadow "projection" shows, in + // light orange, floating on the gradient; front side only so the shapes + // stay fully visible when orbiting behind it + const planeGeometry = new THREE.PlaneGeometry( 20, 20, 10, 10 ); + const planeMaterial = new THREE.ShadowMaterial( { color: colors.shadow, opacity: 0.9 } ); + const plane = new THREE.Mesh( planeGeometry, planeMaterial ); + plane.rotation.y = Math.PI / 2; + plane.position.x = -10; + plane.receiveShadow = true; + scene.add( plane ); + + + // pages add their shapes to this group; transitions scale it in and out + const world = new THREE.Group(); + scene.add( world ); + const updateWorld = bindWorld( world ); + + const updates = []; + + function animate() { + requestAnimationFrame( animate ); + + const time = performance.now() / 1000; + for ( const update of updates ) update( time ); + + updateWorld(); + controls.update(); + renderer.render( scene, camera ); + } + + animate(); + + return { scene: world, camera, renderer, controls, colors, onUpdate: ( fn ) => updates.push( fn ) }; +} diff --git a/src/lib/theme.js b/src/lib/theme.js new file mode 100644 index 0000000..33d5634 --- /dev/null +++ b/src/lib/theme.js @@ -0,0 +1,34 @@ +const KEY = 'thrive-theme'; + +export function currentTheme() { + try { + return localStorage.getItem( KEY ) === 'light' ? 'light' : 'dark'; + } catch { + return 'dark'; + } +} + +export function toggleTheme() { + try { + localStorage.setItem( KEY, currentTheme() === 'dark' ? 'light' : 'dark' ); + } catch { + // private mode: theme just won't persist + } +} + +// the landing page palette, used 1:1 in the scenes; the background itself is the +// landing CSS gradient showing through a transparent canvas (see styles.scss) +const fills = { + sphere: 0xf44f04, // orange + fire: 0xf44f04, // orange + earth: 0x2a1204, // deep brown + air: 0xffd4b3, // pale tint + water: 0xff9a5c, // light orange + aether: 0xf5e9de, // cream +}; + +export function sceneColors() { + return currentTheme() === 'dark' + ? { dark: true, light: 0xffb37a, line: 0xf5e9de, shadow: 0xff9a5c, fills } + : { dark: false, light: 0xffb37a, line: 0x1b0a02, shadow: 0xf44f04, fills }; +} diff --git a/src/lib/transit.js b/src/lib/transit.js new file mode 100644 index 0000000..ac8118a --- /dev/null +++ b/src/lib/transit.js @@ -0,0 +1,31 @@ +// Shape transitions between pages, styled as one continuous forward flight: +// entering shapes grow inward from the distance into place, leaving shapes keep +// growing outward past the camera. The world keeps casting shadows while it +// scales, so the projection on the wall travels with it. +export const EXIT_MS = 600; +const ENTER_MS = 900; + +const easeOutCubic = ( t ) => 1 - Math.pow( 1 - t, 3 ); +const easeInCubic = ( t ) => t * t * t; + +// wraps a THREE.Group holding all of a page's shapes; call the returned +// function every frame +export function bindWorld( world ) { + let mode = 'enter'; + let start = performance.now(); + + window.addEventListener( 'thrive:exit', () => { + mode = 'exit'; + start = performance.now(); + } ); + + return function update() { + if ( mode === 'enter' ) { + const k = Math.min( 1, ( performance.now() - start ) / ENTER_MS ); + world.scale.setScalar( Math.max( 0.001, easeOutCubic( k ) ) ); + } else { + const k = Math.min( 1, ( performance.now() - start ) / EXIT_MS ); + world.scale.setScalar( 1 + easeInCubic( k ) * 7 ); + } + }; +} diff --git a/src/matrix.html b/src/matrix.html new file mode 100644 index 0000000..3db2da3 --- /dev/null +++ b/src/matrix.html @@ -0,0 +1,17 @@ + + + + + Vector Equilibrium + + + + +
+ + + + diff --git a/src/matrix.js b/src/matrix.js new file mode 100644 index 0000000..b052b20 --- /dev/null +++ b/src/matrix.js @@ -0,0 +1,119 @@ +import * as THREE from 'three'; + +import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; +import { ConvexGeometry } from 'three/addons/geometries/ConvexGeometry.js'; + +import { createStage } from './lib/stage.js'; +import { makeTube } from './lib/edgeTubes.js'; + +// The vector equilibrium (cuboctahedron): the only form where every vertex is +// exactly as far from the centre as from its neighbours - Fuller's "zero point" +// of the isotropic vector matrix. Its 12 vertices plus centre are the 13 circles +// of Metatron's Cube, and 12 spheres kiss one central sphere on those points. +const { scene, colors, onUpdate } = createStage(); + +const params = { + scale: 2, + edges: true, + spokes: true, + fill: true, + spheres: false, + spin: false, +}; + +const group = new THREE.Group(); +scene.add( group ); + +let parts = []; + +function renderMatrix() { + for ( const part of parts ) group.remove( part ); + parts = []; + + const a = params.scale; + + // all permutations of (+-a, +-a, 0): the 12 cuboctahedron vertices + const vertices = []; + for ( const s1 of [ -1, 1 ] ) { + for ( const s2 of [ -1, 1 ] ) { + vertices.push( new THREE.Vector3( s1 * a, s2 * a, 0 ) ); + vertices.push( new THREE.Vector3( s1 * a, 0, s2 * a ) ); + vertices.push( new THREE.Vector3( 0, s1 * a, s2 * a ) ); + } + } + + const edgeLength = a * Math.SQRT2; // equals the distance from centre to vertex + const edgeMaterial = new THREE.MeshBasicMaterial( { color: colors.line } ); + const spokeMaterial = new THREE.MeshBasicMaterial( { color: colors.line, opacity: 0.35, transparent: true } ); + + const edges = new THREE.Group(); + for ( let i = 0; i < vertices.length; i++ ) { + for ( let j = i + 1; j < vertices.length; j++ ) { + if ( Math.abs( vertices[ i ].distanceTo( vertices[ j ] ) - edgeLength ) < 1e-6 ) { + edges.add( makeTube( vertices[ i ], vertices[ j ], edgeMaterial ) ); + } + } + } + edges.visible = params.edges; + group.add( edges ); + parts.push( edges ); + + // the 12 radial spokes are as long as the edges - that's the equilibrium + const spokes = new THREE.Group(); + const centre = new THREE.Vector3( 0, 0, 0 ); + for ( const vertex of vertices ) { + spokes.add( makeTube( centre, vertex, spokeMaterial, 0.02 ) ); + } + spokes.visible = params.spokes; + group.add( spokes ); + parts.push( spokes ); + + const fillMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.fire, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true, + } ); + // the fill casts no shadow: only the edges and spokes project, as outlines + const fill = new THREE.Mesh( new ConvexGeometry( vertices ), fillMaterial ); + fill.visible = params.fill; + group.add( fill ); + parts.push( fill ); + + // 12 spheres of radius edge/2 kiss each other on the edges and all kiss the + // 13th sphere in the centre: closest packing of equal spheres + const sphereRadius = edgeLength / 2; + const sphereMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.water, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true, + } ); + const spheres = new THREE.Group(); + const sphereGeometry = new THREE.SphereGeometry( sphereRadius, 48, 48 ); + for ( const point of [ centre, ...vertices ] ) { + const sphere = new THREE.Mesh( sphereGeometry, sphereMaterial ); + sphere.position.copy( point ); + sphere.castShadow = true; + spheres.add( sphere ); + } + spheres.visible = params.spheres; + group.add( spheres ); + parts.push( spheres ); +} + +renderMatrix(); + +onUpdate( ( time ) => { + if ( params.spin ) group.rotation.y = time * 0.15; +} ); + +const gui = new GUI(); +gui.add( params, 'scale', 1, 4 ).step( 0.1 ).onChange( renderMatrix ); +gui.add( params, 'edges' ).onChange( ( value ) => { parts[ 0 ].visible = value; } ); +gui.add( params, 'spokes' ).onChange( ( value ) => { parts[ 1 ].visible = value; } ); +gui.add( params, 'fill' ).onChange( ( value ) => { parts[ 2 ].visible = value; } ); +gui.add( params, 'spheres' ).onChange( ( value ) => { parts[ 3 ].visible = value; } ); +gui.add( params, 'spin' ); diff --git a/src/metatron.html b/src/metatron.html new file mode 100644 index 0000000..f79e30b --- /dev/null +++ b/src/metatron.html @@ -0,0 +1,17 @@ + + + + + Metatron's Cube + + + + +
+ + + + diff --git a/src/metatron.js b/src/metatron.js new file mode 100644 index 0000000..855d02d --- /dev/null +++ b/src/metatron.js @@ -0,0 +1,725 @@ + +import * as THREE from 'three'; + +import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; +import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; + + +import './lib/chrome.js'; +import { sceneColors } from './lib/theme.js'; +import { bindWorld } from './lib/transit.js'; + +const colors = sceneColors(); +// the per-solid near-black line colours only read on the light background; +// dark mode swaps them all for the shared light line colour +const lineColor = ( light ) => colors.dark ? colors.line : light; + +// the landing gradient shows through a transparent canvas; all shapes live in +// `world`, which page transitions fly in and out +const scene = new THREE.Scene(); +const world = new THREE.Group(); +scene.add( world ); +const updateWorld = bindWorld( world ); + +const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 500 ); +camera.position.z = 12; +camera.position.x = 10; +camera.position.y = 4; + +// debug switches to bisect driver issues: ?noaa disables MSAA, ?noshadow disables shadow maps +const debugFlags = new URLSearchParams( window.location.search ); + +const renderer = new THREE.WebGLRenderer( { antialias: !debugFlags.has( 'noaa' ), alpha: true } ); +renderer.setPixelRatio( Math.min( window.devicePixelRatio, 2 ) ); +renderer.setSize( window.innerWidth, window.innerHeight ); +renderer.shadowMap.enabled = !debugFlags.has( 'noshadow' ); +renderer.shadowMap.type = THREE.PCFSoftShadowMap; +renderer.toneMapping = THREE.ACESFilmicToneMapping; +renderer.toneMappingExposure = 1; +document.body.appendChild( renderer.domElement ); + +window.addEventListener( 'resize', () => { + camera.aspect = window.innerWidth / window.innerHeight; + camera.updateProjectionMatrix(); + renderer.setSize( window.innerWidth, window.innerHeight ); +} ); + +const controls = new OrbitControls( camera, renderer.domElement ); +controls.target.set( -4, 0, 0 ); + + +// const geometry_torus = new THREE.TorusGeometry( 2.5, 2.5, 32, 128 ); +// const material_torus = new THREE.MeshBasicMaterial( { color: 0x049ef4, wireframe: true, wireframeLinewidth: 1} ); +// const torus = new THREE.Mesh( geometry_torus, material_torus ); +// torus.rotation.x = Math.PI / 2; +// torus.castShadow = true; +// world.add( torus ); + +// const icoGeometry = new THREE.IcosahedronGeometry( 5 ); +// const icoMaterial= new THREE.MeshBasicMaterial( {color: 0x049ef4, wireframe: true, wireframeLinewidth: 8 } ); +// const iso = new THREE.Mesh( icoGeometry, icoMaterial ); +// iso.castShadow = true; +// world.add( iso ); + +// --------- Mekaraba ---------- // +// const tetraGeometry = new THREE.TetrahedronGeometry( 2 ); +// const tetraMaterial = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); +// const tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); +// // tetra.position.y = - 0.81 + +// // tetra.rotation.x = Math.PI / 4 ; +// tetra.rotation.z = Math.PI / 6 ; +// // world.add( tetra ); + +// const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); +// const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); +// // tetraEdgesLine.position.y = -0.81 + +// tetraEdgesLine.rotation.x = Math.PI / 4; +// // tetraEdgesLine.rotation.y = Math.PI ; +// // tetraEdgesLine.rotation.y = Math.PI / 6; + +// tetraEdgesLine.castShadow = true; +// world.add( tetraEdgesLine ); + +// const tetraGeometry2 = new THREE.TetrahedronGeometry( 2 ); +// const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); +// const tetra2 = new THREE.Mesh( tetraGeometry2, tetraMaterial2 ); +// tetra2.position.y = 0.81 +// tetra2.rotation.x = Math.PI / 4 ; +// // tetra2.rotation.y = Math.PI / 4 ; +// tetra2.rotation.z = Math.PI / 4 ; +// // world.add( tetra2 ); + +// const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); +// const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); +// tetraEdgesLine2.castShadow = true; +// tetraEdgesLine2.position.y = 0.81 +// tetraEdgesLine2.rotation.x = Math.PI / 4 ; +// // tetraEdgesLine2.rotation.y = Math.PI / 4 ; +// tetraEdgesLine2.rotation.z = Math.PI / 4 ; +// world.add( tetraEdgesLine2 ); + + +// ---------- David ------------ // +// const tetraGeometry = new THREE.ConeGeometry( 2, 3, 3 ); +// const tetraMaterial = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); +// const tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); +// tetra.rotation.y = Math.PI / 6 ; +// tetra.position.y = 1 / 2 +// world.add( tetra ); + +// const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); +// const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); +// tetraEdgesLine.rotation.y = Math.PI / 6 ; +// tetraEdgesLine.position.y = 1 / 2 +// tetraEdgesLine.castShadow = true; +// world.add( tetraEdgesLine ); + +// const tetraGeometry2 = new THREE.ConeGeometry( 2, 3, 3 ); +// const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); +// const tetra2 = new THREE.Mesh( tetraGeometry2, tetraMaterial2 ); +// tetra2.rotation.y = Math.PI + Math.PI / 6 ; +// tetra2.rotation.z = Math.PI; +// tetra2.position.y = - 1 / 2 +// world.add( tetra2 ); + +// const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); +// const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); +// tetraEdgesLine2.castShadow = true; +// tetraEdgesLine2.rotation.y = Math.PI + Math.PI / 6 ; +// tetraEdgesLine2.rotation.z = Math.PI; +// tetraEdgesLine2.position.y = - 1 / 2 +// world.add( tetraEdgesLine2 ); + +// ---------- Flower of life ------------ // + + +let rotatePoint2D = (cx, cy, angle, px, py) => { + angle = - angle * (Math.PI / 180) + let s = Math.sin(angle); + let c = Math.cos(angle); + + // translate point back to origin: + px -= cx; + py -= cy; + + // rotatePoint3D point + let xnew = px * c + py * s; + let ynew = px * s - py * c; + + // translate point back: + px = xnew + cx; + py = ynew + cy; + return [px, py]; +} + +function rotatePoint3D(px, py, pz, pitch, roll, yaw) { + pitch = - pitch * (Math.PI / 180) + roll = - roll * (Math.PI / 180) + yaw = - yaw * (Math.PI / 180) + + var cosa = Math.cos(yaw); + var sina = Math.sin(yaw); + + var cosb = Math.cos(pitch); + var sinb = Math.sin(pitch); + + var cosc = Math.cos(roll); + var sinc = Math.sin(roll); + + var Axx = cosa*cosb; + var Axy = cosa*sinb*sinc - sina*cosc; + var Axz = cosa*sinb*cosc + sina*sinc; + + var Ayx = sina*cosb; + var Ayy = sina*sinb*sinc + cosa*cosc; + var Ayz = sina*sinb*cosc - cosa*sinc; + + var Azx = -sinb; + var Azy = cosb*sinc; + var Azz = cosb*cosc; + + let x = Axx*px + Axy*py + Axz*pz; + let y = Ayx*px + Ayy*py + Ayz*pz; + let z = Azx*px + Azy*py + Azz*pz; + + return [x, y, z] +} + +// WebGL draws lines at 1px regardless of linewidth, so the shape edges are built +// from real cylinder tubes instead - same 0.03 thickness as the circle tori +function makeEdgeTubes( geometry, color, tubeRadius = 0.03 ) { + const edges = new THREE.EdgesGeometry( geometry ); + const positions = edges.attributes.position; + const group = new THREE.Group(); + const material = new THREE.MeshBasicMaterial( { color } ); + const up = new THREE.Vector3( 0, 1, 0 ); + const start = new THREE.Vector3(); + const end = new THREE.Vector3(); + + for ( let i = 0; i < positions.count; i += 2 ) { + start.fromBufferAttribute( positions, i ); + end.fromBufferAttribute( positions, i + 1 ); + const direction = new THREE.Vector3().subVectors( end, start ); + const length = direction.length(); + + const cylinder = new THREE.CylinderGeometry( tubeRadius, tubeRadius, length, 12 ); + cylinder.translate( 0, length / 2, 0 ); + + const tube = new THREE.Mesh( cylinder, material ); + tube.position.copy( start ); + tube.quaternion.setFromUnitVectors( up, direction.normalize() ); + tube.castShadow = true; + group.add( tube ); + } + + return group; +} + +const params = { + xangle: 45, + yangle: 0, + zangle: 54.72972973, + radius: 1, + tube: 0.015, +}; + +// const params = { +// xangle: 0, +// yangle: 0, +// zangle: 0, +// size: 5, +// radius: 1 +// }; + +let sphere, circleCircum, cube, cubeLines; +let spheres = []; +let spheresLines = []; +let gui; +let solids = []; + +let renderFlower = (radius = 1) => { + spheres = []; + spheresLines = []; + + // tear down the previous render's shapes and GUI so re-rendering never stacks duplicates + if ( gui ) gui.destroy(); + for ( let obj of solids ) world.remove( obj ); + solids = []; + + // 3D fruit of life: a circle on the centre, on every cube corner and on + // every cube edge midpoint (the inner ring of the 2D pattern) + const d = 4 * 0.612 * radius; + const points = [ [ 0, 0, 0 ] ]; + + for ( let sx of [ -1, 1 ] ) { + for ( let sy of [ -1, 1 ] ) { + for ( let sz of [ -1, 1 ] ) { + points.push( [ sx * d, sy * d, sz * d ] ); + } + } + } + + // only the edge midpoints whose coordinates share a sign: the other six sit on + // the projection equator and would add circles between the two rings + for ( let s of [ -1, 1 ] ) { + points.push( [ s * d, s * d, 0 ] ); + points.push( [ s * d, 0, s * d ] ); + points.push( [ 0, s * d, s * d ] ); + } + + const addCircleAt = ( x, y, z, parent ) => { + let xtemp, ytemp, ztemp; + + [xtemp, ytemp, ztemp] = rotatePoint3D(x, y, z, params['yangle'], params['xangle'], params['zangle']) + + let sphereGeometry = new THREE.SphereGeometry( radius, 64, 64 ); + let sphereMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.sphere, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true + } ); + sphere = new THREE.Mesh( sphereGeometry, sphereMaterial ); + sphere.position.x = xtemp; + sphere.position.y = ytemp; + sphere.position.z = ztemp; + parent.add( sphere ); + + let circleGeometry = new THREE.TorusGeometry( radius, params['tube'], 64, 64 ); + let circleMaterial = new THREE.MeshBasicMaterial( { + color: colors.line, + opacity: 0.1, + transparent: true + } ); + let ring = new THREE.Mesh( circleGeometry, circleMaterial ); + ring.castShadow = true; + ring.rotation.y = Math.PI / 2; + ring.position.x = xtemp; + ring.position.y = ytemp; + ring.position.z = ztemp; + parent.add( ring ); + + circleGeometry = new THREE.TorusGeometry( 0.01, 0.01, 64, 64 ); + circleMaterial = new THREE.MeshBasicMaterial( { + color: colors.line, + opacity: 0.1, + transparent: true + } ); + circleCircum = new THREE.Mesh( circleGeometry, circleMaterial ); + circleCircum.castShadow = true; + circleCircum.rotation.y = Math.PI / 2; + circleCircum.position.x = xtemp; + circleCircum.position.y = ytemp; + circleCircum.position.z = ztemp; + parent.add( circleCircum ); + + sphere.start_x = x; + sphere.start_y = y; + sphere.start_z = z; + ring.start_x = x; + ring.start_y = y; + ring.start_z = z; + circleCircum.start_x = x; + circleCircum.start_y = y; + circleCircum.start_z = z; + + spheres.push(sphere) + spheresLines.push(ring) + spheresLines.push(circleCircum) + }; + + for ( let point of points ) { + addCircleAt( ...point, world ); + } + + // the remaining cube circles: the six equatorial edge midpoints and the six + // face centres, hidden behind the "allCubeCircles" toggle + const extraCircles = new THREE.Group(); + extraCircles.visible = false; + + for ( let s of [ -1, 1 ] ) { + for ( let extraPoint of [ + [ s * d, -s * d, 0 ], [ s * d, 0, -s * d ], [ 0, s * d, -s * d ], + [ s * d, 0, 0 ], [ 0, s * d, 0 ], [ 0, 0, s * d ], + ] ) { + addCircleAt( ...extraPoint, extraCircles ); + } + } + + world.add( extraCircles ); + + // Metatron's web: every circle centre connected to every other one + let web = new THREE.Group(); + const webMaterial = new THREE.MeshBasicMaterial( { color: colors.line, opacity: 0.5, transparent: true } ); + const webUp = new THREE.Vector3( 0, 1, 0 ); + + for ( let i = 0; i < points.length; i++ ) { + for ( let j = i + 1; j < points.length; j++ ) { + const [ ax, ay, az ] = rotatePoint3D( ...points[ i ], params[ 'yangle' ], params[ 'xangle' ], params[ 'zangle' ] ); + const [ bx, by, bz ] = rotatePoint3D( ...points[ j ], params[ 'yangle' ], params[ 'xangle' ], params[ 'zangle' ] ); + const a = new THREE.Vector3( ax, ay, az ); + const b = new THREE.Vector3( bx, by, bz ); + const direction = new THREE.Vector3().subVectors( b, a ); + const length = direction.length(); + + const webTube = params['tube'] * 0.4; + const cylinder = new THREE.CylinderGeometry( webTube, webTube, length, 6 ); + cylinder.translate( 0, length / 2, 0 ); + + const strand = new THREE.Mesh( cylinder, webMaterial ); + strand.position.copy( a ); + strand.quaternion.setFromUnitVectors( webUp, direction.clone().normalize() ); + web.add( strand ); + } + } + + web.visible = false; + world.add( web ); + + // the exact rotation the circle grid uses, as a matrix - solids aligned with + // this coincide with the dots instead of approximating them with tuned angles + const gridRotation = new THREE.Matrix4().makeBasis( + new THREE.Vector3( ...rotatePoint3D( 1, 0, 0, params['yangle'], params['xangle'], params['zangle'] ) ), + new THREE.Vector3( ...rotatePoint3D( 0, 1, 0, params['yangle'], params['xangle'], params['zangle'] ) ), + new THREE.Vector3( ...rotatePoint3D( 0, 0, 1, params['yangle'], params['xangle'], params['zangle'] ) ) + ); + + + // earth - width 2d puts every corner exactly on a corner dot + const boxGeometry = new THREE.BoxGeometry( 2 * d, 2 * d, 2 * d ); + const boxMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.earth, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true, + // wireframe: true, + } ); + cube = new THREE.Mesh( boxGeometry, boxMaterial ); + cube.setRotationFromMatrix( gridRotation ); + + cubeLines = makeEdgeTubes( boxGeometry, lineColor( 0x1b0a02 ), params['tube'] ); + cubeLines.setRotationFromMatrix( gridRotation ); + cubeLines.castShadow = true; + + world.add( cubeLines ); + world.add( cube ); + + // fire - radius sqrt(3)d puts every vertex exactly on a corner dot + const tetraGeometry = new THREE.TetrahedronGeometry( Math.sqrt( 3 ) * d ) + const tetraMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.fire, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true + } ); + let tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); + + let tetraLines = makeEdgeTubes( tetraGeometry, lineColor( 0x140101 ), params['tube'] ); + + + + tetraLines.setRotationFromMatrix( gridRotation ); + tetra.setRotationFromMatrix( gridRotation ); + tetraLines.castShadow = true; + + world.add( tetraLines ); + world.add( tetra ); + + // second tetrahedron of the star tetrahedron (Merkaba): the same shape + // rotated a quarter turn so it interlocks with the first + const tetraGeometry2 = new THREE.TetrahedronGeometry( Math.sqrt( 3 ) * d ); + tetraGeometry2.rotateZ( Math.PI / 2 ); + let tetra2 = new THREE.Mesh( tetraGeometry2, tetraMaterial ); + let tetraLines2 = makeEdgeTubes( tetraGeometry2, lineColor( 0x140101 ), params['tube'] ); + + tetra2.rotation.copy( tetra.rotation ); + tetraLines2.rotation.copy( tetraLines.rotation ); + + world.add( tetraLines2 ); + world.add( tetra2 ); + + // radius 2d puts the projected corners exactly on the outer circle centres + const octaGeometry = new THREE.OctahedronGeometry( 2 * d ) + const octaMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.air, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true + } ); + let octa = new THREE.Mesh( octaGeometry, octaMaterial ); + + let octaLines = makeEdgeTubes( octaGeometry, lineColor( 0x0a2528 ), params['tube'] ); + + octaLines.setRotationFromMatrix( gridRotation ); + octa.setRotationFromMatrix( gridRotation ); + octaLines.castShadow = true; + + world.add( octaLines ); + world.add( octa ); + + // radius 1.663d puts the projected corners on the outer circle centres + const icosaGeometry = new THREE.IcosahedronGeometry( 1.663 * d ) + const icosaMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.water, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true + } ); + let icosa = new THREE.Mesh( icosaGeometry, icosaMaterial ); + + let icosaLines = makeEdgeTubes( icosaGeometry, lineColor( 0x000000 ), params['tube'] ); + + // a grid-aligned icosahedron projects its corners 22.2 degrees off the dot + // hexagon, so it gets an extra twist about the view diagonal to meet the dots + const PHI = ( 1 + Math.sqrt( 5 ) ) / 2; + const icosaTwist = Math.PI / 6 - Math.atan( ( PHI + 2 ) / ( Math.sqrt( 3 ) * PHI ) ); + const icosaRotation = new THREE.Matrix4().multiplyMatrices( + gridRotation, + new THREE.Matrix4().makeRotationAxis( new THREE.Vector3( 1, 1, 1 ).normalize(), icosaTwist ) + ); + + icosaLines.setRotationFromMatrix( icosaRotation ); + icosa.setRotationFromMatrix( icosaRotation ); + icosaLines.castShadow = true; + + world.add( icosaLines ); + world.add( icosa ); + + // 2.29 * 1.003: tuned against the circle pattern + const dodecaGeometry = new THREE.DodecahedronGeometry( 2.297 * radius ) + const dodecaMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.aether, + metalness: 0.7, + roughness: 0.3, + opacity: 0.8, + transparent: true + } ); + let dodeca = new THREE.Mesh( dodecaGeometry, dodecaMaterial ); + + let dodecaLines = makeEdgeTubes( dodecaGeometry, lineColor( 0x000000 ), params['tube'] ); + + // aether: a dodecahedron vertex sits on the cube diagonal, so the plain grid + // rotation points a vertex straight at the light and shares the cube's frame, + // with a tuned x-angle on top + dodecaLines.setRotationFromMatrix( gridRotation ); + dodeca.setRotationFromMatrix( gridRotation ); + dodecaLines.rotation.x = 52.25 * (Math.PI / 180); + dodeca.rotation.x = 52.25 * (Math.PI / 180); + dodecaLines.castShadow = true; + + world.add( dodecaLines ); + world.add( dodeca ); + + + // Big circle: visible as a solid tube, same thickness as the shape edges + let circleGeometry = new THREE.TorusGeometry( 5 * radius, params['tube'], 64, 64); + let circleMaterial = new THREE.MeshBasicMaterial( { color: colors.line } ); + circleCircum = new THREE.Mesh( circleGeometry, circleMaterial ); + circleCircum.rotation.y = Math.PI / 2; + circleCircum.castShadow = true; + world.add( circleCircum ); + + solids.push( cube, cubeLines, tetra, tetraLines, tetra2, tetraLines2, octa, octaLines, icosa, icosaLines, dodeca, dodecaLines, circleCircum, web, extraCircles ); + + + gui = new GUI(); + + let guiDict = {}; + + let fire = gui.addFolder('Fire'); + guiDict['fire'] = {'folder': fire, 'object': tetra, 'objectLines': tetraLines}; + + let fire2 = gui.addFolder('Fire 2'); + guiDict['fire2'] = {'folder': fire2, 'object': tetra2, 'objectLines': tetraLines2}; + + let air = gui.addFolder('Air'); + guiDict['air'] = {'folder': air, 'object': octa, 'objectLines': octaLines}; + + let earth = gui.addFolder('Earth'); + guiDict['earth'] = {'folder': earth, 'object': cube, 'objectLines': cubeLines}; + + let water = gui.addFolder('Water'); + guiDict['water'] = {'folder': water, 'object': icosa, 'objectLines': icosaLines}; + + let aether = gui.addFolder('Aether') + guiDict['aether'] = {'folder': aether, 'object': dodeca, 'objectLines': dodecaLines}; + + let circles = gui.addFolder('Circles') + guiDict['circles'] = {'folder': circles}; + + circles.add( { web: false }, 'web' ).onChange( ( value ) => { + web.visible = value; + } ); + + circles.add( { allCubeCircles: false }, 'allCubeCircles' ).onChange( ( value ) => { + extraCircles.visible = value; + } ); + + let folderStandard = { + show: true, + fill: true, + frame: true, + scale: 1, + } + + circles.add( folderStandard, 'show', true).onChange((value) => { + if (value) { + for (let sphere of spheres) { + sphere.visible = true; + } + for (let sphereLine of spheresLines) { + sphereLine.visible = true; + } + } else { + for (let sphere of spheres) { + sphere.visible = false; + } + for (let sphereLine of spheresLines) { + sphereLine.visible = false; + } + } + }); + + for (let fld of Object.keys(guiDict)) { + // guiDict[fld]['folder'].close() + if (fld === "circles") { + continue + } + folderStandard.show = true; + + guiDict[fld]['folder'].add( folderStandard, 'scale', 0, 2 ).step(0.001).onChange( (value) => { + guiDict[fld]['object'].scale.x = value + guiDict[fld]['object'].scale.y = value + guiDict[fld]['object'].scale.z = value + guiDict[fld]['objectLines'].scale.x = value + guiDict[fld]['objectLines'].scale.y = value + guiDict[fld]['objectLines'].scale.z = value + }); + + guiDict[fld]['folder'].add( folderStandard, 'show', true).onChange((value) => { + if (value) { + guiDict[fld]['object'].visible = true; + guiDict[fld]['objectLines'].visible = true; + } else { + guiDict[fld]['object'].visible = false; + guiDict[fld]['objectLines'].visible = false; + } + }); + guiDict[fld]['folder'].add( folderStandard, 'fill', true).onChange((value) => { + if (value) { + guiDict[fld]['object'].visible = true; + } else { + guiDict[fld]['object'].visible = false; + } + }); + guiDict[fld]['folder'].add( folderStandard, 'frame', true).onChange((value) => { + if (value) { + guiDict[fld]['objectLines'].visible = true; + } else { + guiDict[fld]['objectLines'].visible = false; + } + }); + } + + gui.add( params, 'radius', 0.5, 1.5).onChange( (value) => { + for (let sphere of spheres) { + world.remove(sphere) + } + for (let sphereLine of spheresLines) { + world.remove(sphereLine) + } + renderFlower (value) + }); + gui.add( params, 'tube', 0.01, 0.1 ).step( 0.005 ).onChange( () => { + for (let sphere of spheres) { + world.remove(sphere) + } + for (let sphereLine of spheresLines) { + world.remove(sphereLine) + } + renderFlower (params['radius']) + }); + + // ?only= hides the other solids, for + // checking a single shape against the reference + const only = debugFlags.get( 'only' ); + if ( only && guiDict[ only ] ) { + for ( let fld of Object.keys( guiDict ) ) { + if ( fld === only || ! guiDict[ fld ][ 'object' ] ) continue; + guiDict[ fld ][ 'object' ].visible = false; + guiDict[ fld ][ 'objectLines' ].visible = false; + } + } + + gui.close(); +} + +renderFlower() + +// dark mode gets a soft warm ambient so unlit faces keep their colour +if ( colors.dark ) scene.add( new THREE.AmbientLight( colors.light, 0.9 ) ); + +// legacy lighting was removed in three r155: intensities need the old value times pi +const spotLight = new THREE.DirectionalLight( colors.light, 1.5 * Math.PI ); +spotLight.position.set( 10, 0, 0 ); +spotLight.castShadow = true; +spotLight.shadow.mapSize.width = 2048; +spotLight.shadow.mapSize.height = 2048; +spotLight.shadow.camera.far = 21; +spotLight.shadow.camera.left = -10; +spotLight.shadow.camera.right = 10; +spotLight.shadow.camera.top = 10; +spotLight.shadow.camera.bottom = -10; + +// spotLight.shadow.camera.fov = 35; +scene.add( spotLight ); + +// the wall itself is invisible: only the shadow "projection" shows, in light +// orange, floating on the gradient +const planeGeometry = new THREE.PlaneGeometry( 20, 20, 10, 10 ); +const planeMaterial = new THREE.ShadowMaterial( { color: colors.shadow, opacity: 0.9 } ) +const plane = new THREE.Mesh( planeGeometry, planeMaterial ); +plane.rotation.y = Math.PI / 2; +plane.position.x = -10 +plane.receiveShadow = true; +scene.add( plane ); + +//Create a helper for the shadow camera (optional) +// const helper = new THREE.CameraHelper( spotLight.shadow.camera ); +// world.add( helper ); + +// const axesHelper = new THREE.AxesHelper( 40 ); +// world.add( axesHelper ); + + +// var axis = new THREE.Vector3(0, 1, 0); + +function animate () { + requestAnimationFrame( animate ); + + const time = performance.now() / 1000; + + // for (let sphere of spheres) { + // sphere.position.x = Math.cos( time ) * sphere.start_x; + // sphere.position.z = - Math.sin( time ) * sphere.start_z; + // } + + // for (let sphereLine of spheresLines) { + // sphereLine.position.x = Math.cos( time ) * sphereLine.start_x; + // sphereLine.position.z = - Math.sin( time ) * sphereLine.start_z; + // } + + updateWorld(); + controls.update(); + + renderer.render( scene, camera ); +}; + +animate(); \ No newline at end of file diff --git a/src/phyllotaxis.html b/src/phyllotaxis.html new file mode 100644 index 0000000..5c2c847 --- /dev/null +++ b/src/phyllotaxis.html @@ -0,0 +1,17 @@ + + + + + Golden Spiral + + + + +
+ + + + diff --git a/src/phyllotaxis.js b/src/phyllotaxis.js new file mode 100644 index 0000000..c1c0c97 --- /dev/null +++ b/src/phyllotaxis.js @@ -0,0 +1,96 @@ +import * as THREE from 'three'; + +import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; + +import { createStage } from './lib/stage.js'; + +// Phyllotaxis: nature places seeds, leaves and florets one golden angle +// (137.5077...) apart. Nudge the angle a tenth of a degree and the pattern +// collapses into spokes - the irrationality of phi is what packs it perfectly. +const { scene, colors, onUpdate } = createStage(); + +const GOLDEN_ANGLE = 180 * ( 3 - Math.sqrt( 5 ) ); // 137.5077... +const MAX_COUNT = 3000; + +const params = { + count: 800, + angle: GOLDEN_ANGLE, + form: 'sunflower', + grow: false, + spin: true, + resetAngle: () => { + params.angle = GOLDEN_ANGLE; + gui.controllersRecursive().forEach( ( c ) => c.updateDisplay() ); + renderPattern(); + }, +}; + +const group = new THREE.Group(); +// stand the disc up facing the light and camera, like the circle pages +group.rotation.y = Math.PI / 2; +scene.add( group ); + +const material = new THREE.MeshStandardMaterial( { metalness: 0.7, roughness: 0.3 } ); +const mesh = new THREE.InstancedMesh( new THREE.SphereGeometry( 1, 16, 16 ), material, MAX_COUNT ); +mesh.castShadow = true; +group.add( mesh ); + +const dummy = new THREE.Object3D(); +const colour = new THREE.Color(); +const inner = new THREE.Color( colors.fills.aether ); +const outer = new THREE.Color( colors.fills.fire ); + +function renderPattern() { + const n = params.count; + const angle = params.angle * ( Math.PI / 180 ); + + for ( let i = 0; i < n; i++ ) { + const theta = i * angle; + const t = i / ( n - 1 ); + + if ( params.form === 'sunflower' ) { + // r ~ sqrt(i) keeps the seed density constant across the disc + const r = 5 * Math.sqrt( t ); + dummy.position.set( r * Math.cos( theta ), r * Math.sin( theta ), 0 ); + dummy.scale.setScalar( 0.11 ); + } else if ( params.form === 'pinecone' ) { + const r = 3.5 * Math.sqrt( t ); + dummy.position.set( r * Math.cos( theta ), r * Math.sin( theta ), 4 * ( 1 - t ) - 2 ); + dummy.scale.setScalar( 0.13 ); + } else { + // fibonacci sphere: even latitude steps + golden angle in longitude + // spreads points almost perfectly uniformly over a sphere + const y = 1 - 2 * t; + const r = Math.sqrt( Math.max( 0, 1 - y * y ) ); + dummy.position.set( 4 * r * Math.cos( theta ), 4 * r * Math.sin( theta ), 4 * y ); + dummy.scale.setScalar( 0.12 ); + } + + dummy.updateMatrix(); + mesh.setMatrixAt( i, dummy.matrix ); + mesh.setColorAt( i, colour.lerpColors( inner, outer, t ) ); + } + + mesh.count = n; + mesh.instanceMatrix.needsUpdate = true; + mesh.instanceColor.needsUpdate = true; +} + +renderPattern(); + +onUpdate( ( time ) => { + if ( params.spin ) group.rotation.x = time * 0.1; + + if ( params.grow ) { + // seeds appear one by one from the centre, the way the plant grows them + mesh.count = Math.min( params.count, Math.floor( ( time % 30 ) * 100 ) + 1 ); + } +} ); + +const gui = new GUI(); +gui.add( params, 'count', 10, MAX_COUNT ).step( 10 ).onChange( renderPattern ); +gui.add( params, 'angle', 130, 145 ).step( 0.001 ).onChange( renderPattern ); +gui.add( params, 'resetAngle' ).name( 'reset to golden angle' ); +gui.add( params, 'form', [ 'sunflower', 'pinecone', 'sphere' ] ).onChange( renderPattern ); +gui.add( params, 'grow' ).onChange( () => { mesh.count = params.count; } ); +gui.add( params, 'spin' ); diff --git a/src/seed.html b/src/seed.html new file mode 100644 index 0000000..789b91f --- /dev/null +++ b/src/seed.html @@ -0,0 +1,17 @@ + + + + + Seed of Life + + + + +
+ + + + diff --git a/src/seed.js b/src/seed.js index 2a77021..e0d9604 100644 --- a/src/seed.js +++ b/src/seed.js @@ -4,12 +4,19 @@ import * as THREE from 'three'; import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; -import Stats from 'three/addons/libs/stats.module.js'; -import './css/styles.scss'; +import './lib/chrome.js'; +import { sceneColors } from './lib/theme.js'; +import { bindWorld } from './lib/transit.js'; +const colors = sceneColors(); + +// the landing gradient shows through a transparent canvas; all shapes live in +// `world`, which page transitions fly in and out const scene = new THREE.Scene(); -scene.background = new THREE.Color(0xf44f04); +const world = new THREE.Group(); +scene.add( world ); +const updateWorld = bindWorld( world ); const camera = new THREE.PerspectiveCamera( 45, window.innerWidth / window.innerHeight, 0.1, 500 ); @@ -18,7 +25,7 @@ camera.position.x = 10; camera.position.y = 4; -const renderer = new THREE.WebGLRenderer( { antialias: true } ); +const renderer = new THREE.WebGLRenderer( { antialias: true, alpha: true } ); renderer.setPixelRatio( Math.min( window.devicePixelRatio, 2 ) ); renderer.setSize( window.innerWidth, window.innerHeight ); renderer.shadowMap.enabled = true; @@ -42,13 +49,13 @@ controls.target.set( -4, 0, 0 ); // const torus = new THREE.Mesh( geometry_torus, material_torus ); // torus.rotation.x = Math.PI / 2; // torus.castShadow = true; -// scene.add( torus ); +// world.add( torus ); // const icoGeometry = new THREE.IcosahedronGeometry( 5 ); // const icoMaterial= new THREE.MeshBasicMaterial( {color: 0x049ef4, wireframe: true, wireframeLinewidth: 8 } ); // const iso = new THREE.Mesh( icoGeometry, icoMaterial ); // iso.castShadow = true; -// scene.add( iso ); +// world.add( iso ); // --------- Mekaraba ---------- // // const tetraGeometry = new THREE.TetrahedronGeometry( 2 ); @@ -58,7 +65,7 @@ controls.target.set( -4, 0, 0 ); // // tetra.rotation.x = Math.PI / 4 ; // tetra.rotation.z = Math.PI / 6 ; -// // scene.add( tetra ); +// // world.add( tetra ); // const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); // const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); @@ -69,7 +76,7 @@ controls.target.set( -4, 0, 0 ); // // tetraEdgesLine.rotation.y = Math.PI / 6; // tetraEdgesLine.castShadow = true; -// scene.add( tetraEdgesLine ); +// world.add( tetraEdgesLine ); // const tetraGeometry2 = new THREE.TetrahedronGeometry( 2 ); // const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); @@ -78,7 +85,7 @@ controls.target.set( -4, 0, 0 ); // tetra2.rotation.x = Math.PI / 4 ; // // tetra2.rotation.y = Math.PI / 4 ; // tetra2.rotation.z = Math.PI / 4 ; -// // scene.add( tetra2 ); +// // world.add( tetra2 ); // const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); // const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); @@ -87,7 +94,7 @@ controls.target.set( -4, 0, 0 ); // tetraEdgesLine2.rotation.x = Math.PI / 4 ; // // tetraEdgesLine2.rotation.y = Math.PI / 4 ; // tetraEdgesLine2.rotation.z = Math.PI / 4 ; -// scene.add( tetraEdgesLine2 ); +// world.add( tetraEdgesLine2 ); // ---------- David ------------ // @@ -96,14 +103,14 @@ controls.target.set( -4, 0, 0 ); // const tetra = new THREE.Mesh( tetraGeometry, tetraMaterial ); // tetra.rotation.y = Math.PI / 6 ; // tetra.position.y = 1 / 2 -// scene.add( tetra ); +// world.add( tetra ); // const tetraEdges = new THREE.EdgesGeometry( tetraGeometry ); // const tetraEdgesLine = new THREE.LineSegments( tetraEdges, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); // tetraEdgesLine.rotation.y = Math.PI / 6 ; // tetraEdgesLine.position.y = 1 / 2 // tetraEdgesLine.castShadow = true; -// scene.add( tetraEdgesLine ); +// world.add( tetraEdgesLine ); // const tetraGeometry2 = new THREE.ConeGeometry( 2, 3, 3 ); // const tetraMaterial2 = new THREE.MeshBasicMaterial( {color: 0xffff00 } ); @@ -111,7 +118,7 @@ controls.target.set( -4, 0, 0 ); // tetra2.rotation.y = Math.PI + Math.PI / 6 ; // tetra2.rotation.z = Math.PI; // tetra2.position.y = - 1 / 2 -// scene.add( tetra2 ); +// world.add( tetra2 ); // const tetraEdges2 = new THREE.EdgesGeometry( tetraGeometry2 ); // const tetraEdgesLine2 = new THREE.LineSegments( tetraEdges2, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 15 } ) ); @@ -119,7 +126,7 @@ controls.target.set( -4, 0, 0 ); // tetraEdgesLine2.rotation.y = Math.PI + Math.PI / 6 ; // tetraEdgesLine2.rotation.z = Math.PI; // tetraEdgesLine2.position.y = - 1 / 2 -// scene.add( tetraEdgesLine2 ); +// world.add( tetraEdgesLine2 ); // ---------- Flower of life ------------ // @@ -127,11 +134,11 @@ controls.target.set( -4, 0, 0 ); // const circleMaterial = new THREE.MeshBasicMaterial( { color: 0x049ef4, side: THREE.DoubleSide } ); // const circle = new THREE.Mesh( circleGeometry, circleMaterial ); // circle.castShadow = true; -// scene.add( circle ); +// world.add( circle ); // const circleLine = new THREE.LineSegments( circleGeometry, new THREE.LineBasicMaterial( { color: 0x000000, linewidth: 3 } ) ); // circleLine.castShadow = true; -// scene.add( circleLine ); +// world.add( circleLine ); let rotatePoint = (cx, cy, angle, px, py) => { angle = - angle * (Math.PI / 180) @@ -229,7 +236,7 @@ let renderFlower = (size = 3, radius = 1) => { sphere.position.x = xtemp2; sphere.position.y = ytemp2; sphere.position.z = ztemp2; - scene.add( sphere ); + world.add( sphere ); let circleGeometry = new THREE.TorusGeometry( radius, 0.02, 64, 64 ); let circleMaterial = new THREE.MeshBasicMaterial( { @@ -243,7 +250,7 @@ let renderFlower = (size = 3, radius = 1) => { circleCircum.position.x = xtemp2; circleCircum.position.y = ytemp2; circleCircum.position.z = ztemp2; - scene.add( circleCircum ); + world.add( circleCircum ); sphere.start_x = x; sphere.start_y = y; @@ -269,7 +276,7 @@ let renderFlower = (size = 3, radius = 1) => { circleCircum = new THREE.Mesh( circleGeometry, circleMaterial ); circleCircum.rotation.y = Math.PI / 2; circleCircum.castShadow = true; - scene.add( circleCircum ); + world.add( circleCircum ); } // renderFlower() @@ -293,8 +300,8 @@ for (let x_angle of Array.from(Array(4), (_, i) => 360 / 4 * i)) { console.log(x_angle, z_angle, x, y, z) let sphereGeometry = new THREE.SphereGeometry( 0.5, 64, 64 ); - let sphereMaterial = new THREE.MeshBasicMaterial( { - color: 0x0063e4, + let sphereMaterial = new THREE.MeshBasicMaterial( { + color: colors.fills.sphere, metalness: 1, roughness: 1, opacity: 0.5, @@ -304,11 +311,11 @@ for (let x_angle of Array.from(Array(4), (_, i) => 360 / 4 * i)) { sphere.position.x = x; sphere.position.y = y; sphere.position.z = z; - scene.add( sphere ); + world.add( sphere ); let circleGeometry = new THREE.TorusGeometry( 0.5, 0.01, 64, 64); - let circleMaterial = new THREE.MeshBasicMaterial( { - color: 0x000000, + let circleMaterial = new THREE.MeshBasicMaterial( { + color: colors.line, opacity: 0.1, transparent: true } ); @@ -318,14 +325,17 @@ for (let x_angle of Array.from(Array(4), (_, i) => 360 / 4 * i)) { circleCircum.position.x = x; circleCircum.position.y = y; circleCircum.position.z = z; - scene.add( circleCircum ); + world.add( circleCircum ); } z_count += 1; } } +// dark mode gets a soft warm ambient so unlit faces keep their colour +if ( colors.dark ) scene.add( new THREE.AmbientLight( colors.light, 0.9 ) ); + // legacy lighting was removed in three r155: intensities need the old value times pi -const spotLight = new THREE.DirectionalLight( 0xeaa7a7, 1.5 * Math.PI ); +const spotLight = new THREE.DirectionalLight( colors.light, 1.5 * Math.PI ); spotLight.position.set( 10, 0, 0 ); spotLight.castShadow = true; spotLight.shadow.mapSize.width = 2048; @@ -339,11 +349,12 @@ spotLight.shadow.camera.bottom = -10; // spotLight.shadow.camera.fov = 35; scene.add( spotLight ); -//Create a plane that receives shadows (but does not cast them) +// the wall itself is invisible: only the shadow "projection" shows, in light +// orange, floating on the gradient; front side only so the shapes stay fully +// visible when orbiting behind it const planeGeometry = new THREE.PlaneGeometry( 20, 20, 10, 10 ); -const planeMaterial = new THREE.MeshStandardMaterial( { color: 0xffffff } ) +const planeMaterial = new THREE.ShadowMaterial( { color: colors.shadow, opacity: 0.9 } ) const plane = new THREE.Mesh( planeGeometry, planeMaterial ); -planeMaterial.side = THREE.DoubleSide; plane.rotation.y = Math.PI / 2; plane.position.x = -10 plane.receiveShadow = true; @@ -351,13 +362,13 @@ scene.add( plane ); //Create a helper for the shadow camera (optional) const helper = new THREE.CameraHelper( spotLight.shadow.camera ); -// scene.add( helper ); +// world.add( helper ); const axesHelper = new THREE.AxesHelper( 40 ); -scene.add( axesHelper ); +// scene.add( axesHelper ); // const light = new THREE.HemisphereLight( 0xffffbb, 0x080820, 0.2 ); -// scene.add( light ); +// world.add( light ); // const gui = new GUI(); @@ -390,28 +401,26 @@ scene.add( axesHelper ); // }); // gui.add( params, 'size', 2, 5).step(1).onChange( (value) => { // for (let sphere of spheres) { -// scene.remove(sphere) +// world.remove(sphere) // } // for (let sphereLine of spheresLines) { -// scene.remove(sphereLine) +// world.remove(sphereLine) // } -// scene.remove(circleCircum) +// world.remove(circleCircum) // renderFlower (value, params['radius']) // }); // gui.add( params, 'radius', 0.5, 3).onChange( (value) => { // for (let sphere of spheres) { -// scene.remove(sphere) +// world.remove(sphere) // } // for (let sphereLine of spheresLines) { -// scene.remove(sphereLine) +// world.remove(sphereLine) // } -// scene.remove(circleCircum) +// world.remove(circleCircum) // renderFlower (params['size'], value) // }); // gui.close(); -let stats = new Stats(); -document.body.appendChild( stats.dom ); // var axis = new THREE.Vector3(0, 1, 0); @@ -430,8 +439,8 @@ function animate () { // sphereLine.position.z = - Math.sin( time ) * sphereLine.start_z; // } + updateWorld(); controls.update(); - stats.update(); renderer.render( scene, camera ); }; diff --git a/src/torus.html b/src/torus.html new file mode 100644 index 0000000..c6cd129 --- /dev/null +++ b/src/torus.html @@ -0,0 +1,17 @@ + + + + + Toroidal Field + + + + +
+ + + + diff --git a/src/torus.js b/src/torus.js new file mode 100644 index 0000000..6732a77 --- /dev/null +++ b/src/torus.js @@ -0,0 +1,109 @@ +import * as THREE from 'three'; + +import { GUI } from 'three/addons/libs/lil-gui.module.min.js'; + +import { createStage } from './lib/stage.js'; + +// The torus: the self-sustaining "energy field" form - field lines spiral around +// the surface, through the centre and back around the outside. +const { scene, colors, onUpdate } = createStage(); + +const params = { + radius: 3, + tube: 1.4, + strands: 12, + windings: 4, + surface: true, + spin: true, +}; + +const group = new THREE.Group(); +// face the camera the same way the circle pages do +group.rotation.y = Math.PI / 2; +scene.add( group ); + +let parts = []; +let particles = []; +let curves = []; + +// point on the torus surface: phi around the main axis, theta around the tube +const torusPoint = ( phi, theta, R, r ) => + new THREE.Vector3( + ( R + r * Math.cos( theta ) ) * Math.cos( phi ), + ( R + r * Math.cos( theta ) ) * Math.sin( phi ), + r * Math.sin( theta ) + ); + +function renderTorus() { + for ( const part of parts ) group.remove( part ); + parts = []; + particles = []; + curves = []; + + const R = params.radius; + const r = params.tube; + + const surfaceGeometry = new THREE.TorusGeometry( R, r, 48, 128 ); + const surfaceMaterial = new THREE.MeshStandardMaterial( { + color: colors.fills.fire, + metalness: 0.7, + roughness: 0.3, + opacity: 0.35, + transparent: true, + } ); + // the surface casts no shadow: only the strands project, as outlines + const surface = new THREE.Mesh( surfaceGeometry, surfaceMaterial ); + surface.visible = params.surface; + group.add( surface ); + parts.push( surface ); + + const lineMaterial = new THREE.MeshBasicMaterial( { color: colors.line, opacity: 0.5, transparent: true } ); + const particleMaterial = new THREE.MeshBasicMaterial( { color: colors.fills.aether } ); + const particleGeometry = new THREE.SphereGeometry( 0.08, 16, 16 ); + + // each field line goes once around the main axis while winding `windings` + // times around the tube, each strand offset around the ring + for ( let s = 0; s < params.strands; s++ ) { + const offset = ( s / params.strands ) * Math.PI * 2; + const samples = []; + + for ( let i = 0; i <= 256; i++ ) { + const t = i / 256; + samples.push( torusPoint( t * Math.PI * 2 + offset, t * Math.PI * 2 * params.windings, R, r ) ); + } + + const curve = new THREE.CatmullRomCurve3( samples, true ); + const strand = new THREE.Mesh( new THREE.TubeGeometry( curve, 384, 0.025, 8, true ), lineMaterial ); + strand.castShadow = true; + group.add( strand ); + parts.push( strand ); + curves.push( curve ); + + const particle = new THREE.Mesh( particleGeometry, particleMaterial ); + particle.userData.phase = s / params.strands; + group.add( particle ); + parts.push( particle ); + particles.push( particle ); + } +} + +renderTorus(); + +onUpdate( ( time ) => { + if ( params.spin ) group.rotation.z = time * 0.1; + + for ( let i = 0; i < particles.length; i++ ) { + const t = ( time * 0.05 + particles[ i ].userData.phase ) % 1; + particles[ i ].position.copy( curves[ i ].getPointAt( t ) ); + } +} ); + +const gui = new GUI(); +gui.add( params, 'radius', 1, 5 ).step( 0.1 ).onChange( renderTorus ); +gui.add( params, 'tube', 0.2, 3 ).step( 0.1 ).onChange( renderTorus ); +gui.add( params, 'strands', 1, 32 ).step( 1 ).onChange( renderTorus ); +gui.add( params, 'windings', 1, 12 ).step( 1 ).onChange( renderTorus ); +gui.add( params, 'surface' ).onChange( ( value ) => { + parts[ 0 ].visible = value; +} ); +gui.add( params, 'spin' ); diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..7ce5dee --- /dev/null +++ b/vite.config.js @@ -0,0 +1,17 @@ +import { resolve } from 'path'; +import { defineConfig } from 'vite'; + +// one html entry per exploration; add new pages here and in src/ +const pages = ['index', 'metatron', 'torus', 'matrix', 'phyllotaxis', 'flower', 'seed']; + +export default defineConfig({ + root: 'src', + base: './', + build: { + outDir: '../build', + emptyOutDir: true, + rollupOptions: { + input: Object.fromEntries(pages.map((page) => [page, resolve(__dirname, `src/${page}.html`)])), + }, + }, +}); diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 81fe6e7..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,55 +0,0 @@ -const path = require('path'); -const HtmlWebpackPlugin = require('html-webpack-plugin'); - -module.exports = (env) => { - return { - mode: env.mode, - devtool: 'inline-source-map', - devServer: { - static: './dist', - hot: true, - }, - module: { - rules: [ - { - test: /\.css$/i, - use: [ - // Creates `style` nodes from JS strings - "style-loader", - // Translates CSS into CommonJS - "css-loader", - ], - }, - { - test: /\.s[ac]ss$/i, - use: [ - // Creates `style` nodes from JS strings - "style-loader", - // Translates CSS into CommonJS - "css-loader", - // Compiles Sass to CSS - "sass-loader", - ], - }, - { - test: /\.(jpe?g|png|gif|svg)$/i, - type: 'asset/resource', - generator: { - filename: 'public/icons/[name][ext]' - } - } - ], - }, - plugins: [ - new HtmlWebpackPlugin({ - title: 'Thrive', - template: 'src/index.html' - }), - ], - output: { - filename: '[name].bundle.js', - path: path.resolve(__dirname, 'build'), - clean: true, - }, - } -}; \ No newline at end of file