diff --git a/.gitattributes b/.gitattributes
index 22a4e4e..43f9d6b 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1 +1,2 @@
-import/img/* filter=lfs diff=lfs merge=lfs -text
+public/img/* filter=lfs diff=lfs merge=lfs -text
+
diff --git a/.gitea/workflows/build.yaml b/.gitea/workflows/build.yaml
new file mode 100644
index 0000000..6226e22
--- /dev/null
+++ b/.gitea/workflows/build.yaml
@@ -0,0 +1,52 @@
+name: Gitea CI-CD Pipeline
+
+on:
+ push:
+ branches: [main, master, dev, dev_*]
+ pull_request:
+ branches: [main, master]
+
+jobs:
+ # --- STAGE 1: TEST ---
+ test:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: '20'
+
+ - name: Install Dependencies
+ run: npm ci
+
+ - name: Run Linter
+ run: npm run lint
+
+ - name: Run Tests
+ run: npm test
+
+ # --- STAGE 2: BUILD & PUBLISH (Only on Main) ---
+ build-and-deploy:
+ needs: test
+ if: gitea.ref == 'refs/heads/main' && gitea.event_name == 'push'
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Code
+ uses: actions/checkout@v4
+
+ # Example: Building a Docker Image and pushing to Gitea's internal registry
+ - name: Login to Gitea Registry
+ uses: docker/login-action@v3
+ with:
+ registry: gitea.starfour.de
+ username: ${{ gitea.actor }}
+ password: ${{ secrets.GITEA_TOKEN }}
+
+ - name: Build and Push
+ uses: docker/build-push-action@v5
+ with:
+ push: true
+ tags: gitea.starfour.de/${{ gitea.repository }}:latest
\ No newline at end of file
diff --git a/astro.config.mjs b/astro.config.mjs
index 7c0d18f..f22628a 100644
--- a/astro.config.mjs
+++ b/astro.config.mjs
@@ -1,3 +1,4 @@
+/* eslint-disable @typescript-eslint/ban-ts-comment */
// @ts-check
import { defineConfig, envField } from 'astro/config';
@@ -11,12 +12,13 @@ export default defineConfig({
include: ['**/react/*']
})],
vite: {
- plugins: [tailwindcss()],
+ //@ts-ignore
+ plugins: [tailwindcss({optimize:false})]
},
env: {
schema: {
- TMDB_API_TOKEN: envField.string({ context: 'client', access: 'public', default: 'https://api.example.com' }),
- SETTINGS_TOKEN: envField.string({ context: 'server', access: 'secret' }),
+ TMDB_API_TOKEN: envField.string({ context: 'server', access: 'secret'}),
+ TMDB_API_KEY: envField.string({context: "server", access: "secret"})
}
}
});
\ No newline at end of file
diff --git a/eslint.config.ts b/eslint.config.ts
new file mode 100644
index 0000000..cc5f6b0
--- /dev/null
+++ b/eslint.config.ts
@@ -0,0 +1,9 @@
+import js from "@eslint/js";
+import globals from "globals";
+import tseslint from "typescript-eslint";
+import { defineConfig } from "eslint/config";
+
+export default defineConfig([
+ { files: ["**/*.{js,mjs,cjs,ts,mts,cts}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } },
+ tseslint.configs.recommended,
+]);
diff --git a/img/Apfelschorle.png b/img/Apfelschorle.png
new file mode 100644
index 0000000..4f8c1c3
--- /dev/null
+++ b/img/Apfelschorle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:725b9e3b03062fffb54ff1ac0cdc1c095a41b000ff241cc2f0ee973b0a0c2342
+size 148003
diff --git a/img/Dolby.png b/img/Dolby.png
new file mode 100644
index 0000000..1ca3142
--- /dev/null
+++ b/img/Dolby.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c90d994267fb989d537fc62656b40a053d37d28406b795780a49369e141ad514
+size 28533
diff --git a/img/Schorle.png b/img/Schorle.png
new file mode 100644
index 0000000..cc97a3a
--- /dev/null
+++ b/img/Schorle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fbac99477fdba6b3cd8e07c303dd4c5887afe830c9c80c84f3609b497959c3d
+size 197467
diff --git a/img/Zoomania-2.jpg b/img/Zoomania-2.jpg
new file mode 100644
index 0000000..9f8a8af
--- /dev/null
+++ b/img/Zoomania-2.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7b45fd4ecb3203cdff2df014f2914742dfdbaf2aaaec19cf3082a9bcf05e69ef
+size 148556
diff --git a/img/applepay.png b/img/applepay.png
new file mode 100644
index 0000000..97de500
--- /dev/null
+++ b/img/applepay.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b5fa79b37917a79508afeffa8d3c1bf05e98b2b737b7f3da0d89082ab38328a6
+size 29772
diff --git a/img/astronautpopcorn.jpg b/img/astronautpopcorn.jpg
new file mode 100644
index 0000000..a188eb1
--- /dev/null
+++ b/img/astronautpopcorn.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7555b82e554a173d39b182015bd2760c32191558b9d6a642b913a77e7c76d1dc
+size 59868
diff --git a/img/bladerunner2049.jpg b/img/bladerunner2049.jpg
new file mode 100644
index 0000000..aabc97c
--- /dev/null
+++ b/img/bladerunner2049.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e1ad7e3bce4f67f711ba48f8e3820dcabdfaa2e1a4781576dbf06d259ee75d40
+size 215708
diff --git a/img/cola-light.png b/img/cola-light.png
new file mode 100644
index 0000000..7077b08
--- /dev/null
+++ b/img/cola-light.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5c772d560d8ed20cc2b21487f9478ba1495b4d45dcf73f2cae077ee97e0f98e9
+size 141511
diff --git a/img/cola-zero.png b/img/cola-zero.png
new file mode 100644
index 0000000..22a5f75
--- /dev/null
+++ b/img/cola-zero.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c2a747d3b5f0b3e03ef8ef63e718887e66cf2fb172db61a3fbe7dc6f0cd08911
+size 63201
diff --git a/img/cola.png b/img/cola.png
new file mode 100644
index 0000000..5b257c2
--- /dev/null
+++ b/img/cola.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0ff1b53049fe646b18205545ea3ce14b233f21300ed2b38162d3cf8fef013b76
+size 63839
diff --git a/img/dbox.jpg b/img/dbox.jpg
new file mode 100644
index 0000000..5cc2245
--- /dev/null
+++ b/img/dbox.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d8e352c062dd1acc7f357ea2d10b9ab3a69855743f96a1192a64eea80fcfd765
+size 27875
diff --git a/img/derAustronaut.jpg b/img/derAustronaut.jpg
new file mode 100644
index 0000000..57870a4
--- /dev/null
+++ b/img/derAustronaut.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9b0cf479920be74bf20ef2b3f611086880f7ea627329cdd7793eec28bdbfdb2c
+size 898835
diff --git a/img/fallguy.jpg b/img/fallguy.jpg
new file mode 100644
index 0000000..b679b9a
--- /dev/null
+++ b/img/fallguy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b578124770872fa1a43b20a7af797c4d93a63c84089306520cfb43672d327732
+size 207773
diff --git a/img/fanta.png b/img/fanta.png
new file mode 100644
index 0000000..dac2c48
--- /dev/null
+++ b/img/fanta.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:82266102664f844ac36ffea5467331402177701d738b6d48de39b30518492306
+size 57908
diff --git a/img/fuze-tea.png b/img/fuze-tea.png
new file mode 100644
index 0000000..667e6ad
--- /dev/null
+++ b/img/fuze-tea.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e8411edd86a3fccd26496cc05f6865c9b13979550c77c2889b2b6b151ebf518
+size 62848
diff --git a/img/gangstergang.jpg b/img/gangstergang.jpg
new file mode 100644
index 0000000..a208bcb
--- /dev/null
+++ b/img/gangstergang.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:98a0f0504e6558bfa3b2c0962488b96a47c1ef2358688c0c34d09fbf3409fa36
+size 371103
diff --git a/img/gangstergang2.png b/img/gangstergang2.png
new file mode 100644
index 0000000..305ac4e
--- /dev/null
+++ b/img/gangstergang2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:22dad2597fa8a7152450a9eb5084cee413e869c7df53aeda69919ba9cb544a9d
+size 123744
diff --git a/img/glennkill.jpg b/img/glennkill.jpg
new file mode 100644
index 0000000..15ee6e5
--- /dev/null
+++ b/img/glennkill.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a7accbaa48e45b2e99562bc267b2950227a598b3ff65027347eb60fccd579152
+size 174298
diff --git a/img/goat.jpg b/img/goat.jpg
new file mode 100644
index 0000000..d2451ea
--- /dev/null
+++ b/img/goat.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:592871da4a67ac08515acb975ec94f31218e2b6e957416bddcd508b0d82d4e6f
+size 238519
diff --git a/img/googlepay.png b/img/googlepay.png
new file mode 100644
index 0000000..3983d67
--- /dev/null
+++ b/img/googlepay.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:19037916e535f156a49344102358647fd2af08a7af596a4b67b218c4c7ded5bf
+size 18306
diff --git a/img/haribo.png b/img/haribo.png
new file mode 100644
index 0000000..3842a26
--- /dev/null
+++ b/img/haribo.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f5b9102ff6ec16bbc345776a9e303d2d9f10207c9d0bce54605737912cc2f3b8
+size 207234
diff --git a/img/homefront.jpg b/img/homefront.jpg
new file mode 100644
index 0000000..0ba2da7
--- /dev/null
+++ b/img/homefront.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c7a63a1b8d766b6d68aa3cfc024a079fd5727ff560b27d7f62ba6c78f5b83328
+size 94555
diff --git a/img/hoppers.jpg b/img/hoppers.jpg
new file mode 100644
index 0000000..d7d4070
--- /dev/null
+++ b/img/hoppers.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a53aa0c3f610618d0f2b5de0516d7256cefd604f137be33a423b1401bf89d029
+size 205633
diff --git a/img/hopperskidsmenu.jpg b/img/hopperskidsmenu.jpg
new file mode 100644
index 0000000..6440a87
--- /dev/null
+++ b/img/hopperskidsmenu.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b3210725cfecddf43b7a26b859772700c87521d8ccd1cd6c4a2c5211b7408e4c
+size 72246
diff --git a/img/hopperspopcornmetall.jpg b/img/hopperspopcornmetall.jpg
new file mode 100644
index 0000000..9c5432e
--- /dev/null
+++ b/img/hopperspopcornmetall.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9d783f8fa19be7b41c2d0b782858cb312438546b09598128955585e76b010a6e
+size 92142
diff --git a/img/hopperspopcornwood.png b/img/hopperspopcornwood.png
new file mode 100644
index 0000000..08e7b47
--- /dev/null
+++ b/img/hopperspopcornwood.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a353ad8cc51f803f21ebaf9dc0e1654ee6457e1c918be21e985fc85d515c5a1e
+size 100114
diff --git a/img/klarna.png b/img/klarna.png
new file mode 100644
index 0000000..67c05bb
--- /dev/null
+++ b/img/klarna.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d991d083415fa48f5047ef6273c431085f3d352216bc30e51d28f06860a57fb6
+size 28781
diff --git a/img/käsedip.png b/img/käsedip.png
new file mode 100644
index 0000000..355c74f
--- /dev/null
+++ b/img/käsedip.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7bf46eaa63f4218da6f013b5df6a509fedcea2e925bb36810d60d8ea15dbce1c
+size 112848
diff --git a/img/mandalorian.jpeg b/img/mandalorian.jpeg
new file mode 100644
index 0000000..b6750e7
--- /dev/null
+++ b/img/mandalorian.jpeg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d574713f4278a0d05a9967a61aed8e62bbd5ec211eaa047b15a3ec5b64c09bf4
+size 2291485
diff --git a/img/mariogalaxy.jpg b/img/mariogalaxy.jpg
new file mode 100644
index 0000000..410d5e0
--- /dev/null
+++ b/img/mariogalaxy.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5b0f0b1c5b908db28fcb4dc05cbbe40b76fe45bbb04feee451c6e2323a013aef
+size 1584165
diff --git a/img/mariokidsmenu.png b/img/mariokidsmenu.png
new file mode 100644
index 0000000..198fcf0
--- /dev/null
+++ b/img/mariokidsmenu.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9181370a51a47d6d8d9e4ca763f710c885a238295fdf6508d71d4b537f65509e
+size 314772
diff --git a/img/marioyoshipopcorn.png b/img/marioyoshipopcorn.png
new file mode 100644
index 0000000..99e706f
--- /dev/null
+++ b/img/marioyoshipopcorn.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4b4bc793b8eb7111ebe50e58f2698573284c8ce995c4dfa3dffccb82473caf2c
+size 100133
diff --git a/img/mastercard.png b/img/mastercard.png
new file mode 100644
index 0000000..d2491c9
--- /dev/null
+++ b/img/mastercard.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1afe730bd247098d2ee4ee18108356ba8010d015860420049b2dbe20a319aec
+size 189351
diff --git a/img/masteruniverse.jpg b/img/masteruniverse.jpg
new file mode 100644
index 0000000..2b2aa9e
--- /dev/null
+++ b/img/masteruniverse.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7eded20169a977e2b86df13022de7e2cef9b2b34e28e85ef0b4c0bf0403dd645
+size 931547
diff --git a/img/meg.JPG b/img/meg.JPG
new file mode 100644
index 0000000..0e13e50
--- /dev/null
+++ b/img/meg.JPG
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:26c89eb7c801856ccbaa6edbc5acf0b4c438083ab410e3a056090a112fec72c3
+size 600518
diff --git a/img/meg2.jpg b/img/meg2.jpg
new file mode 100644
index 0000000..7d7a45d
--- /dev/null
+++ b/img/meg2.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9ce2f0444962877d038b7482d8da80ffb582943eb62341d43da3e67160d29faa
+size 1423081
diff --git a/img/menu-big.png b/img/menu-big.png
new file mode 100644
index 0000000..896eee5
--- /dev/null
+++ b/img/menu-big.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:56fc6dff0edfd10824926e83994aa10b347c325f37e529410c1d2e33a516e429
+size 98152
diff --git a/img/minionsmonsters.jpg b/img/minionsmonsters.jpg
new file mode 100644
index 0000000..d738f6e
--- /dev/null
+++ b/img/minionsmonsters.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a5c4a31d222d49372cfc9c3749e7dca9164e836dd9f53404c7ab7ee3e44aa27
+size 158162
diff --git a/img/mms.png b/img/mms.png
new file mode 100644
index 0000000..000c9c5
--- /dev/null
+++ b/img/mms.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ea1af40bc25d5bfea9ce7fb57ba296aa4166804ffd166216f277692e04d89b1d
+size 157457
diff --git a/img/monsterag.png b/img/monsterag.png
new file mode 100644
index 0000000..2f61cd0
--- /dev/null
+++ b/img/monsterag.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c21e06fd6cb6a7c7cd8158804e7dd7b43378d85655f4f1cd2833a20d365ef59f
+size 3159069
diff --git a/img/monsteruni.jpg b/img/monsteruni.jpg
new file mode 100644
index 0000000..2306bbd
--- /dev/null
+++ b/img/monsteruni.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ad6ecca5dec7e05ea95ea39ac5a9f70bf243507415698c379670ea599b209c48
+size 131398
diff --git a/img/mutiny.jpg b/img/mutiny.jpg
new file mode 100644
index 0000000..3c909a5
--- /dev/null
+++ b/img/mutiny.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cb6b6275f047f6d8018b4a934e8a136b48f9ad383d7a3b06b785f62c4cbd8125
+size 1049186
diff --git a/img/nachokombiklein.png b/img/nachokombiklein.png
new file mode 100644
index 0000000..b16d41c
--- /dev/null
+++ b/img/nachokombiklein.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0d6b2c7ce72f7fef66bb7d7a2f866a9314887224250844c7e7dfb14971301f5b
+size 186145
diff --git a/img/nachos.jpg b/img/nachos.jpg
new file mode 100644
index 0000000..fe3e44c
--- /dev/null
+++ b/img/nachos.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b8894667ad385701048c0de7581e1b0b89f9ef70f5ec8e1d6960459ee0b385ec
+size 138226
diff --git a/img/nachosnormal.png b/img/nachosnormal.png
new file mode 100644
index 0000000..91f7fb0
--- /dev/null
+++ b/img/nachosnormal.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4084c3bee10cffee331d1b59408ef83f506669a8dad1ebb9674f6476ff3855e5
+size 138998
diff --git a/img/paypal.png b/img/paypal.png
new file mode 100644
index 0000000..98414ee
--- /dev/null
+++ b/img/paypal.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:eac849a575bba68da30d4b31a194c20b16425e3c1b99eee7a54a1ba1e61f5431
+size 7817
diff --git a/img/popcorn-big.png b/img/popcorn-big.png
new file mode 100644
index 0000000..d4bb902
--- /dev/null
+++ b/img/popcorn-big.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:65004614bad061d3b7513419111f5014ee43f6a3a94e4ea061023ef9801b1e2d
+size 54598
diff --git a/img/popcorn-klein.png b/img/popcorn-klein.png
new file mode 100644
index 0000000..87e8253
--- /dev/null
+++ b/img/popcorn-klein.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c3d813ef90241997121ac6080877aa8191f455894b3b92fecefef8429c8fb0f
+size 36347
diff --git a/img/popcorn-mittel.png b/img/popcorn-mittel.png
new file mode 100644
index 0000000..0e5e2f5
--- /dev/null
+++ b/img/popcorn-mittel.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:df5ed24d4ccb174daf4c40acac912216502976e8cabd5f679a4dfd9b985b544c
+size 46072
diff --git a/img/popcorn.jpg b/img/popcorn.jpg
new file mode 100644
index 0000000..19fdf28
--- /dev/null
+++ b/img/popcorn.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ec45c87ea01bb1304a4d52b9a4ee37508f4b60a40e4a7ad44e1c1efc14816a45
+size 18328
diff --git a/img/riegel.png b/img/riegel.png
new file mode 100644
index 0000000..6b4ee37
--- /dev/null
+++ b/img/riegel.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62d127f35b62bbbf438e84cb93b1a1e1cd348bbf45d9958644d84095f4ea0698
+size 190784
diff --git a/img/salsadip.png b/img/salsadip.png
new file mode 100644
index 0000000..f940260
--- /dev/null
+++ b/img/salsadip.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:21dde4e828a346eee96a17b6980cc515b7ef3b1d0ecd31d435a643c0f0a61cfa
+size 110935
diff --git a/img/screamdoorpopcorn.jpg b/img/screamdoorpopcorn.jpg
new file mode 100644
index 0000000..7091cdb
--- /dev/null
+++ b/img/screamdoorpopcorn.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62631b630f1eb20a8ca55abe2ff8d4b537596d15ae51e68b9947d8e304989a4d
+size 46028
diff --git a/img/screamvii.jpg b/img/screamvii.jpg
new file mode 100644
index 0000000..b729aec
--- /dev/null
+++ b/img/screamvii.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:89e6eae9662cbac62b2cbb1a95d147322dd02312e8b16137625f23f1fb4e56bd
+size 270851
diff --git a/img/shelter.jpg b/img/shelter.jpg
new file mode 100644
index 0000000..47a4172
--- /dev/null
+++ b/img/shelter.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:208014ce52b2993beb1464fd3aff245040e7e3ffc9dab48d81967b2306163035
+size 269459
diff --git a/img/solomio.png b/img/solomio.png
new file mode 100644
index 0000000..e993037
--- /dev/null
+++ b/img/solomio.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae5ef4013588a5795cfa45e7951fc063b5d5f918e1200c8007439aa438ebe1ae
+size 215822
diff --git a/img/sourdip.png b/img/sourdip.png
new file mode 100644
index 0000000..e6f4b4e
--- /dev/null
+++ b/img/sourdip.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1708efe8d2e6f36c69fad37b17ed3771c4c3442c35eb5224433679f1db03e9ee
+size 107082
diff --git a/img/spezi.png b/img/spezi.png
new file mode 100644
index 0000000..afa0196
--- /dev/null
+++ b/img/spezi.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d24b78c4639616cbfc75bddf688132349363deec1dbd318ba64c7164b0343961
+size 61617
diff --git a/img/spidermannewday.jpg b/img/spidermannewday.jpg
new file mode 100644
index 0000000..6d4137a
--- /dev/null
+++ b/img/spidermannewday.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a997fc306d649322dead0f1cff982d91bdfa47113929e282ebb0b031e716e82a
+size 270025
diff --git a/img/sprite.png b/img/sprite.png
new file mode 100644
index 0000000..52e7c83
--- /dev/null
+++ b/img/sprite.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0c583e76b1164c6a291bccb5667d20d00ab54b53ae4c2a31bf977c0229fdfa0b
+size 60219
diff --git a/img/super-mario-galaxy-banner.jpg b/img/super-mario-galaxy-banner.jpg
new file mode 100644
index 0000000..0181697
--- /dev/null
+++ b/img/super-mario-galaxy-banner.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a1afa181e03db87c8f546dd17c068698c0d5eb81b5efd88916842688354e8922
+size 189311
diff --git a/img/toystory1.jpg b/img/toystory1.jpg
new file mode 100644
index 0000000..51861c5
--- /dev/null
+++ b/img/toystory1.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d3a10869d08affe8e852a4672433f5bd51ac966caba9775e58286aa6dbcc9038
+size 116740
diff --git a/img/toystory2.jpg b/img/toystory2.jpg
new file mode 100644
index 0000000..01c7765
--- /dev/null
+++ b/img/toystory2.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:733f22bf04103afa8db32c647c7176eec724477e1f90955d19fa4b6a5e6a4d30
+size 658398
diff --git a/img/toystory3.jpg b/img/toystory3.jpg
new file mode 100644
index 0000000..c5c9f1b
--- /dev/null
+++ b/img/toystory3.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5a0f94f1f2c16be0197cc7f3d185a0f19785399ed7ff70d3dc777d36dce219e7
+size 492201
diff --git a/img/toystory4.jpg b/img/toystory4.jpg
new file mode 100644
index 0000000..3fd0f9b
--- /dev/null
+++ b/img/toystory4.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f23f99945a4937720b4215826ba8374a1cb0611f19a4b2d9c173b20662d23964
+size 103920
diff --git a/img/toystory5.png b/img/toystory5.png
new file mode 100644
index 0000000..f2d69fa
--- /dev/null
+++ b/img/toystory5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:41e8e0a7a938e99debfff2ea8ce95f303b054bf10dae3dba73972e367ed69045
+size 543084
diff --git a/img/visa.png b/img/visa.png
new file mode 100644
index 0000000..0e3567e
--- /dev/null
+++ b/img/visa.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1049e94ca6bb7192c93d18190742bf5c620c738aa608a1868a6d46cfb4f21bec
+size 25970
diff --git a/img/wasser.png b/img/wasser.png
new file mode 100644
index 0000000..4d1d68e
--- /dev/null
+++ b/img/wasser.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:62762f582269ed018626e217740824d8a0d9a3343c73a7deda8fbc9f14a9cdcc
+size 149620
diff --git a/img/zoomania-popcorn.jpg b/img/zoomania-popcorn.jpg
new file mode 100644
index 0000000..367147d
--- /dev/null
+++ b/img/zoomania-popcorn.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f69ddc878c130a0b28265d2b699a3545fa145639c0078e4439b09a23897267fe
+size 557077
diff --git a/img/zoomaniakidsmenu.jpg b/img/zoomaniakidsmenu.jpg
new file mode 100644
index 0000000..8c25252
--- /dev/null
+++ b/img/zoomaniakidsmenu.jpg
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb7b6676c880d61d7bd41b6acc06229041a65c0b00b4d2ecd763c1f6a2b0794c
+size 536867
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..537bc3c
--- /dev/null
+++ b/index.html
@@ -0,0 +1,959 @@
+
+
+
+
+
+ EAGLE's IMAX | Deluxe Experience
+
+
+
+ EAGLE's IMAX
+
+
+
+
+
+
+
+
+
+
+
Jetzt läuft
+ Heute im Fokus
+
+
+
+
+
+
+
+
+
+
Aktuelle Filme & Spielzeiten
+
Alle Filme mit 7 Tagen Spielplan. Erste Vorstellung taeglich ab 13:00 Uhr.
+
+
+
+
+
+
+
← Zur Startseite
+
Unsere Säle
+
Pflegbare Infoseite zu allen Sälen inkl. Bild- und Textbereichen.
+
+
+
+
+
+
+
← Zur Startseite
+
D-BOX & Technik
+
Inspiriert von Technikseiten moderner Kinos, aber in deinem Design.
+
+ Wie D-BOX funktioniert
+ D-BOX Sitze reagieren synchron zum Film. Die Bewegungsintensität ist individuell steuerbar und kann bei Bedarf reduziert oder deaktiviert werden.
+
+
+ Technik im Saal
+ Ergänze hier deine Informationen zu Projektion, Soundsystem, Sitzkomfort und den Sälen mit D-BOX-Unterstützung.
+
+
Bildplatz Technik 1
+
Bildplatz Technik 2
+
Bildplatz Technik 3
+
Bildplatz Technik 4
+
+
+
+ Filme in D-BOX
+
+
Zoomania 2
+
Der Austronaut
+
Spider Man
+
Scream VII
+
Gangster Gang 2
+
+
+
+
+
+
+
+
← Zur Startseite
+
Collectors Popcorn Specials
+
Filmbezogene Specials in einer links/rechts versetzten Darstellung.
+
+
+ Filmlogo
+
+
Special Becher 01
+
Kurzbeschreibung des Artikels und Bezug zum Film.
+
+
+
+
+ Filmlogo
+
+
Special Eimer 02
+
Weitere Edition mit eigenem Motiv und Text.
+
+
+
+
+ Filmlogo
+
+
Special Box 03
+
Noch ein Eintrag fuer limitierte Collectors.
+
+
+
+
+
+
+
+
+
+
+
+
Über uns
+
+ EAGLE's IMAX vereint modernes Design, starke Technik und echtes Kinofeeling.
+ Unser Anspruch: Jeder Besuch soll wie ein kleines Event wirken. Von entspannten Abenden
+ bis zu großen Blockbuster-Premieren liefern wir Bild, Sound und Atmosphäre auf Top-Niveau.
+
+
+ 4 Säle
+ IMAX Experience
+ D-BOX Motion Seats
+ Premium Snacks
+
+
+
+
+
+
+
+ 600+
+ Sitzplätze insgesamt
+
+
+ 4K / Laser
+ Hochauflösende Projektion
+
+
+ Dolby Atmos
+ Raumklang in ausgewählten Sälen
+
+
+ D-BOX
+ Bewegung synchron zum Film
+
+
+
+
+
+ Säle
+ Vom klassischen Kinoraum bis zum IMAX-Erlebnis: Jeder Saal ist individuell abgestimmt auf Genre, Publikum und Stimmung.
+ Mehr erfahren
+
+
+ D-BOX Plätze
+ Synchronisierte Sitzbewegungen machen Action und Effekte physisch spürbar und verstärken die Immersion im Film.
+ Mehr erfahren
+
+
+ Technik
+ Leinwandgrößen, Projektoren, Soundsysteme und Kapazitäten in einem separaten Technikfenster zusammengefasst.
+ Mehr erfahren
+
+
+
+
+
+
+
+
Snacks & Getränke
+
+
+ Getränke
+ Popcorn
+ Nachos
+ Snacks
+ Kombi
+ Eis
+
+
+
+
+
+
+
+
+
Coca Cola
+
+ 0,33L 2,50€
+ 0,50L 3,50€
+ 0,75L 4,50€
+ 1L 5,50€
+
+
+
+
+
+
+
+
Coca Cola Zero
+
+ 0,33L 2,50€
+ 0,50L 3,50€
+ 0,75L 4,50€
+ 1L 5,50€
+
+
+
+
+
+
+
Coca Cola Light
+
+ 0,33L 2,50€
+ 0,50L 3,50€
+ 0,75L 4,50€
+ 1L 5,50€
+
+
+
+
+
+
+
+
Sprite
+
+ 0,33L 2,50€
+ 0,50L 3,50€
+ 0,75L 4,50€
+ 1L 5,50€
+
+
+
+
+
+
+
+
Fanta
+
+ 0,33L 2,50€
+ 0,50L 3,50€
+ 0,75L 4,50€
+ 1L 5,50€
+
+
+
+
+
+
+
+
Mezzo Mix
+
+ 0,33L 2,50€
+ 0,50L 3,50€
+ 0,75L 4,50€
+ 1L 5,50€
+
+
+
+
+
+
+
Wasser
+
+ 0,33L 2,00€
+ 0,50L 3,00€
+ 0,75L 3,50€
+ 1L 4,00€
+
+
+
+
+
+
+
Apfelschorle
+
+ 0,33L 2,00€
+ 0,50L 3,00€
+ 0,75L 3,50€
+ 1L 4,00€
+
+
+
+
+
+
+
Fuze Tea
+
+ 0,33L 2,50€
+ 0,50L 3,50€
+
+
+
+
+
+
+
+
+
+
+
+
Popcorn klein
+
+ Süß
+ Salzig
+
+
+ 3,50€
+
+
+
+
+
+
+
Popcorn Mittel
+
+ Süß
+ Salzig
+
+
+ 4,50€
+
+
+
+
+
+
+
Popcorn Groß
+
+ Süß
+ Salzig
+
+
+ 6,00€
+
+
+
+
+
+
+
Limitierter Metallbecher - Zoomania 2
+
+ Süß
+ Salzig
+
+
+ 12,00€
+
+
+
+
+
+
+
Limitierter Sammelbecher - Scream VII
+
+ Süß
+ Salzig
+
+
+ 29,00€
+
+
+
+
+
+
+
Limitierter Sammelbecher - Der Austronaut
+
+ Süß
+ Salzig
+
+
+ 34,00€
+
+
+
+
+
+
+
Limitierter Metallbecher - Hoppers
+
+ Süß
+ Salzig
+
+
+ 12,00€
+
+
+
+
+
+
+
Limitierter Sammelbecher - Hoppers
+
+ Süß
+ Salzig
+
+
+ 21,00€
+
+
+
+
+
+
+
Limitierter Sammelbecher - Yoshi Becher
+
+ Süß
+ Salzig
+
+
+ 35,90€
+
+
+
+
+
+
+
+
+
+
+
Nachos Klein
+
+ Käse-Dip
+ Salsa-Dip
+
+
+ Klein5,00€
+
+
+
+
+
+
+
Nachos Normal
+
+ Käse-Dip
+ Salsa-Dip
+
+
+ Mittel6,50€
+
+
+
+
+
+
+
Nachos Groß
+
+ Käse-Dip
+ Sourcreme-Dip
+ Salsa-Dip
+
+
+ Groß 8,00€
+
+
+
+
+
+
Dips
+
+
+
+
+
+
+
Käse-Dip (warm)
+
+ Normal
+ Scharf
+
+
+ Schale2,00€
+
+
+
+
+
+
+
Sourcreme-Dip
+
+ Normal
+
+
+ Schale2,00€
+
+
+
+
+
+
+
Salsa-Dip
+
+ Normal
+
+
+ Schale2,00€
+
+
+
+
Nacho Kombi-Menüs
+
+
+
+
+
+
+
+
+
Nacho Menü Klein - Nachos klein + 1 Dip + 1 0,33L Getränk
+
+ Klein
+
+
+ Kombi6,90€
+
+
+
+
+
+
+
+
+
M&M's (verschiedene Sorten)
+
+ Packung 4,00€
+
+
+
+
+
+
+
Haribo Goldbären (verschiedene Sorten)
+
+ Tüte 3,00€
+
+
+
+
+
+
+
Schokoriegel (verschiedene Sorten)
+
+ Tüte 2,50€
+
+
+
+
+
+
+
+
+
+
+
Kleines Menü
+
0,33L Getränk + Popcorn Klein
+
+ Menü-Preis 5,00€
+
+
+
+
+
+
Mittleres Menü
+
0,5L Getränk + Popcorn Mittel
+
+ Menü-Preis 6,50€
+
+
+
+
+
+
Bestseller
+
Großes Menü
+
1L Getränk + Popcorn Groß
+
+ Menü-Preis 8,00€
+
+
+
+
+
+
+
+
SPECIAL
+
Limitiertes Menü
+
0,5L Getränk im HOPPERS Becher + HOPPERS Popcorn Schale +HOPPERS Figur
+
+ Menü-Preis 10,00€
+
+
+
+
+
+
+
+
SPECIAL
+
Limitiertes Menü
+
0,5L Getränk im MARIO GALXY Becher + MARIO GALAXY Popcorn Schale
+
+ Menü-Preis 10,00€
+
+
+
+
+
+
+
+
SPECIAL
+
Limitiertes Menü
+
0,5L Getränk im ZOOMANIA Becher + ZOOMANIA Popcorn Schale + Figur zum aussuchen
+
+ Menü-Preis 10,00€
+
+
+
+
+
+
+
+
+
Eiscreme & Shakes
+
Coming Soon...
+
Wir bereiten etwas ganz Besonderes für dich vor! Coming this summer!
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Deine Auswahl
+
+
+
+
+ Gesamtbetrag:
+ 0,00€
+
+
+
+
+
+
+
+
Plätze bestätigen
+
+
+
+
+
+
Dein Warenkorb
+
+
+
+
+
+
+
Zusammenfassung
+
+ Gesamtsumme:
+ 0,00€
+
+
+ inkl. 19% MwSt: 0,00€
+
+
+
Jetzt kostenpflichtig bestellen
+
+
+
Sicher bezahlen mit
+
+
+
+
+
+
+
+
+
+
+
Mein Konto
+
+
+
+
Passwort vergessen?
+
+
+ Falsche E-Mail oder Passwort
+
+
+
Anmelden
+
Noch kein Konto?
+
Registrieren
+
+
+
+
+
+
+
+
+
×
+
Passwort vergessen
+
Gib deine E-Mail ein und wir senden dir einen Reset-Code.
+
+
+
Code senden
+
+
+ Ein Code wurde simuliert versendet.
+
+
+
+
+
+
+
+
+
+
Zahlungsmethode wählen
+
+
+
+
Apple Pay
+
+
+
+
PayPal
+
+
+
+
Google Pay
+
+
+
+
Visa
+
+
+
Weiter zur Übersicht
+
+
+
+
+ ←
+
Persönliche Daten
+
+
Bestellübersicht
+
+
+
+
Jetzt Bezahlen
+
+
+
+
Kauf erfolgreich!
+
+
Zurück zur Startseite
+
+
+
+
+
+
+
Popcorn gefällig? 🍿
+
Möchtest du noch Snacks oder Getränke hinzufügen?
+
+ Ja, Snacks wählen
+ Weiter zum Warenkorb
+
+
+
+
+
+
+
×
+
Technik
+
Daten und Eckwerte zu Bild, Projektoren, Leinwandgrößen und Sitzkapazitäten.
+
+
+ Projektoren
+
+
+
+ Leinwandgrößen
+
+
+
+ Sitzplätze pro Saal
+
+
+
+ Bild & Audio
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
index fd1e285..89b44d5 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,23 +12,30 @@
"@tailwindcss/vite": "^4.2.4",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
- "astro": "^6.1.10",
+ "astro": "^6.2.0",
"dotenv": "^17.4.2",
"react": "^19.2.5",
"react-dom": "^19.2.5",
- "tailwindcss": "^4.2.4"
+ "tailwindcss": "^4.2.4",
+ "vite": "^6.4.2"
},
"devDependencies": {
- "@types/node": "^25.6.0"
+ "@eslint/js": "^10.0.1",
+ "@types/node": "^25.6.0",
+ "eslint": "^10.3.0",
+ "globals": "^17.6.0",
+ "jest": "^30.3.0",
+ "jiti": "^2.6.1",
+ "typescript-eslint": "^8.59.1"
},
"engines": {
"node": ">=22.12.0"
}
},
"node_modules/@astrojs/compiler": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-3.0.1.tgz",
- "integrity": "sha512-z97oYbdebO5aoWzuJ/8q5hLK232+17KcLZ7cJ8BCWk6+qNzVxn/gftC0KzMBUTD8WAaBkPpNSQK6PXLnNrZ0CA==",
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@astrojs/compiler/-/compiler-4.0.0.tgz",
+ "integrity": "sha512-eouss7G8ygdZqHuke033VMcVw5HTZUu+PXd/h06DGDUg/jt5btPYPqh66ENWw/mU78rBrf/oeC4oqoBwMtDMNA==",
"license": "MIT"
},
"node_modules/@astrojs/internal-helpers": {
@@ -247,15 +254,6 @@
"url": "https://opencollective.com/babel"
}
},
- "node_modules/@babel/core/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/generator": {
"version": "7.29.1",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
@@ -288,24 +286,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
- "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
- "license": "ISC",
- "dependencies": {
- "yallist": "^3.0.2"
- }
- },
- "node_modules/@babel/helper-compilation-targets/node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
"node_modules/@babel/helper-globals": {
"version": "7.28.0",
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
@@ -409,6 +389,245 @@
"node": ">=6.0.0"
}
},
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz",
+ "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.28.6.tgz",
+ "integrity": "sha512-wgEmr06G6sIpqr8YDwA2dSRTE3bJ+V0IfpzfSY3Lfgd7YWOaAdlykvJi13ZKBt8cZHfgH1IXN+CL656W3uUa4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.28.6.tgz",
+ "integrity": "sha512-+nDNmQye7nlnuuHDboPbGm00Vqg3oO8niRRL27/4LYHUsHYh0zJ1xWOz0uRwNFmM1Avzk8wZbc6rdiYhomzv/A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
"node_modules/@babel/plugin-transform-react-jsx-self": {
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
@@ -484,6 +703,13 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@capsizecss/unpack": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@capsizecss/unpack/-/unpack-4.0.0.tgz",
@@ -971,6 +1197,200 @@
"node": ">=18"
}
},
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
+ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.2",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz",
+ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/config-array": {
+ "version": "0.23.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz",
+ "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/object-schema": "^3.0.5",
+ "debug": "^4.3.1",
+ "minimatch": "^10.2.4"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/config-helpers": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.5.5.tgz",
+ "integrity": "sha512-eIJYKTCECbP/nsKaaruF6LW967mtbQbsw4JTtSVkUQc9MneSkbrgPJAbKl9nWr0ZeowV8BfsarBmPpBzGelA2w==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz",
+ "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz",
+ "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "eslint": "^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz",
+ "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.1.tgz",
+ "integrity": "sha512-rZAP3aVgB9ds9KOeUSL+zZ21hPmo8dh6fnIFwRQj5EAZl9gzR7wxYbYXYysAM8CTqGmUGyp2S4kUdV17MnGuWQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@eslint/core": "^1.2.1",
+ "levn": "^0.4.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ }
+ },
+ "node_modules/@humanfs/core": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz",
+ "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/types": "^0.15.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.8",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz",
+ "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanfs/core": "^0.19.2",
+ "@humanfs/types": "^0.15.0",
+ "@humanwhocodes/retry": "^0.4.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/types": {
+ "version": "0.15.0",
+ "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz",
+ "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+ "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
"node_modules/@img/colour": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.1.0.tgz",
@@ -1437,6 +1857,471 @@
"url": "https://opencollective.com/libvips"
}
},
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": {
+ "version": "3.14.2",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz",
+ "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz",
+ "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.3.0.tgz",
+ "integrity": "sha512-PAwCvFJ4696XP2qZj+LAn1BWjZaJ6RjG6c7/lkMaUJnkyMS34ucuIsfqYvfskVNvUI27R/u4P1HMYFnlVXG/Ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "jest-message-util": "30.3.0",
+ "jest-util": "30.3.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.3.0.tgz",
+ "integrity": "sha512-U5mVPsBxLSO6xYbf+tgkymLx+iAhvZX43/xI1+ej2ZOPnPdkdO1CzDmFKh2mZBn2s4XZixszHeQnzp1gm/DIxw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "30.3.0",
+ "@jest/pattern": "30.0.1",
+ "@jest/reporters": "30.3.0",
+ "@jest/test-result": "30.3.0",
+ "@jest/transform": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "ansi-escapes": "^4.3.2",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "exit-x": "^0.2.2",
+ "graceful-fs": "^4.2.11",
+ "jest-changed-files": "30.3.0",
+ "jest-config": "30.3.0",
+ "jest-haste-map": "30.3.0",
+ "jest-message-util": "30.3.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.3.0",
+ "jest-resolve-dependencies": "30.3.0",
+ "jest-runner": "30.3.0",
+ "jest-runtime": "30.3.0",
+ "jest-snapshot": "30.3.0",
+ "jest-util": "30.3.0",
+ "jest-validate": "30.3.0",
+ "jest-watcher": "30.3.0",
+ "pretty-format": "30.3.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/diff-sequences": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.3.0.tgz",
+ "integrity": "sha512-cG51MVnLq1ecVUaQ3fr6YuuAOitHK1S4WUJHnsPFE/quQr33ADUx1FfrTCpMCRxvy0Yr9BThKpDjSlcTi91tMA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.3.0.tgz",
+ "integrity": "sha512-SlLSF4Be735yQXyh2+mctBOzNDx5s5uLv88/j8Qn1wH679PDcwy67+YdADn8NJnGjzlXtN62asGH/T4vWOkfaw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/fake-timers": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "jest-mock": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.3.0.tgz",
+ "integrity": "sha512-76Nlh4xJxk2D/9URCn3wFi98d2hb19uWE1idLsTt2ywhvdOldbw3S570hBgn25P4ICUZ/cBjybrBex2g17IDbg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "expect": "30.3.0",
+ "jest-snapshot": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.3.0.tgz",
+ "integrity": "sha512-j0+W5iQQ8hBh7tHZkTQv3q2Fh/M7Je72cIsYqC4OaktgtO7v1So9UTjp6uPBHIaB6beoF/RRsCgMJKvti0wADA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/get-type": "30.1.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.3.0.tgz",
+ "integrity": "sha512-WUQDs8SOP9URStX1DzhD425CqbN/HxUYCTwVrT8sTVBfMvFqYt/s61EK5T05qnHu0po6RitXIvP9otZxYDzTGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.3.0",
+ "@sinonjs/fake-timers": "^15.0.0",
+ "@types/node": "*",
+ "jest-message-util": "30.3.0",
+ "jest-mock": "30.3.0",
+ "jest-util": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/get-type": {
+ "version": "30.1.0",
+ "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.1.0.tgz",
+ "integrity": "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.3.0.tgz",
+ "integrity": "sha512-+owLCBBdfpgL3HU+BD5etr1SvbXpSitJK0is1kiYjJxAAJggYMRQz5hSdd5pq1sSggfxPbw2ld71pt4x5wwViA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "30.3.0",
+ "@jest/expect": "30.3.0",
+ "@jest/types": "30.3.0",
+ "jest-mock": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/pattern": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz",
+ "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "jest-regex-util": "30.0.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.3.0.tgz",
+ "integrity": "sha512-a09z89S+PkQnL055bVj8+pe2Caed2PBOaczHcXCykW5ngxX9EWx/1uAwncxc/HiU0oZqfwseMjyhxgRjS49qPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "30.3.0",
+ "@jest/test-result": "30.3.0",
+ "@jest/transform": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "collect-v8-coverage": "^1.0.2",
+ "exit-x": "^0.2.2",
+ "glob": "^10.5.0",
+ "graceful-fs": "^4.2.11",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^5.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "30.3.0",
+ "jest-util": "30.3.0",
+ "jest-worker": "30.3.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.2",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "30.0.5",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz",
+ "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@sinclair/typebox": "^0.34.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/snapshot-utils": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.3.0.tgz",
+ "integrity": "sha512-ORbRN9sf5PP82v3FXNSwmO1OTDR2vzR2YTaR+E3VkSBZ8zadQE6IqYdYEeFH1NIkeB2HIGdF02dapb6K0Mj05g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.3.0",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "natural-compare": "^1.4.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz",
+ "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "callsites": "^3.1.0",
+ "graceful-fs": "^4.2.11"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.3.0.tgz",
+ "integrity": "sha512-e/52nJGuD74AKTSe0P4y5wFRlaXP0qmrS17rqOMHeSwm278VyNyXE3gFO/4DTGF9w+65ra3lo3VKj0LBrzmgdQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/istanbul-lib-coverage": "^2.0.6",
+ "collect-v8-coverage": "^1.0.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.3.0.tgz",
+ "integrity": "sha512-dgbWy9b8QDlQeRZcv7LNF+/jFiiYHTKho1xirauZ7kVwY7avjFF6uTT0RqlgudB5OuIPagFdVtfFMosjVbk1eA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "30.3.0",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.3.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.3.0.tgz",
+ "integrity": "sha512-TLKY33fSLVd/lKB2YI1pH69ijyUblO/BQvCj566YvnwuzoTNr648iE0j22vRvVNk2HsPwByPxATg3MleS3gf5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.27.4",
+ "@jest/types": "30.3.0",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "babel-plugin-istanbul": "^7.0.1",
+ "chalk": "^4.1.2",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.3.0",
+ "jest-regex-util": "30.0.1",
+ "jest-util": "30.3.0",
+ "pirates": "^4.0.7",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^5.0.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.3.0.tgz",
+ "integrity": "sha512-JHm87k7bA33hpBngtU8h6UBub/fqqA9uXfw+21j5Hmk7ooPHlboRNxHq0JcMtC+n8VJGP1mcfnD3Mk+XKe1oSw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/pattern": "30.0.1",
+ "@jest/schemas": "30.0.5",
+ "@types/istanbul-lib-coverage": "^2.0.6",
+ "@types/istanbul-reports": "^3.0.4",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.33",
+ "chalk": "^4.1.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.13",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
@@ -1483,21 +2368,15 @@
}
},
"node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.4.tgz",
- "integrity": "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==",
+ "version": "0.2.12",
+ "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz",
+ "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==",
"license": "MIT",
"optional": true,
"dependencies": {
- "@tybys/wasm-util": "^0.10.1"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Brooooooklyn"
- },
- "peerDependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1"
+ "@emnapi/core": "^1.4.3",
+ "@emnapi/runtime": "^1.4.3",
+ "@tybys/wasm-util": "^0.10.0"
}
},
"node_modules/@oslojs/encoding": {
@@ -1506,271 +2385,28 @@
"integrity": "sha512-70wQhgYmndg4GCPxPPxPGevRKqTIJ2Nh4OkiMWmDAVYsTQ+Ta7Sq+rPevXyXGdzr30/qZBnyOalCszoMxlyldQ==",
"license": "MIT"
},
- "node_modules/@oxc-project/types": {
- "version": "0.127.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz",
- "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==",
- "license": "MIT",
- "peer": true,
- "funding": {
- "url": "https://github.com/sponsors/Boshen"
- }
- },
- "node_modules/@rolldown/binding-android-arm64": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz",
- "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@pkgjs/parseargs": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz",
+ "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==",
+ "dev": true,
"license": "MIT",
"optional": true,
- "os": [
- "android"
- ],
- "peer": true,
"engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "node": ">=14"
}
},
- "node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz",
- "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==",
- "cpu": [
- "arm64"
- ],
+ "node_modules/@pkgr/core": {
+ "version": "0.2.9",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz",
+ "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==",
+ "dev": true,
"license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
"engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz",
- "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz",
- "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz",
- "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz",
- "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz",
- "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz",
- "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==",
- "cpu": [
- "ppc64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz",
- "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==",
- "cpu": [
- "s390x"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz",
- "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz",
- "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz",
- "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz",
- "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==",
- "cpu": [
- "wasm32"
- ],
- "license": "MIT",
- "optional": true,
- "peer": true,
- "dependencies": {
- "@emnapi/core": "1.10.0",
- "@emnapi/runtime": "1.10.0",
- "@napi-rs/wasm-runtime": "^1.1.4"
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
},
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz",
- "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz",
- "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "peer": true,
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "funding": {
+ "url": "https://opencollective.com/pkgr"
}
},
"node_modules/@rolldown/pluginutils": {
@@ -2226,6 +2862,33 @@
"integrity": "sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg==",
"license": "MIT"
},
+ "node_modules/@sinclair/typebox": {
+ "version": "0.34.49",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz",
+ "integrity": "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "15.3.2",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-15.3.2.tgz",
+ "integrity": "sha512-mrn35Jl2pCpns+mE3HaZa1yPN5EYCRgiMI+135COjr2hr8Cls9DXqIZ57vZe2cz7y2XVSq92tcs6kGQcT1J8Rw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.1"
+ }
+ },
"node_modules/@tailwindcss/node": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.2.4.tgz",
@@ -2543,6 +3206,13 @@
"@types/ms": "*"
}
},
+ "node_modules/@types/esrecurse": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/@types/esrecurse/-/esrecurse-4.3.1.tgz",
+ "integrity": "sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/estree": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
@@ -2558,6 +3228,40 @@
"@types/unist": "*"
}
},
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/mdast": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
@@ -2610,18 +3314,554 @@
"@types/react": "^19.2.0"
}
},
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/@types/unist": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
"integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
"license": "MIT"
},
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz",
+ "integrity": "sha512-qUHkeCyQFxMXg79wQfTtfndEC+N9ZZg76HJftDJp+qH2tV7Gj4OJi7l+PiWwJ+pWtW8GwSmqsDj/oymhrTWXjg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz",
+ "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.59.1",
+ "@typescript-eslint/type-utils": "8.59.1",
+ "@typescript-eslint/utils": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.59.1",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz",
+ "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "8.59.1",
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz",
+ "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/tsconfig-utils": "^8.59.1",
+ "@typescript-eslint/types": "^8.59.1",
+ "debug": "^4.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz",
+ "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz",
+ "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz",
+ "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1",
+ "@typescript-eslint/utils": "8.59.1",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz",
+ "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz",
+ "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/project-service": "8.59.1",
+ "@typescript-eslint/tsconfig-utils": "8.59.1",
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/visitor-keys": "8.59.1",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz",
+ "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.59.1",
+ "@typescript-eslint/types": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz",
+ "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "8.59.1",
+ "eslint-visitor-keys": "^5.0.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
"node_modules/@ungap/structured-clone": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz",
"integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==",
"license": "ISC"
},
+ "node_modules/@unrs/resolver-binding-android-arm-eabi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz",
+ "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-android-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz",
+ "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-arm64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz",
+ "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-darwin-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz",
+ "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-freebsd-x64": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz",
+ "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz",
+ "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz",
+ "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz",
+ "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-arm64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz",
+ "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz",
+ "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz",
+ "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-riscv64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz",
+ "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-s390x-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz",
+ "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-gnu": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz",
+ "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-linux-x64-musl": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz",
+ "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-wasm32-wasi": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz",
+ "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==",
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@napi-rs/wasm-runtime": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@unrs/resolver-binding-win32-arm64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz",
+ "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-ia32-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz",
+ "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@unrs/resolver-binding-win32-x64-msvc": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz",
+ "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
"node_modules/@vitejs/plugin-react": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.2.0.tgz",
@@ -2642,6 +3882,91 @@
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
}
},
+ "node_modules/acorn": {
+ "version": "8.16.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz",
+ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz",
+ "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.2.tgz",
+ "integrity": "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/anymatch": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
@@ -2693,12 +4018,12 @@
}
},
"node_modules/astro": {
- "version": "6.1.10",
- "resolved": "https://registry.npmjs.org/astro/-/astro-6.1.10.tgz",
- "integrity": "sha512-jQAIki6c862oxRr7OXXC+h3n4wg1EpmKgCH3vv1FtXM9VFmD2iTjlaxrfb0I6eQCwtUjSBxfJBFBDSXHu7Wing==",
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/astro/-/astro-6.2.0.tgz",
+ "integrity": "sha512-EUAjibRHghfveuLW/8Wrp9DiL50zsp9VxTGQz9P9h/ViFM13AuWF209gn/Qtt7gZqYahpP6XH+mDT83DEOMgMw==",
"license": "MIT",
"dependencies": {
- "@astrojs/compiler": "^3.0.1",
+ "@astrojs/compiler": "^4.0.0",
"@astrojs/internal-helpers": "0.9.0",
"@astrojs/markdown-remark": "7.1.1",
"@astrojs/telemetry": "3.3.1",
@@ -2769,6 +4094,18 @@
"sharp": "^0.34.0"
}
},
+ "node_modules/astro/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/astro/node_modules/vite": {
"version": "7.3.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-7.3.2.tgz",
@@ -2852,6 +4189,105 @@
"node": ">= 0.4"
}
},
+ "node_modules/babel-jest": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.3.0.tgz",
+ "integrity": "sha512-gRpauEU2KRrCox5Z296aeVHR4jQ98BCnu0IO332D/xpHNOsIH/bgSRk9k6GbKIbBw8vFeN6ctuu6tV8WOyVfYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/transform": "30.3.0",
+ "@types/babel__core": "^7.20.5",
+ "babel-plugin-istanbul": "^7.0.1",
+ "babel-preset-jest": "30.3.0",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.1.tgz",
+ "integrity": "sha512-D8Z6Qm8jCvVXtIRkBnqNHX0zJ37rQcFJ9u8WOS6tkYOsRdHBzypCstaxWiu5ZIlqQtviRYbgnRLSoCEvjqcqbA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "workspaces": [
+ "test/babel-8"
+ ],
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-instrument": "^6.0.2",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.3.0.tgz",
+ "integrity": "sha512-+TRkByhsws6sfPjVaitzadk1I0F5sPvOVUH5tyTSzhePpsGIVrdeunHSw/C36QeocS95OOk8lunc4rlu5Anwsg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/babel__core": "^7.20.5"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz",
+ "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.3.0.tgz",
+ "integrity": "sha512-6ZcUbWHC+dMz2vfzdNwi87Z1gQsLNK2uLuK1Q89R11xdvejcivlYYwDlEv0FHX3VwEXpbBQ9uufB/MUNpZGfhQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-plugin-jest-hoist": "30.3.0",
+ "babel-preset-current-node-syntax": "^1.2.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0 || ^8.0.0-beta.1"
+ }
+ },
"node_modules/bail": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
@@ -2862,6 +4298,16 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/baseline-browser-mapping": {
"version": "2.10.24",
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.24.tgz",
@@ -2880,6 +4326,19 @@
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
"license": "ISC"
},
+ "node_modules/brace-expansion": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz",
+ "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^4.0.2"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ }
+ },
"node_modules/browserslist": {
"version": "4.28.2",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz",
@@ -2913,6 +4372,43 @@
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
}
},
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
"node_modules/caniuse-lite": {
"version": "1.0.30001791",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001791.tgz",
@@ -2943,6 +4439,33 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/character-entities": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
@@ -3003,6 +4526,91 @@
"node": ">=8"
}
},
+ "node_modules/cjs-module-lexer": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz",
+ "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/cliui/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/clsx": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
@@ -3012,6 +4620,44 @@
"node": ">=6"
}
},
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.3.tgz",
+ "integrity": "sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/comma-separated-tokens": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
@@ -3040,6 +4686,13 @@
"node": ">= 18"
}
},
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/convert-source-map": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
@@ -3065,6 +4718,21 @@
"integrity": "sha512-lXVyvUvrNXblMqzIRrxHb57UUVmqsSWlxqt3XIjCkUP0wDAf6uicO6KMbEgYrMNtEvWgWHwe42CKxPu9MYAnWw==",
"license": "MIT"
},
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/crossws": {
"version": "0.3.5",
"resolved": "https://registry.npmjs.org/crossws/-/crossws-0.3.5.tgz",
@@ -3184,6 +4852,38 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/dedent": {
+ "version": "1.7.2",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.7.2.tgz",
+ "integrity": "sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/defu": {
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz",
@@ -3214,6 +4914,16 @@
"node": ">=8"
}
},
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/devalue": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/devalue/-/devalue-5.7.1.tgz",
@@ -3336,12 +5046,39 @@
"node": ">=4"
}
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/electron-to-chromium": {
"version": "1.5.345",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.345.tgz",
"integrity": "sha512-F9JXQGiMrz6yVNPI2qOVPvB9HzjH5cGzhs8oJ6A28V5L/YnzN/0KsuiibqF+F1Fd9qxFzD1BUnYSd8JfULxTwg==",
"license": "ISC"
},
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/enhanced-resolve": {
"version": "5.21.0",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.0.tgz",
@@ -3367,6 +5104,16 @@
"url": "https://github.com/fb55/entities?sponsor=1"
}
},
+ "node_modules/error-ex": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz",
+ "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
"node_modules/es-module-lexer": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.1.0.tgz",
@@ -3435,24 +5182,283 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/eslint": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.3.0.tgz",
+ "integrity": "sha512-XbEXaRva5cF0ZQB8w6MluHA0kZZfV2DuCMJ3ozyEOHLwDpZX2Lmm/7Pp0xdJmI0GL1W05VH5VwIFHEm1Vcw2gw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.8.0",
+ "@eslint-community/regexpp": "^4.12.2",
+ "@eslint/config-array": "^0.23.5",
+ "@eslint/config-helpers": "^0.5.5",
+ "@eslint/core": "^1.2.1",
+ "@eslint/plugin-kit": "^0.7.1",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.2",
+ "@types/estree": "^1.0.6",
+ "ajv": "^6.14.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^9.1.2",
+ "eslint-visitor-keys": "^5.0.1",
+ "espree": "^11.2.0",
+ "esquery": "^1.7.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "minimatch": "^10.2.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-9.1.2.tgz",
+ "integrity": "sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@types/esrecurse": "^4.3.1",
+ "@types/estree": "^1.0.8",
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-11.2.0.tgz",
+ "integrity": "sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^5.0.1"
+ },
+ "engines": {
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz",
+ "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
"node_modules/estree-walker": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"license": "MIT"
},
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/eventemitter3": {
"version": "5.0.4",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz",
"integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==",
"license": "MIT"
},
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/signal-exit": {
+ "version": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/exit-x": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz",
+ "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-30.3.0.tgz",
+ "integrity": "sha512-1zQrciTiQfRdo7qJM1uG4navm8DayFa2TgCSRlzUyNkhcJ6XUZF3hjnpkyr3VhAqPH7i/9GkG7Tv5abz6fqz0Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/expect-utils": "30.3.0",
+ "@jest/get-type": "30.1.0",
+ "jest-matcher-utils": "30.3.0",
+ "jest-message-util": "30.3.0",
+ "jest-mock": "30.3.0",
+ "jest-util": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
"node_modules/extend": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
"integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
"license": "MIT"
},
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/fast-string-truncated-width": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/fast-string-truncated-width/-/fast-string-truncated-width-3.0.3.tgz",
@@ -3477,6 +5483,16 @@
"fast-string-width": "^3.0.2"
}
},
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
"node_modules/fdir": {
"version": "6.5.0",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
@@ -3494,6 +5510,57 @@
}
}
},
+ "node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz",
+ "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/flattie": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/flattie/-/flattie-1.1.1.tgz",
@@ -3524,6 +5591,30 @@
"node": ">=20"
}
},
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/fsevents": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
@@ -3547,12 +5638,126 @@
"node": ">=6.9.0"
}
},
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/github-slugger": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-2.0.0.tgz",
"integrity": "sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==",
"license": "ISC"
},
+ "node_modules/glob": {
+ "version": "10.5.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-10.5.0.tgz",
+ "integrity": "sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^3.1.2",
+ "minimatch": "^9.0.4",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^1.11.1"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz",
+ "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "9.0.9",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz",
+ "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/globals": {
+ "version": "17.6.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-17.6.0.tgz",
+ "integrity": "sha512-sepffkT8stwnIYbsMBpoCHJuJM5l98FUF2AnE07hfvE0m/qp3R586hw4jF4uadbhvg1ooIdzuu7CsfD2jzCaNA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/graceful-fs": {
"version": "4.2.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
@@ -3576,6 +5781,16 @@
"uncrypto": "^0.1.3"
}
},
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/hast-util-from-html": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/hast-util-from-html/-/hast-util-from-html-2.0.3.tgz",
@@ -3775,6 +5990,75 @@
"integrity": "sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==",
"license": "BSD-2-Clause"
},
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/iron-webcrypto": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz",
@@ -3784,6 +6068,13 @@
"url": "https://github.com/sponsors/brc-dd"
}
},
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/is-docker": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/is-docker/-/is-docker-4.0.0.tgz",
@@ -3799,6 +6090,49 @@
"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",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-glob": {
+ "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",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-inside-container": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz",
@@ -3844,6 +6178,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-wsl": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.1.tgz",
@@ -3859,6 +6206,799 @@
"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==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-instrument/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz",
+ "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.23",
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-reports/node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/jackspeak": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz",
+ "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ },
+ "optionalDependencies": {
+ "@pkgjs/parseargs": "^0.11.0"
+ }
+ },
+ "node_modules/jest": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-30.3.0.tgz",
+ "integrity": "sha512-AkXIIFcaazymvey2i/+F94XRnM6TsVLZDhBMLsd1Sf/W0wzsvvpjeyUrCZD6HGG4SDYPgDJDBKeiJTBb10WzMg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "30.3.0",
+ "@jest/types": "30.3.0",
+ "import-local": "^3.2.0",
+ "jest-cli": "30.3.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.3.0.tgz",
+ "integrity": "sha512-B/7Cny6cV5At6M25EWDgf9S617lHivamL8vl6KEpJqkStauzcG4e+WPfDgMMF+H4FVH4A2PLRyvgDJan4441QA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "execa": "^5.1.1",
+ "jest-util": "30.3.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-changed-files/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-changed-files/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.3.0.tgz",
+ "integrity": "sha512-PyXq5szeSfR/4f1lYqCmmQjh0vqDkURUYi9N6whnHjlRz4IUQfMcXkGLeEoiJtxtyPqgUaUUfyQlApXWBSN1RA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "30.3.0",
+ "@jest/expect": "30.3.0",
+ "@jest/test-result": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "co": "^4.6.0",
+ "dedent": "^1.6.0",
+ "is-generator-fn": "^2.1.0",
+ "jest-each": "30.3.0",
+ "jest-matcher-utils": "30.3.0",
+ "jest-message-util": "30.3.0",
+ "jest-runtime": "30.3.0",
+ "jest-snapshot": "30.3.0",
+ "jest-util": "30.3.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "30.3.0",
+ "pure-rand": "^7.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.6"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-circus/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-circus/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.3.0.tgz",
+ "integrity": "sha512-l6Tqx+j1fDXJEW5bqYykDQQ7mQg+9mhWXtnj+tQZrTWYHyHoi6Be8HPumDSA+UiX2/2buEgjA58iJzdj146uCw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/core": "30.3.0",
+ "@jest/test-result": "30.3.0",
+ "@jest/types": "30.3.0",
+ "chalk": "^4.1.2",
+ "exit-x": "^0.2.2",
+ "import-local": "^3.2.0",
+ "jest-config": "30.3.0",
+ "jest-util": "30.3.0",
+ "jest-validate": "30.3.0",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.3.0.tgz",
+ "integrity": "sha512-WPMAkMAtNDY9P/oKObtsRG/6KTrhtgPJoBTmk20uDn4Uy6/3EJnnaZJre/FMT1KVRx8cve1r7/FlMIOfRVWL4w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.27.4",
+ "@jest/get-type": "30.1.0",
+ "@jest/pattern": "30.0.1",
+ "@jest/test-sequencer": "30.3.0",
+ "@jest/types": "30.3.0",
+ "babel-jest": "30.3.0",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "deepmerge": "^4.3.1",
+ "glob": "^10.5.0",
+ "graceful-fs": "^4.2.11",
+ "jest-circus": "30.3.0",
+ "jest-docblock": "30.2.0",
+ "jest-environment-node": "30.3.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.3.0",
+ "jest-runner": "30.3.0",
+ "jest-util": "30.3.0",
+ "jest-validate": "30.3.0",
+ "parse-json": "^5.2.0",
+ "pretty-format": "30.3.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "esbuild-register": ">=3.4.0",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "esbuild-register": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.3.0.tgz",
+ "integrity": "sha512-n3q4PDQjS4LrKxfWB3Z5KNk1XjXtZTBwQp71OP0Jo03Z6V60x++K5L8k6ZrW8MY8pOFylZvHM0zsjS1RqlHJZQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/diff-sequences": "30.3.0",
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "pretty-format": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "30.2.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.2.0.tgz",
+ "integrity": "sha512-tR/FFgZKS1CXluOQzZvNH3+0z9jXr3ldGSD8bhyuxvlVUwbeLOGynkunvlTMxchC5urrKndYiwCFC0DLVjpOCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "detect-newline": "^3.1.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.3.0.tgz",
+ "integrity": "sha512-V8eMndg/aZ+3LnCJgSm13IxS5XSBM22QSZc9BtPK8Dek6pm+hfUNfwBdvsB3d342bo1q7wnSkC38zjX259qZNA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "@jest/types": "30.3.0",
+ "chalk": "^4.1.2",
+ "jest-util": "30.3.0",
+ "pretty-format": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.3.0.tgz",
+ "integrity": "sha512-4i6HItw/JSiJVsC5q0hnKIe/hbYfZLVG9YJ/0pU9Hz2n/9qZe3Rhn5s5CUZA5ORZlcdT/vmAXRMyONXJwPrmYQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "30.3.0",
+ "@jest/fake-timers": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "jest-mock": "30.3.0",
+ "jest-util": "30.3.0",
+ "jest-validate": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.3.0.tgz",
+ "integrity": "sha512-mMi2oqG4KRU0R9QEtscl87JzMXfUhbKaFqOxmjb2CKcbHcUGFrJCBWHmnTiUqi6JcnzoBlO4rWfpdl2k/RfLCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "anymatch": "^3.1.3",
+ "fb-watchman": "^2.0.2",
+ "graceful-fs": "^4.2.11",
+ "jest-regex-util": "30.0.1",
+ "jest-util": "30.3.0",
+ "jest-worker": "30.3.0",
+ "picomatch": "^4.0.3",
+ "walker": "^1.0.8"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.3"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.3.0.tgz",
+ "integrity": "sha512-cuKmUUGIjfXZAiGJ7TbEMx0bcqNdPPI6P1V+7aF+m/FUJqFDxkFR4JqkTu8ZOiU5AaX/x0hZ20KaaIPXQzbMGQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "pretty-format": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.3.0.tgz",
+ "integrity": "sha512-HEtc9uFQgaUHkC7nLSlQL3Tph4Pjxt/yiPvkIrrDCt9jhoLIgxaubo1G+CFOnmHYMxHwwdaSN7mkIFs6ZK8OhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "chalk": "^4.1.2",
+ "jest-diff": "30.3.0",
+ "pretty-format": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.3.0.tgz",
+ "integrity": "sha512-Z/j4Bo+4ySJ+JPJN3b2Qbl9hDq3VrXmnjjGEWD/x0BCXeOXPTV1iZYYzl2X8c1MaCOL+ewMyNBcm88sboE6YWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.27.1",
+ "@jest/types": "30.3.0",
+ "@types/stack-utils": "^2.0.3",
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "picomatch": "^4.0.3",
+ "pretty-format": "30.3.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.6"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.3.0.tgz",
+ "integrity": "sha512-OTzICK8CpE+t4ndhKrwlIdbM6Pn8j00lvmSmq5ejiO+KxukbLjgOflKWMn3KE34EZdQm5RqTuKj+5RIEniYhog==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "jest-util": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "30.0.1",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz",
+ "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.3.0.tgz",
+ "integrity": "sha512-NRtTAHQlpd15F9rUR36jqwelbrDV/dY4vzNte3S2kxCKUJRYNd5/6nTSbYiak1VX5g8IoFF23Uj5TURkUW8O5g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.3.0",
+ "jest-pnp-resolver": "^1.2.3",
+ "jest-util": "30.3.0",
+ "jest-validate": "30.3.0",
+ "slash": "^3.0.0",
+ "unrs-resolver": "^1.7.11"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.3.0.tgz",
+ "integrity": "sha512-9ev8s3YN6Hsyz9LV75XUwkCVFlwPbaFn6Wp75qnI0wzAINYWY8Fb3+6y59Rwd3QaS3kKXffHXsZMziMavfz/nw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "jest-regex-util": "30.0.1",
+ "jest-snapshot": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.3.0.tgz",
+ "integrity": "sha512-gDv6C9LGKWDPLia9TSzZwf4h3kMQCqyTpq+95PODnTRDO0g9os48XIYYkS6D236vjpBir2fF63YmJFtqkS5Duw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/console": "30.3.0",
+ "@jest/environment": "30.3.0",
+ "@jest/test-result": "30.3.0",
+ "@jest/transform": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "emittery": "^0.13.1",
+ "exit-x": "^0.2.2",
+ "graceful-fs": "^4.2.11",
+ "jest-docblock": "30.2.0",
+ "jest-environment-node": "30.3.0",
+ "jest-haste-map": "30.3.0",
+ "jest-leak-detector": "30.3.0",
+ "jest-message-util": "30.3.0",
+ "jest-resolve": "30.3.0",
+ "jest-runtime": "30.3.0",
+ "jest-util": "30.3.0",
+ "jest-watcher": "30.3.0",
+ "jest-worker": "30.3.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-runner/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-runner/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.3.0.tgz",
+ "integrity": "sha512-CgC+hIBJbuh78HEffkhNKcbXAytQViplcl8xupqeIWyKQF50kCQA8J7GeJCkjisC6hpnC9Muf8jV5RdtdFbGng==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/environment": "30.3.0",
+ "@jest/fake-timers": "30.3.0",
+ "@jest/globals": "30.3.0",
+ "@jest/source-map": "30.0.1",
+ "@jest/test-result": "30.3.0",
+ "@jest/transform": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "cjs-module-lexer": "^2.1.0",
+ "collect-v8-coverage": "^1.0.2",
+ "glob": "^10.5.0",
+ "graceful-fs": "^4.2.11",
+ "jest-haste-map": "30.3.0",
+ "jest-message-util": "30.3.0",
+ "jest-mock": "30.3.0",
+ "jest-regex-util": "30.0.1",
+ "jest-resolve": "30.3.0",
+ "jest-snapshot": "30.3.0",
+ "jest-util": "30.3.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.3.0.tgz",
+ "integrity": "sha512-f14c7atpb4O2DeNhwcvS810Y63wEn8O1HqK/luJ4F6M4NjvxmAKQwBUWjbExUtMxWJQ0wVgmCKymeJK6NZMnfQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.27.4",
+ "@babel/generator": "^7.27.5",
+ "@babel/plugin-syntax-jsx": "^7.27.1",
+ "@babel/plugin-syntax-typescript": "^7.27.1",
+ "@babel/types": "^7.27.3",
+ "@jest/expect-utils": "30.3.0",
+ "@jest/get-type": "30.1.0",
+ "@jest/snapshot-utils": "30.3.0",
+ "@jest/transform": "30.3.0",
+ "@jest/types": "30.3.0",
+ "babel-preset-current-node-syntax": "^1.2.0",
+ "chalk": "^4.1.2",
+ "expect": "30.3.0",
+ "graceful-fs": "^4.2.11",
+ "jest-diff": "30.3.0",
+ "jest-matcher-utils": "30.3.0",
+ "jest-message-util": "30.3.0",
+ "jest-util": "30.3.0",
+ "pretty-format": "30.3.0",
+ "semver": "^7.7.2",
+ "synckit": "^0.11.8"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.3.0.tgz",
+ "integrity": "sha512-/jZDa00a3Sz7rdyu55NLrQCIrbyIkbBxareejQI315f/i8HjYN+ZWsDLLpoQSiUIEIyZF/R8fDg3BmB8AtHttg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "chalk": "^4.1.2",
+ "ci-info": "^4.2.0",
+ "graceful-fs": "^4.2.11",
+ "picomatch": "^4.0.3"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.3.0.tgz",
+ "integrity": "sha512-I/xzC8h5G+SHCb2P2gWkJYrNiTbeL47KvKeW5EzplkyxzBRBw1ssSHlI/jXec0ukH2q7x2zAWQm7015iusg62Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/get-type": "30.1.0",
+ "@jest/types": "30.3.0",
+ "camelcase": "^6.3.0",
+ "chalk": "^4.1.2",
+ "leven": "^3.1.0",
+ "pretty-format": "30.3.0"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-validate/node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.3.0.tgz",
+ "integrity": "sha512-PJ1d9ThtTR8aMiBWUdcownq9mDdLXsQzJayTk4kmaBRHKvwNQn+ANveuhEBUyNI2hR1TVhvQ8D5kHubbzBHR/w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/test-result": "30.3.0",
+ "@jest/types": "30.3.0",
+ "@types/node": "*",
+ "ansi-escapes": "^4.3.2",
+ "chalk": "^4.1.2",
+ "emittery": "^0.13.1",
+ "jest-util": "30.3.0",
+ "string-length": "^4.0.2"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.3.0.tgz",
+ "integrity": "sha512-DrCKkaQwHexjRUFTmPzs7sHQe0TSj9nvDALKGdwmK5mW9v7j90BudWirKAJHt3QQ9Dhrg1F7DogPzhChppkJpQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@ungap/structured-clone": "^1.3.0",
+ "jest-util": "30.3.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.1.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/jest-worker/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
"node_modules/jiti": {
"version": "2.6.1",
"resolved": "https://registry.npmjs.org/jiti/-/jiti-2.6.1.tgz",
@@ -3898,6 +7038,34 @@
"node": ">=6"
}
},
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/json5": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
@@ -3910,6 +7078,40 @@
"node": ">=6"
}
},
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/lightningcss": {
"version": "1.32.0",
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
@@ -4159,6 +7361,29 @@
"url": "https://opencollective.com/parcel"
}
},
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/longest-streak": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
@@ -4170,12 +7395,12 @@
}
},
"node_modules/lru-cache": {
- "version": "11.3.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz",
- "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==",
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
}
},
"node_modules/magic-string": {
@@ -4198,6 +7423,45 @@
"source-map-js": "^1.2.1"
}
},
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
"node_modules/markdown-table": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
@@ -4439,6 +7703,13 @@
"integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
"license": "CC0-1.0"
},
+ "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==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/micromark": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
@@ -5002,6 +8273,42 @@
],
"license": "MIT"
},
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "brace-expansion": "^5.0.5"
+ },
+ "engines": {
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minipass": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz",
+ "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/mrmime": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
@@ -5035,6 +8342,29 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
+ "node_modules/napi-postinstall": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.4.tgz",
+ "integrity": "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "napi-postinstall": "lib/cli.js"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/napi-postinstall"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/neotraverse": {
"version": "0.6.18",
"resolved": "https://registry.npmjs.org/neotraverse/-/neotraverse-0.6.18.tgz",
@@ -5063,6 +8393,13 @@
"integrity": "sha512-g9yhqoedzIUm0nTnTqAQvueMPVOuIY16bqgAJJC8XOOubYFNwz6IER9qs0Gq2Xd0+CecCKFjtdDTMA4u4xG06Q==",
"license": "MIT"
},
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/node-mock-http": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/node-mock-http/-/node-mock-http-1.0.4.tgz",
@@ -5084,6 +8421,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/nth-check": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
@@ -5123,6 +8473,32 @@
"integrity": "sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==",
"license": "MIT"
},
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/oniguruma-parser": {
"version": "0.12.2",
"resolved": "https://registry.npmjs.org/oniguruma-parser/-/oniguruma-parser-0.12.2.tgz",
@@ -5140,6 +8516,24 @@
"regex-recursion": "^6.0.2"
}
},
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.5"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
"node_modules/p-limit": {
"version": "7.3.0",
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-7.3.0.tgz",
@@ -5155,6 +8549,51 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate/node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/p-queue": {
"version": "9.2.0",
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-9.2.0.tgz",
@@ -5183,12 +8622,48 @@
"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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true,
+ "license": "BlueOak-1.0.0"
+ },
"node_modules/package-manager-detector": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.6.0.tgz",
"integrity": "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA==",
"license": "MIT"
},
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/parse-latin": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/parse-latin/-/parse-latin-7.0.0.tgz",
@@ -5219,6 +8694,60 @@
"url": "https://github.com/inikulin/parse5?sponsor=1"
}
},
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-scurry": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz",
+ "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==",
+ "dev": true,
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^10.2.0",
+ "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
+ "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
+ "dev": true,
+ "license": "ISC"
+ },
"node_modules/piccolore": {
"version": "0.1.3",
"resolved": "https://registry.npmjs.org/piccolore/-/piccolore-0.1.3.tgz",
@@ -5243,6 +8772,85 @@
"url": "https://github.com/sponsors/jonschlinkert"
}
},
+ "node_modules/pirates": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz",
+ "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pkg-dir/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/postcss": {
"version": "8.5.12",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.12.tgz",
@@ -5271,6 +8879,44 @@
"node": "^10 || ^12 || >=14"
}
},
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "30.3.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.3.0.tgz",
+ "integrity": "sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jest/schemas": "30.0.5",
+ "ansi-styles": "^5.2.0",
+ "react-is": "^18.3.1"
+ },
+ "engines": {
+ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
"node_modules/prismjs": {
"version": "1.30.0",
"resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz",
@@ -5290,6 +8936,33 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pure-rand": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz",
+ "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ],
+ "license": "MIT"
+ },
"node_modules/radix3": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz",
@@ -5317,6 +8990,13 @@
"react": "^19.2.5"
}
},
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/react-refresh": {
"version": "0.18.0",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.18.0.tgz",
@@ -5505,6 +9185,39 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/retext": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/retext/-/retext-9.0.0.tgz",
@@ -5566,47 +9279,6 @@
"url": "https://opencollective.com/unified"
}
},
- "node_modules/rolldown": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz",
- "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==",
- "license": "MIT",
- "peer": true,
- "dependencies": {
- "@oxc-project/types": "=0.127.0",
- "@rolldown/pluginutils": "1.0.0-rc.17"
- },
- "bin": {
- "rolldown": "bin/cli.mjs"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "optionalDependencies": {
- "@rolldown/binding-android-arm64": "1.0.0-rc.17",
- "@rolldown/binding-darwin-arm64": "1.0.0-rc.17",
- "@rolldown/binding-darwin-x64": "1.0.0-rc.17",
- "@rolldown/binding-freebsd-x64": "1.0.0-rc.17",
- "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17",
- "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17",
- "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17",
- "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17",
- "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17",
- "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17",
- "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17",
- "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17",
- "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17",
- "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17",
- "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17"
- }
- },
- "node_modules/rolldown/node_modules/@rolldown/pluginutils": {
- "version": "1.0.0-rc.17",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz",
- "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==",
- "license": "MIT",
- "peer": true
- },
"node_modules/rollup": {
"version": "4.60.2",
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.2.tgz",
@@ -5667,15 +9339,12 @@
"license": "MIT"
},
"node_modules/semver": {
- "version": "7.7.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
- "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
}
},
"node_modules/sharp": {
@@ -5723,6 +9392,42 @@
"@img/sharp-win32-x64": "0.34.5"
}
},
+ "node_modules/sharp/node_modules/semver": {
+ "version": "7.7.4",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz",
+ "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==",
+ "license": "ISC",
+ "optional": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "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==",
+ "dev": true,
+ "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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/shiki": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/shiki/-/shiki-4.0.2.tgz",
@@ -5742,12 +9447,35 @@
"node": ">=20"
}
},
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/sisteransi": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
"integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
"license": "MIT"
},
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/smol-toml": {
"version": "1.6.1",
"resolved": "https://registry.npmjs.org/smol-toml/-/smol-toml-1.6.1.tgz",
@@ -5760,6 +9488,16 @@
"url": "https://github.com/sponsors/cyyynthia"
}
},
+ "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==",
+ "dev": true,
+ "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",
@@ -5769,6 +9507,17 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
"node_modules/space-separated-tokens": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
@@ -5779,6 +9528,137 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-length/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-length/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width-cjs/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/stringify-entities": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
@@ -5793,6 +9673,92 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/strip-ansi": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.2.0.tgz",
+ "integrity": "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.2.2"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/svgo": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/svgo/-/svgo-4.0.1.tgz",
@@ -5818,6 +9784,22 @@
"url": "https://opencollective.com/svgo"
}
},
+ "node_modules/synckit": {
+ "version": "0.11.12",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.12.tgz",
+ "integrity": "sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@pkgr/core": "^0.2.9"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/synckit"
+ }
+ },
"node_modules/tailwindcss": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.2.4.tgz",
@@ -5837,6 +9819,74 @@
"url": "https://opencollective.com/webpack"
}
},
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/test-exclude/node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/test-exclude/node_modules/brace-expansion": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz",
+ "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/test-exclude/node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz",
+ "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
"node_modules/tiny-inflate": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
@@ -5877,6 +9927,13 @@
"url": "https://github.com/sponsors/SuperchupuDev"
}
},
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
"node_modules/trim-lines": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
@@ -5897,6 +9954,19 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/ts-api-utils": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.12"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4"
+ }
+ },
"node_modules/tsconfck": {
"version": "3.1.6",
"resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz",
@@ -5924,6 +9994,81 @@
"license": "0BSD",
"optional": true
},
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-eslint": {
+ "version": "8.59.1",
+ "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.1.tgz",
+ "integrity": "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/eslint-plugin": "8.59.1",
+ "@typescript-eslint/parser": "8.59.1",
+ "@typescript-eslint/typescript-estree": "8.59.1",
+ "@typescript-eslint/utils": "8.59.1"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
+ }
+ },
"node_modules/ufo": {
"version": "1.6.4",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
@@ -6102,6 +10247,41 @@
"url": "https://opencollective.com/unified"
}
},
+ "node_modules/unrs-resolver": {
+ "version": "1.11.1",
+ "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
+ "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "dependencies": {
+ "napi-postinstall": "^0.3.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unrs-resolver"
+ },
+ "optionalDependencies": {
+ "@unrs/resolver-binding-android-arm-eabi": "1.11.1",
+ "@unrs/resolver-binding-android-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-arm64": "1.11.1",
+ "@unrs/resolver-binding-darwin-x64": "1.11.1",
+ "@unrs/resolver-binding-freebsd-x64": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-arm64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1",
+ "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-gnu": "1.11.1",
+ "@unrs/resolver-binding-linux-x64-musl": "1.11.1",
+ "@unrs/resolver-binding-wasm32-wasi": "1.11.1",
+ "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1",
+ "@unrs/resolver-binding-win32-x64-msvc": "1.11.1"
+ }
+ },
"node_modules/unstorage": {
"version": "1.17.5",
"resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.17.5.tgz",
@@ -6198,6 +10378,15 @@
}
}
},
+ "node_modules/unstorage/node_modules/lru-cache": {
+ "version": "11.3.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.3.5.tgz",
+ "integrity": "sha512-NxVFwLAnrd9i7KUBxC4DrUhmgjzOs+1Qm50D3oF1/oL+r1NpZ4gA7xvG0/zJ8evR7zIKn4vLf7qTNduWFtCrRw==",
+ "license": "BlueOak-1.0.0",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/update-browserslist-db": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
@@ -6228,6 +10417,31 @@
"browserslist": ">= 4.21.0"
}
},
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
"node_modules/vfile": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz",
@@ -6271,23 +10485,23 @@
}
},
"node_modules/vite": {
- "version": "8.0.10",
- "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz",
- "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==",
+ "version": "6.4.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz",
+ "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==",
"license": "MIT",
- "peer": true,
"dependencies": {
- "lightningcss": "^1.32.0",
- "picomatch": "^4.0.4",
- "postcss": "^8.5.10",
- "rolldown": "1.0.0-rc.17",
- "tinyglobby": "^0.2.16"
+ "esbuild": "^0.25.0",
+ "fdir": "^6.4.4",
+ "picomatch": "^4.0.2",
+ "postcss": "^8.5.3",
+ "rollup": "^4.34.9",
+ "tinyglobby": "^0.2.13"
},
"bin": {
"vite": "bin/vite.js"
},
"engines": {
- "node": "^20.19.0 || >=22.12.0"
+ "node": "^18.0.0 || ^20.0.0 || >=22.0.0"
},
"funding": {
"url": "https://github.com/vitejs/vite?sponsor=1"
@@ -6296,15 +10510,14 @@
"fsevents": "~2.3.3"
},
"peerDependencies": {
- "@types/node": "^20.19.0 || >=22.12.0",
- "@vitejs/devtools": "^0.1.0",
- "esbuild": "^0.27.0 || ^0.28.0",
+ "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0",
"jiti": ">=1.21.0",
- "less": "^4.0.0",
- "sass": "^1.70.0",
- "sass-embedded": "^1.70.0",
- "stylus": ">=0.54.8",
- "sugarss": "^5.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
"terser": "^5.16.0",
"tsx": "^4.8.1",
"yaml": "^2.4.2"
@@ -6313,18 +10526,15 @@
"@types/node": {
"optional": true
},
- "@vitejs/devtools": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
"jiti": {
"optional": true
},
"less": {
"optional": true
},
+ "lightningcss": {
+ "optional": true
+ },
"sass": {
"optional": true
},
@@ -6348,6 +10558,463 @@
}
}
},
+ "node_modules/vite/node_modules/@esbuild/aix-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz",
+ "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz",
+ "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz",
+ "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/android-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz",
+ "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz",
+ "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/darwin-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz",
+ "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/freebsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz",
+ "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz",
+ "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==",
+ "cpu": [
+ "arm"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz",
+ "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz",
+ "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-loong64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz",
+ "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==",
+ "cpu": [
+ "loong64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-mips64el": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz",
+ "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==",
+ "cpu": [
+ "mips64el"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-ppc64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz",
+ "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-riscv64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz",
+ "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==",
+ "cpu": [
+ "riscv64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-s390x": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz",
+ "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==",
+ "cpu": [
+ "s390x"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/linux-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz",
+ "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/netbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/netbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/openbsd-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz",
+ "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/openbsd-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz",
+ "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/openharmony-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz",
+ "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/sunos-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz",
+ "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-arm64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz",
+ "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==",
+ "cpu": [
+ "arm64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-ia32": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz",
+ "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/@esbuild/win32-x64": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz",
+ "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==",
+ "cpu": [
+ "x64"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/vite/node_modules/esbuild": {
+ "version": "0.25.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz",
+ "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.25.12",
+ "@esbuild/android-arm": "0.25.12",
+ "@esbuild/android-arm64": "0.25.12",
+ "@esbuild/android-x64": "0.25.12",
+ "@esbuild/darwin-arm64": "0.25.12",
+ "@esbuild/darwin-x64": "0.25.12",
+ "@esbuild/freebsd-arm64": "0.25.12",
+ "@esbuild/freebsd-x64": "0.25.12",
+ "@esbuild/linux-arm": "0.25.12",
+ "@esbuild/linux-arm64": "0.25.12",
+ "@esbuild/linux-ia32": "0.25.12",
+ "@esbuild/linux-loong64": "0.25.12",
+ "@esbuild/linux-mips64el": "0.25.12",
+ "@esbuild/linux-ppc64": "0.25.12",
+ "@esbuild/linux-riscv64": "0.25.12",
+ "@esbuild/linux-s390x": "0.25.12",
+ "@esbuild/linux-x64": "0.25.12",
+ "@esbuild/netbsd-arm64": "0.25.12",
+ "@esbuild/netbsd-x64": "0.25.12",
+ "@esbuild/openbsd-arm64": "0.25.12",
+ "@esbuild/openbsd-x64": "0.25.12",
+ "@esbuild/openharmony-arm64": "0.25.12",
+ "@esbuild/sunos-x64": "0.25.12",
+ "@esbuild/win32-arm64": "0.25.12",
+ "@esbuild/win32-ia32": "0.25.12",
+ "@esbuild/win32-x64": "0.25.12"
+ }
+ },
"node_modules/vitefu": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz",
@@ -6367,6 +11034,16 @@
}
}
},
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
"node_modules/web-namespaces": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/web-namespaces/-/web-namespaces-2.0.1.tgz",
@@ -6377,6 +11054,22 @@
"url": "https://github.com/sponsors/wooorm"
}
},
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
"node_modules/which-pm-runs": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
@@ -6386,18 +11079,173 @@
"node": ">=4"
}
},
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-styles": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz",
+ "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
"node_modules/xxhash-wasm": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/xxhash-wasm/-/xxhash-wasm-1.1.0.tgz",
"integrity": "sha512-147y/6YNh+tlp6nd/2pWq38i9h6mz/EuQ6njIrmW8D1BS5nCqs0P6DG+m6zTGnNz5I+uhZ0SHxBs9BsPrwcKDA==",
"license": "MIT"
},
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/yallist": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
"license": "ISC"
},
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/yargs-parser": {
"version": "22.0.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-22.0.0.tgz",
@@ -6407,6 +11255,61 @@
"node": "^20.19.0 || ^22.12.0 || >=23"
}
},
+ "node_modules/yargs/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==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/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==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": ">=12"
+ }
+ },
"node_modules/yocto-queue": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.2.2.tgz",
diff --git a/package.json b/package.json
index d166a11..09caac6 100644
--- a/package.json
+++ b/package.json
@@ -9,20 +9,30 @@
"dev": "astro dev",
"build": "astro build",
"preview": "astro preview",
- "astro": "astro"
+ "astro": "astro",
+ "lint": "eslint .",
+ "test": "jest --passWithNoTests",
+ "test-coverage": "jest --coverage --passWithNoTests"
},
"dependencies": {
"@astrojs/react": "^5.0.4",
"@tailwindcss/vite": "^4.2.4",
"@types/react": "^19.2.14",
"@types/react-dom": "^19.2.3",
- "astro": "^6.1.10",
+ "astro": "^6.2.0",
"dotenv": "^17.4.2",
"react": "^19.2.5",
"react-dom": "^19.2.5",
- "tailwindcss": "^4.2.4"
+ "tailwindcss": "^4.2.4",
+ "vite": "^6.4.2"
},
"devDependencies": {
- "@types/node": "^25.6.0"
+ "@eslint/js": "^10.0.1",
+ "@types/node": "^25.6.0",
+ "eslint": "^10.3.0",
+ "globals": "^17.6.0",
+ "jest": "^30.3.0",
+ "jiti": "^2.6.1",
+ "typescript-eslint": "^8.59.1"
}
}
diff --git a/src/components/AboutView.astro b/src/components/AboutView.astro
index ecd2cec..61a65f8 100644
--- a/src/components/AboutView.astro
+++ b/src/components/AboutView.astro
@@ -1,4 +1,4 @@
-
+
@@ -41,12 +41,12 @@
Säle
Vom klassischen Kinoraum bis zum IMAX-Erlebnis: Jeder Saal ist individuell abgestimmt auf Genre, Publikum und Stimmung.
- Mehr erfahren
+ Mehr erfahren
D-BOX Plätze
Synchronisierte Sitzbewegungen machen Action und Effekte physisch spürbar und verstärken die Immersion im Film.
- Mehr erfahren
+ Mehr erfahren
Technik
diff --git a/src/components/AccountView.astro b/src/components/AccountView.astro
index 94603a9..ccedee2 100644
--- a/src/components/AccountView.astro
+++ b/src/components/AccountView.astro
@@ -1,4 +1,4 @@
-
+
Mein Konto
@@ -43,3 +43,162 @@
+
+
diff --git a/src/components/BookingModal.astro b/src/components/BookingModal.astro
index de24660..6fb3994 100644
--- a/src/components/BookingModal.astro
+++ b/src/components/BookingModal.astro
@@ -41,3 +41,117 @@
Plätze bestätigen
+
+
+
+
diff --git a/src/components/CartView.astro b/src/components/CartView.astro
index eda767c..afd84f5 100644
--- a/src/components/CartView.astro
+++ b/src/components/CartView.astro
@@ -1,4 +1,4 @@
-
+
Dein Warenkorb
@@ -35,3 +35,169 @@
+
+
diff --git a/src/components/CheckoutView.astro b/src/components/CheckoutView.astro
index f0e49b1..13cac92 100644
--- a/src/components/CheckoutView.astro
+++ b/src/components/CheckoutView.astro
@@ -1,4 +1,4 @@
-
+
+
+
diff --git a/src/components/CollectorsView.astro b/src/components/CollectorsView.astro
index 73d068b..f5856d1 100644
--- a/src/components/CollectorsView.astro
+++ b/src/components/CollectorsView.astro
@@ -1,4 +1,4 @@
-
+
← Zur Startseite
Collectors Popcorn Specials
diff --git a/src/components/DboxView.astro b/src/components/DboxView.astro
index e6ed7bf..e9fc3b9 100644
--- a/src/components/DboxView.astro
+++ b/src/components/DboxView.astro
@@ -1,4 +1,4 @@
-
+
← Zur Startseite
D-BOX & Technik
diff --git a/src/components/HallsView.astro b/src/components/HallsView.astro
index 1ba9f09..5495184 100644
--- a/src/components/HallsView.astro
+++ b/src/components/HallsView.astro
@@ -1,4 +1,4 @@
-
+
← Zur Startseite
Unsere Säle
diff --git a/src/components/Hero.astro b/src/components/Hero.astro
index 084558a..3742ca4 100644
--- a/src/components/Hero.astro
+++ b/src/components/Hero.astro
@@ -8,3 +8,77 @@
+
+
diff --git a/src/components/HomeSection.astro b/src/components/HomeSection.astro
index 6fa03a6..bc6d101 100644
--- a/src/components/HomeSection.astro
+++ b/src/components/HomeSection.astro
@@ -24,7 +24,7 @@
Kino 1
Kino 2
- Mehr erfahren
+ Mehr erfahren
@@ -42,7 +42,7 @@
Spider Man
- Mehr erfahren
+ Mehr erfahren
@@ -51,8 +51,68 @@
Collectors Popcorn Specials
Präsentiere Sonderbecher und Eimer filmbezogen mit Bild, Logo und kurzem Text in einer lebendigen Timeline.
-
Mehr erfahren
+
Mehr erfahren
+
+
diff --git a/src/components/MovieListView.astro b/src/components/MovieListView.astro
index be9e8f1..ee940bd 100644
--- a/src/components/MovieListView.astro
+++ b/src/components/MovieListView.astro
@@ -1,19 +1,244 @@
---
+import {
+ timePatterns,
+ hallRotation,
+ weekdayShort,
+ type MovieInterface,
+ type ITMDBResponse,
+ type ITMDBMovie,
+} from "../scripts/bigConstants";
+
+async function getTopMovies(): Promise {
+ const API_KEY = import.meta.env.TMDB_API_KEY;
+ console.log("Fetching with Key:", API_KEY ? "Key found" : "KEY MISSING!");
+
+ const IMAGE_BASE_URL = "https://image.tmdb.org/t/p/w500";
+
+ // 1. Corrected "discover" spelling
+ const response = await fetch(
+ `https://api.themoviedb.org/3/discover/movie?api_key=${API_KEY}&language=de-DE&sort_by=popularity.desc`,
+ );
+ console.log("Response Status:", response.status);
+
+ const data: ITMDBResponse = await response.json();
+ console.log("Results found:", data.results?.length);
+
+ if (!data.results) return [];
+
+ return (data.results as ITMDBMovie[]).map((movie: ITMDBMovie) => ({
+ id: movie.id,
+ title: movie.title || "Unknown Title",
+ poster: movie.poster_path
+ ? `${IMAGE_BASE_URL}${movie.poster_path}`
+ : "/placeholder.jpg",
+ rating: movie.vote_average || 0,
+ // Add optional chaining (?.) and a fallback
+ year: movie.release_date?.split("-")[0] || "N/A",
+ genre: "Movie", // Discover doesn't provide the name, only an ID
+ duration: 120, // Discover doesn't provide duration
+ fsk: "12",
+ description: movie.overview || "No description available.",
+ backdrop: movie.backdrop_path
+ ? `${IMAGE_BASE_URL}${movie.backdrop_path}`
+ : "/placeholder.jpg",
+ }));
+}
+
+const formatDateShort = (dateObj: Date) => {
+ const day = String(dateObj.getDate()).padStart(2, "0");
+ const month = String(dateObj.getMonth() + 1).padStart(2, "0");
+ return `${day}.${month}.`;
+};
+
+const buildDayMeta = (offset: number) => {
+ const date = new Date();
+ date.setHours(0, 0, 0, 0);
+ date.setDate(date.getDate() + offset);
+
+ const weekday = weekdayShort[date.getDay()];
+ const formattedDate = formatDateShort(date);
+
+ if (offset === 0)
+ return {
+ offset,
+ date,
+ short: "Heute",
+ long: `Heute, ${formattedDate}`,
+ };
+ if (offset === 1)
+ return {
+ offset,
+ date,
+ short: "Morgen",
+ long: `Morgen, ${formattedDate}`,
+ };
+ return {
+ offset,
+ date,
+ short: weekday,
+ long: `${weekday}, ${formattedDate}`,
+ };
+};
+
+const buildScheduleForMovie = (movieIndex: number) => {
+ return Array.from({ length: 7 }, (_, dayOffset) => {
+ const dayMeta = buildDayMeta(dayOffset);
+ const pattern =
+ timePatterns[(movieIndex + dayOffset) % timePatterns.length];
+ const desiredCount = 4 + ((movieIndex + dayOffset) % 2);
+ const showCount = Math.min(pattern.length, desiredCount);
+
+ const showings = pattern
+ .slice(0, showCount)
+ .map((time: string, slotIndex: number) => {
+ const hall =
+ hallRotation[
+ (movieIndex + dayOffset + slotIndex) %
+ hallRotation.length
+ ];
+ return { time, hall };
+ });
+
+ return { ...dayMeta, showings };
+ });
+};
+
+let movieCatalog = await getTopMovies();
+const movieProgram = movieCatalog?.map((movie, movieIndex) => ({
+ ...movie,
+ schedule: buildScheduleForMovie(movieIndex),
+}));
+---
-const api_token = import.meta.env.TMDB_API_TOKEN;
-
-var api = await fetch("https://api.themoviedb.org/3/movie/11")
-var request = await api.json
-
----
-
-
+
Aktuelle Filme & Spielzeiten
-
Alle Filme mit 7 Tagen Spielplan. Erste Vorstellung täglich ab 13:00 Uhr.
-
{ api_token }
+
+ Alle Filme mit 7 Tagen Spielplan. Erste Vorstellung täglich ab 13:00
+ Uhr.
+
-
-
+
+ {
+ movieProgram?.map((movie, programIndex) => (
+
+
+
+
+ {movie.fsk}
+
+
+
+
+
{movie.description}
+
+
+ {movie.schedule.map((day, dayIndex) => (
+
+ {day.short}
+
+ {formatDateShort(day.date)}
+
+
+ ))}
+
+
+
+
+
+ {movie.schedule[0].showings.map(
+ (showing) => (
+
+
+ {movie.schedule[0].long}
+
+
+ {showing.hall}
+
+
+ {showing.time}
+
+
+ ),
+ )}
+
+
+
+
+ ))
+ }
+
+
+
diff --git a/src/components/Navbar.astro b/src/components/Navbar.astro
index 86cd442..8cc9406 100644
--- a/src/components/Navbar.astro
+++ b/src/components/Navbar.astro
@@ -1,12 +1,12 @@
- EAGLE's IMAX
+ EAGLE's IMAX
+
+
diff --git a/src/components/SnackPrompt.astro b/src/components/SnackPrompt.astro
index e9ffe10..7485edc 100644
--- a/src/components/SnackPrompt.astro
+++ b/src/components/SnackPrompt.astro
@@ -8,3 +8,19 @@
+
+
diff --git a/src/components/SnacksView.astro b/src/components/SnacksView.astro
index 683e6e8..d52a0d5 100644
--- a/src/components/SnacksView.astro
+++ b/src/components/SnacksView.astro
@@ -1,4 +1,4 @@
-
+
Snacks & Getränke
@@ -447,3 +447,71 @@
+
+
diff --git a/src/components/TechModal.astro b/src/components/TechModal.astro
index 17199c8..fac3ede 100644
--- a/src/components/TechModal.astro
+++ b/src/components/TechModal.astro
@@ -23,3 +23,33 @@
+
+
diff --git a/src/components/react/topbar.tsx b/src/components/react/topbar.tsx
deleted file mode 100644
index 438f02e..0000000
--- a/src/components/react/topbar.tsx
+++ /dev/null
@@ -1,8 +0,0 @@
-export default function topbar() {
- return (
-
- )
-}
\ No newline at end of file
diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro
new file mode 100644
index 0000000..43e2202
--- /dev/null
+++ b/src/layouts/BaseLayout.astro
@@ -0,0 +1,24 @@
+---
+import Navbar from "../components/Navbar.astro";
+import "../styles/global.css";
+
+interface Props {
+ title: string;
+}
+
+const { title } = Astro.props;
+---
+
+
+
+
+
+
+
+ {title} | EAGLE's IMAX
+
+
+
+
+
+
diff --git a/src/pages/about.astro b/src/pages/about.astro
new file mode 100644
index 0000000..e7a9ed9
--- /dev/null
+++ b/src/pages/about.astro
@@ -0,0 +1,12 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import AboutView from "../components/AboutView.astro";
+import TechModal from "../components/TechModal.astro";
+---
+
+
+
+
+
+
+
diff --git a/src/pages/account.astro b/src/pages/account.astro
new file mode 100644
index 0000000..0324347
--- /dev/null
+++ b/src/pages/account.astro
@@ -0,0 +1,10 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import AccountView from "../components/AccountView.astro";
+---
+
+
+
+
+
+
diff --git a/src/pages/cart.astro b/src/pages/cart.astro
new file mode 100644
index 0000000..ec6b8ca
--- /dev/null
+++ b/src/pages/cart.astro
@@ -0,0 +1,10 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import CartView from "../components/CartView.astro";
+---
+
+
+
+
+
+
diff --git a/src/pages/checkout.astro b/src/pages/checkout.astro
new file mode 100644
index 0000000..b304832
--- /dev/null
+++ b/src/pages/checkout.astro
@@ -0,0 +1,10 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import CheckoutView from "../components/CheckoutView.astro";
+---
+
+
+
+
+
+
diff --git a/src/pages/collectors.astro b/src/pages/collectors.astro
new file mode 100644
index 0000000..0d3b3d0
--- /dev/null
+++ b/src/pages/collectors.astro
@@ -0,0 +1,10 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import CollectorsView from "../components/CollectorsView.astro";
+---
+
+
+
+
+
+
diff --git a/src/pages/dbox.astro b/src/pages/dbox.astro
new file mode 100644
index 0000000..76eeb2a
--- /dev/null
+++ b/src/pages/dbox.astro
@@ -0,0 +1,10 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import DboxView from "../components/DboxView.astro";
+---
+
+
+
+
+
+
diff --git a/src/pages/halls.astro b/src/pages/halls.astro
new file mode 100644
index 0000000..274f429
--- /dev/null
+++ b/src/pages/halls.astro
@@ -0,0 +1,10 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import HallsView from "../components/HallsView.astro";
+---
+
+
+
+
+
+
diff --git a/src/pages/index.astro b/src/pages/index.astro
index 5a734b8..4b3947d 100644
--- a/src/pages/index.astro
+++ b/src/pages/index.astro
@@ -1,48 +1,10 @@
---
-import Navbar from "../components/Navbar.astro";
+import BaseLayout from "../layouts/BaseLayout.astro";
import Hero from "../components/Hero.astro";
import HomeSection from "../components/HomeSection.astro";
-import MovieListView from "../components/MovieListView.astro";
-import HallsView from "../components/HallsView.astro";
-import DboxView from "../components/DboxView.astro";
-import CollectorsView from "../components/CollectorsView.astro";
-import AboutView from "../components/AboutView.astro";
-import SnacksView from "../components/SnacksView.astro";
-import BookingModal from "../components/BookingModal.astro";
-import CartView from "../components/CartView.astro";
-import AccountView from "../components/AccountView.astro";
-import CheckoutView from "../components/CheckoutView.astro";
-import SnackPrompt from "../components/SnackPrompt.astro";
-import TechModal from "../components/TechModal.astro";
-import "../styles/global.css";
---
-
-
-
-
-
- EAGLE's IMAX | Deluxe Experience
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
diff --git a/src/pages/movieSelec.astro b/src/pages/movieSelec.astro
new file mode 100644
index 0000000..e69de29
diff --git a/src/pages/movies.astro b/src/pages/movies.astro
new file mode 100644
index 0000000..51cf002
--- /dev/null
+++ b/src/pages/movies.astro
@@ -0,0 +1,14 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import MovieListView from "../components/MovieListView.astro";
+import BookingModal from "../components/BookingModal.astro";
+import SnackPrompt from "../components/SnackPrompt.astro";
+---
+
+
+
+
+
+
+
+
diff --git a/src/pages/snacks.astro b/src/pages/snacks.astro
new file mode 100644
index 0000000..31db095
--- /dev/null
+++ b/src/pages/snacks.astro
@@ -0,0 +1,10 @@
+---
+import BaseLayout from "../layouts/BaseLayout.astro";
+import SnacksView from "../components/SnacksView.astro";
+---
+
+
+
+
+
+
diff --git a/src/scripts/account.ts b/src/scripts/account.ts
deleted file mode 100644
index 4f39041..0000000
--- a/src/scripts/account.ts
+++ /dev/null
@@ -1,474 +0,0 @@
-import type { User } from "./interfaces.js";
-
-function readStorageJson(key: string, fallbackValue: any) {
- const raw = localStorage.getItem(key);
-
- if (!raw || raw === "undefined" || raw === "null") {
- return fallbackValue;
- }
-
- try {
- return JSON.parse(raw);
- } catch (error) {
- console.warn(`Konnte LocalStorage-Wert fuer ${key} nicht lesen.`, error);
- return fallbackValue;
- }
-}
-
-function normalizeUser(user: User): User {
- return {
- firstName: user.firstName || "",
- lastName: user.lastName || "",
- email: user.email || "",
- hashedPassword: user.hashedPassword || "",
- orders: Array.isArray(user.orders) ? user.orders : [],
- paymentMethods: Array.isArray(user.paymentMethods) ? user.paymentMethods : []
- };
-}
-
-function escapeHtml(value: string) {
- return String(value || "")
- .replaceAll("&", "&")
- .replaceAll("<", "<")
- .replaceAll(">", ">")
- .replaceAll('"', """)
- .replaceAll("'", "'");
-}
-
-function formatEuro(value: string) {
- return `${Number(value || 0).toFixed(2).replace(".", ",")} EUR`;
-}
-
-function persistUsers() {
- localStorage.setItem("eagleUsers", JSON.stringify(users));
-}
-
-function persistCurrentUser() {
- if (currentUser) {
- localStorage.setItem("currentUser", JSON.stringify(currentUser));
- } else {
- localStorage.removeItem("currentUser");
- }
-}
-
-export let users = readStorageJson("eagleUsers", []);
-if (!Array.isArray(users)) {
- users = [];
-}
-users = users.map(normalizeUser).filter(Boolean);
-
-const rawCurrentUser = readStorageJson("currentUser", null);
-
-export var currentUser: User | null = rawCurrentUser ? normalizeUser(rawCurrentUser) : null;
-
-if (currentUser && currentUser.email) {
- const currentEmail = currentUser.email;
- const storedMatch = users.find((user: { email: string; }) => {
- return user.email === currentEmail;
- });
- if (storedMatch) {
- currentUser = storedMatch;
- } else {
- users.push(currentUser);
- persistUsers();
- }
-}
-
-async function hashMessage(message: string) {
- const msgBuffer = new TextEncoder().encode(message); // Encode as UTF-8
- const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer); // Hash
- const hashArray = Array.from(new Uint8Array(hashBuffer)); // Convert to bytes
- return hashArray.map(b => b.toString(16).padStart(2, '0')).join(''); // Hex string
-}
-
-function getInputValue(id: string): string {
- const el = document.getElementById(id) as HTMLInputElement | null;
- return el?.value.trim() ?? "";
-}
-
-export async function registerUser() {
-const firstName = getInputValue("reg-firstname");
-const lastName = getInputValue("reg-lastname");
-const email = getInputValue("reg-email").toLowerCase();
-const password = document.querySelector("#reg-password")?.value ?? "";
-
- if (!firstName || !lastName || !email || !password) {
- alert("Bitte fuelle alle Felder aus.");
- return;
- }
-
- if (!email.includes("@")) {
- alert("Bitte gib eine gueltige E-Mail-Adresse ein.");
- return;
- }
-
- const existingUser = users.find((user: User) => user.email.toLowerCase() === email);
- if (existingUser) {
- alert("E-Mail bereits registriert");
- return;
- }
-
- const hashedPassword = await hashMessage(password);
-
- const newUser = {
- firstName,
- lastName,
- email,
- hashedPassword,
- orders: [],
- paymentMethods: []
- };
-
- users.push(newUser);
- currentUser = newUser;
-
- persistUsers();
- persistCurrentUser();
-
- alert("Registrierung erfolgreich");
- document.getElementById("register-modal")?.classList.add("hidden");
-
- openAccountDashboard();
-}
-
-export async function loginUser() {
- const email = (document.querySelector("#login-email")?.value.trim() || "").toLowerCase();
- const password = document.querySelector("#login-password")?.value || "";
- const hashedPassword = await hashMessage(password);
-
- const user = users.find(
- (entry: User) => entry.email.toLowerCase() === email && entry.hashedPassword === hashedPassword
- );
-
- if (!user) {
- document.getElementById("login-error")?.classList.remove("hidden");
- return;
- }
-
- currentUser = user;
- persistCurrentUser();
- openAccountDashboard();
-}
-
-export function openAccountDashboard() {
- const accountView = document.getElementById("account-view");
- if (!accountView) {
- return;
- }
-
- if (!currentUser) {
- accountView.innerHTML = "Mein Konto Bitte melde dich an oder registriere dich.
";
- return;
- }
-
- accountView.innerHTML = /*html*/`
-
-
-
-
- Persönliche Daten
- Meine Bestellungen
- Zahlungsmethoden
-
-
-
-
- `;
-
- renderPersonalInfo();
-}
-
-function renderPersonalInfo() {
- const target = document.getElementById("account-tab-content");
- if (!target || !currentUser) {
- return;
- }
-
- target.innerHTML = `
-
-
Vorname: ${currentUser.firstName || "-"}
-
Nachname: ${currentUser.lastName || "-"}
-
E-Mail: ${currentUser.email || "-"}
-
- `;
-}
-
-function renderOrders() {
- const target = document.getElementById("account-tab-content");
- if (!target || !currentUser) {
- return;
- }
-
- const orders = Array.isArray(currentUser.orders) ? currentUser.orders : [];
-
- if (!orders.length) {
- target.innerHTML = `
-
-
Meine Bestellungen
-
Noch keine Bestellungen vorhanden.
-
- `;
- return;
- }
-
- const orderHtml = orders
- .map((order, index) => {
- const movieItems = Array.isArray(order.items)
- ? order.items.filter((item: any) => item.category === "movie")
- : [];
- const previewItem = movieItems[0] || (Array.isArray(order.items) ? order.items[0] : null);
- const previewTitle = previewItem?.title || "Bestellung";
- const ticketsCount = movieItems.length || (Array.isArray(order.items) ? order.items.length : 0);
-
- return `
-
-
-
${escapeHtml(previewTitle)}
- ${formatEuro(order.total || 0)}
-
- Datum: ${escapeHtml(order.date || "-")}
- Anzahl: ${ticketsCount}x
-
- `;
- })
- .join("");
-
- target.innerHTML = `
-
-
Meine Bestellungen
-
Klicke auf eine Bestellung, um dein Ticket-Detail zu sehen.
-
${orderHtml}
-
-
- `;
-
- const detailTarget = document.getElementById("order-ticket-details");
- const orderButtons = Array.from(target.querySelectorAll(".order-item-btn"));
-
- const renderOrderTicket = (orderIndex: number) => {
- const order = orders[orderIndex];
- if (!order || !detailTarget) {
- return;
- }
-
- const movieItems = Array.isArray(order.items)
- ? order.items.filter((item: any) => item.category === "movie")
- : [];
- const primaryMovie = movieItems[0] || (Array.isArray(order.items) ? order.items[0] : null);
- const poster = primaryMovie?.img || "";
- const seats = movieItems.map((item: any) => item.seatId).filter(Boolean).join(", ") || "-";
- const ticketCount = movieItems.length || (Array.isArray(order.items) ? order.items.length : 0);
- const hall = primaryMovie?.hall || "-";
- const time = primaryMovie?.time ? `${primaryMovie.time} Uhr` : "-";
-
- detailTarget.innerHTML = `
-
-
- ${poster
- ? `
`
- : `
Kein Poster
`}
-
-
-
EAGLE'S IMAX | Bestell-Details
-
${escapeHtml(primaryMovie?.title || "Bestellung")}
-
-
Datum ${escapeHtml(order.date || "-")}
-
Saal ${escapeHtml(hall)}
-
Uhrzeit ${escapeHtml(time)}
-
Tickets ${ticketCount}x
-
Sitze ${escapeHtml(seats)}
-
Gesamt ${formatEuro(order.total || 0)}
-
-
-
- `;
-
- detailTarget.classList.remove("hidden");
- orderButtons.forEach((button) => {
- button.classList.toggle("active", Number(button.dataset.orderIndex) === orderIndex);
- });
- };
-
- orderButtons.forEach((button) => {
- button.addEventListener("click", () => {
- const orderIndex = Number(button.dataset.orderIndex || -1);
- if (orderIndex >= 0) {
- renderOrderTicket(orderIndex);
- }
- });
- });
-
-}
-
-function renderPayments() {
- const target = document.getElementById("account-tab-content");
- if (!target || !currentUser) {
- return;
- }
-
- target.innerHTML = /*html*/`
-
-
Zahlungsmethoden
-
Platzhalter zum Hinterlegen deiner Logos oder Anbieter-Informationen.
-
-
-
-
-
- Visa / Mastercard
- Karteninformationen hinterlegen
-
-
-
-
-
- PayPal
- Konto verbinden
-
-
-
-
-
- Apple Pay
- Geraet freischalten
-
-
-
-
-
- Google Pay
- Wallet verknuepfen
-
-
-
-
-
-
-
×
-
-
-
Kreditkarte hinterlegen
-
-
-
Karte speichern
-
-
-
-
-
-
×
-
-
-
PayPal verbinden
-
-
Einloggen und dein PayPal-Konto mit deinem Kino-Account verbinden.
-
E-Mail
-
-
-
Passwort
-
-
-
Mit PayPal fortfahren
-
-
-
-
-
-
×
-
-
-
Apple Pay einrichten
-
-
Apple Pay wirkt schlicht, klar und fokussiert. Hinterlege hier die bevorzugte Karte für schnelle Zahlungen.
-
Apple-ID E-Mail
-
-
-
Bevorzugte Karte
-
-
-
Zu Wallet hinzufügen
-
-
-
-
-
-
×
-
-
-
Google Pay einrichten
-
-
Verbinde deine Wallet, damit zukünftige Bestellungen in wenigen Klicks abgeschlossen werden.
-
Google-Konto
-
-
-
Standard-Zahlungsquelle
-
-
-
Wallet verbinden
-
-
- `;
-
- const modals = Array.from(target.querySelectorAll(".pay-modal-overlay"));
- const triggers = Array.from(target.querySelectorAll(".account-pay-trigger"));
- const closeButtons = Array.from(target.querySelectorAll("[data-pay-close]"));
-
- const closeAllPaymentModals = () => {
- modals.forEach((modal) => modal.classList.add("hidden"));
- document.body.style.overflow = "auto";
- };
-
- triggers.forEach((trigger) => {
- trigger.addEventListener("click", () => {
- closeAllPaymentModals();
- const targetId = trigger.getAttribute("data-pay-modal");
- const modal = targetId ? target.querySelector(`#${targetId}`) : null;
-
- if (modal) {
- modal.classList.remove("hidden");
- document.body.style.overflow = "hidden";
- }
- });
- });
-
- closeButtons.forEach((button) => {
- button.addEventListener("click", closeAllPaymentModals);
- });
-
- modals.forEach((modal) => {
- modal.addEventListener("click", (event) => {
- if (event.target === modal) {
- closeAllPaymentModals();
- }
- });
- });
-}
-
-function logoutUser() {
- persistCurrentUser();
- window.location.reload();
-}
-
-(window as any).logoutUser = logoutUser;
-(window as any).renderPersonalInfo = renderPersonalInfo;
-(window as any).renderOrders = renderOrders;
-(window as any).renderPayments = renderPayments;
-
diff --git a/src/scripts/bigConstants.ts b/src/scripts/bigConstants.ts
new file mode 100644
index 0000000..c40e139
--- /dev/null
+++ b/src/scripts/bigConstants.ts
@@ -0,0 +1,108 @@
+export const prices: Record = { normal: 11.0, imax: 15.0, vip: 12.0, dbox: 16.0 };
+
+export const seatLayouts = {
+ "Kino 1": { rows: 6, left: 3, right: 7, vipRows: [5], dbox: [] },
+ "Kino 2": { rows: 7, left: 5, right: 5, vipRows: [6], dbox: [] },
+ "Deluxe 1": { rows: 10, left: 7, right: 8, vipRows: [9], dbox: [{ r: 4, c: 5, w: 4 }] },
+ IMAX: { rows: 15, left: 10, right: 10, vipRows: [], dbox: [], isImax: true }
+};
+
+export const movieCatalog = [
+ { title: "Zoomania 2", genre: "Animation", duration: 108, poster: "/img/Zoomania-2.jpg", backdrop: "/img/Zoomania-2.jpg", fsk: "0", description: "Die Fortsetzung des beliebten Animationsabenteuers." },
+ { title: "Der Austronaut", genre: "Sci-Fi", duration: 124, poster: "/img/derAustronaut.jpg", backdrop: "/img/derAustronaut.jpg", fsk: "12", description: "Ein einsamer Astronaut kämpft um sein Überleben." },
+ { title: "Spider-Man", genre: "Action", duration: 133, poster: "/img/spidermannewday.jpg", backdrop: "/img/spidermannewday.jpg", fsk: "12", description: "Ein neues Abenteuer des freundlichen Spinnenmanns." },
+ { title: "Scream VII", genre: "Horror", duration: 115, poster: "/img/screamvii.jpg", backdrop: "/img/screamvii.jpg", fsk: "18", description: "Ghostface ist zurück und gefährlicher als je zuvor." },
+ { title: "Gangster Gang 2", genre: "Animation", duration: 95, poster: "/img/gangstergang2.png", backdrop: "/img/gangstergang2.png", fsk: "6", description: "Die Gangster Gang ist wieder unterwegs." }
+];
+
+export const hallRotation = ["IMAX", "Deluxe 1", "Kino 1", "Kino 2"];
+
+export const timePatterns = [
+ ["13:00", "15:20", "17:40", "20:00", "22:20"],
+ ["13:00", "14:50", "17:10", "19:30", "21:50"],
+ ["13:00", "15:10", "17:30", "19:50", "22:10"],
+ ["13:00", "16:00", "18:20", "20:40"]
+];
+
+export const weekdayShort = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
+
+// Shared State
+export const cart: unknown[] = JSON.parse(typeof window !== 'undefined' ? (localStorage.getItem("eagleCart") || '[]') : '[]');
+export let occupiedSeatsData = JSON.parse(typeof window !== 'undefined' ? (localStorage.getItem("eagleOccupied") || '{}') : '{}');
+export const users: unknown[] = JSON.parse(typeof window !== 'undefined' ? (localStorage.getItem("eagleUsers") || '[]') : '[]');
+export let currentUser: unknown = JSON.parse(typeof window !== 'undefined' ? (localStorage.getItem("currentUser") || 'null') : 'null');
+
+export function updateCart(newCart: unknown[]) {
+ cart.splice(0, cart.length, ...newCart);
+ if (typeof window !== 'undefined') {
+ localStorage.setItem("eagleCart", JSON.stringify(cart));
+ }
+}
+
+export function updateOccupiedSeats(newData: unknown) {
+ occupiedSeatsData = newData;
+ if (typeof window !== 'undefined') {
+ localStorage.setItem("eagleOccupied", JSON.stringify(occupiedSeatsData));
+ }
+}
+
+export function emptyCart() {
+ cart.length = 0;
+ if (typeof window !== 'undefined') {
+ localStorage.setItem("eagleCart", JSON.stringify(cart));
+ }
+}
+
+export function persistUsers() {
+ if (typeof window !== 'undefined') localStorage.setItem("eagleUsers", JSON.stringify(users));
+}
+
+export function persistCurrentUser(user: unknown) {
+ currentUser = user;
+ if (typeof window !== 'undefined') {
+ if (currentUser) localStorage.setItem("currentUser", JSON.stringify(currentUser));
+ else localStorage.removeItem("currentUser");
+ }
+}
+
+export interface User {
+ firstName: string;
+ lastName: string;
+ email: string;
+ hashedPassword: string;
+ orders: unknown[];
+ paymentMethods: unknown[];
+}
+
+export interface MovieInterface {
+ id: number;
+ title: string;
+ genre: string;
+ duration: number;
+ fsk: string;
+ description: string;
+ poster: string;
+ backdrop: string;
+ rating: number;
+ year: string;
+}
+
+export interface ITMDBResponse {
+ page: number;
+ results: unknown[];
+ total_pages: number;
+ total_results: number;
+}
+
+export interface ITMDBMovie {
+ id: number;
+ title: string;
+ poster_path: string;
+ vote_average: number;
+ release_date: string;
+ genre_ids: number[];
+ runtime: number;
+ age_rating: string;
+ overview: string;
+ backdrop_path: string;
+}
\ No newline at end of file
diff --git a/src/scripts/bigConsts.ts b/src/scripts/bigConsts.ts
deleted file mode 100644
index fa8f087..0000000
--- a/src/scripts/bigConsts.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import type { MovieCatalog } from "./interfaces";
-// script will be removed since we switch to apis
-
-
-export const movieCatalog:MovieCatalog[] = [
- {
- title: "Zoomania 2",
- genre: "Animation",
- duration: 148,
- fsk: "6",
- description: "In Walt Disney Animation Studios’ \"Zoomania 2\" geraten die tierischen Detektive Judy Hopps und Nick Wilde auf die rätselhafte Spur eines geheimnisvollen Reptils, das in Zoomania auftaucht und die Metropole völlig auf den Kopf stellt: Gary De’Snake! ",
- poster: "img/Zoomania-2.jpg",
- backdrop: "img/Zoomania-2.jpg"
- },
- {
- title: "Shelter",
- genre: "Action, Abenteuer",
- duration: 147,
- fsk: "16",
- description: "Michael Mason, ein untergetauchter Elite-Agent, lebt auf einer abgelegenen Insel in Schottland. Als er in einem schweren Sturm ein Mädchen vor dem Ertrinken rettet, setzt er damit eine Kette von Ereignissen in Gang, die sein Versteck enttarnen und ihn zurück in die Welt zwingen. Dort muss er nicht nur um das Überleben der Teenagerin kämpfen, sondern sich auch den Dämonen seiner Vergangenheit stellen…",
- poster: "img/shelter.jpg",
- backdrop: "img/shelter.jpg"
- },
- {
- title: "Mutiny",
- genre: "Action, Abenteuer",
- duration: 0,
- fsk: "?",
- description: "Als sein milliardenschwerer Boss vor seinen Augen einem Mordkomplott zum Opfer fällt, wird Cole Reed (Jason Statham) für das Verbrechen verantwortlich gemacht. Im Bestreben dessen Tod zu rächen und die Täter zu überführen, gelangt Reed an Bord eines Frachters und stößt dabei auf eine internationale Verschwörung. Im Alleingang startet Cole eine gnadenlose Racheaktion auf hoher See…",
- poster: "img/mutiny.jpg",
- backdrop: "img/mutiny.jpg"
- }
- ];
\ No newline at end of file
diff --git a/src/scripts/booking.ts b/src/scripts/booking.ts
deleted file mode 100644
index 9c12878..0000000
--- a/src/scripts/booking.ts
+++ /dev/null
@@ -1,358 +0,0 @@
-import { seatLayouts, occupiedSeatsData, prices, cart } from "./main.js"
-import { renderCart, saveCart } from "./cart.js";
-import { renderCheckout } from "./checkout.js";
-
-let currentBookingContext: any = null;
-let currentHallLayout: any = null;
-
-export function openBooking(movie: string, hall: string, time: any) {
- const titleEl = document.getElementById("modal-movie-title");
- const infoEl = document.getElementById("modal-info-text");
-
- if (titleEl) {
- titleEl.innerText = movie;
- }
-
- if (infoEl) {
- infoEl.innerText = `${hall} • ${time} Uhr`;
- }
-
- currentBookingContext = { movie, hall, time };
-
- createSeats(hall, time);
- renderBookingLegend();
- updateBookingSummary();
-
- document.getElementById("booking-modal")?.classList.remove("hidden");
- }
-
-function getRowLabel(rowIndex: number) {
- return String(rowIndex + 1);
-}
-
-function buildHallLayout(hallName: string, baseConfig:any) {
- const rows = Number(baseConfig.rows || 0);
- const totalCols = Number(baseConfig.left || 0) + Number(baseConfig.right || 0);
- const isDeluxe = /deluxe/i.test(hallName);
-
- const left = isDeluxe
- ? Math.max(3, Number(baseConfig.left || 0) - 1)
- : Number(baseConfig.left || 0);
- const right = Math.max(0, totalCols - left);
-
- const vipRows = rows > 0 ? [rows] : [];
-
- const dboxMap = new Set();
- const markDboxRange = (rowNumber: number, startCol: number, width: number) => {
- if (!rowNumber || width <= 0) {
- return;
- }
-
- const maxCol = Math.min(totalCols, startCol + width - 1);
- for (let col = startCol; col <= maxCol; col++) {
- dboxMap.add(`${rowNumber}-${col}`);
- }
- };
-
- if (isDeluxe) {
- const configuredDboxSeats = Array.isArray(baseConfig.dbox)
- ? baseConfig.dbox.reduce((sum: number, section: any) => sum + Number(section.w || 0), 0)
- : 0;
-
- const totalDboxSeats = Math.max(4, configuredDboxSeats || 0);
-
- const firstRow = Math.max(1, rows - 2);
- const secondRow = Math.max(1, rows - 1);
- const targetRows = [firstRow, secondRow]
- .filter((rowNumber, index, arr) => arr.indexOf(rowNumber) === index)
- .filter((rowNumber) => !vipRows.includes(rowNumber));
-
- const rowCount = Math.max(1, targetRows.length);
- const seatsPerFirstRows = Math.ceil(totalDboxSeats / rowCount);
- let remaining = totalDboxSeats;
-
- targetRows.forEach((rowNumber, index) => {
- const seatsForRow = index === targetRows.length - 1
- ? remaining
- : Math.min(seatsPerFirstRows, remaining);
- remaining -= seatsForRow;
-
- const startCol = left + Math.max(1, Math.floor((right - seatsForRow) / 2) + 1);
- markDboxRange(rowNumber, startCol, seatsForRow);
- });
- } else if (Array.isArray(baseConfig.dbox)) {
- baseConfig.dbox.forEach((section: any) => {
- const rowNumber = Number(section.r || 0);
- const width = Number(section.w || 0);
- const startCol = Number(section.c || 0);
- markDboxRange(rowNumber, startCol, width);
- });
- }
-
- return {
- rows,
- left,
- right,
- totalCols,
- vipRows,
- dboxMap,
- isImax: Boolean(baseConfig.isImax)
- };
-}
-
-function getSeatType(layout: any, rowNumber: number, colNumber: number) {
- if (layout.dboxMap.has(`${rowNumber}-${colNumber}`)) {
- return "dbox";
- }
-
- if (layout.vipRows.includes(rowNumber)) {
- return "vip";
- }
-
- if (layout.isImax) {
- return "imax";
- }
-
- return "normal";
-}
-
-function createSeatElement({seatId, seatType, occupiedSeats }:any) {
- const seat = document.createElement("button");
- seat.type = "button";
- seat.classList.add("seat", seatType);
- seat.dataset.seatId = seatId;
- seat.dataset.type = seatType;
- seat.title = `${seatId} (${seatType.toUpperCase()})`;
-
- if (occupiedSeats.has(seatId)) {
- seat.classList.add("occupied");
- seat.disabled = true;
- seat.setAttribute("aria-label", `${seatId} belegt`);
- return seat;
- }
-
- seat.setAttribute("aria-label", `${seatId} frei`);
- seat.addEventListener("click", () => {
- seat.classList.toggle("selected");
- updateBookingSummary();
- });
-
- return seat;
-}
-
-function createSeats(hallName: string, time: any) {
- const seatGrid = document.getElementById("seat-grid");
- if (!seatGrid) {
- return;
- }
-
- seatGrid.innerHTML = "";
-
- const arrIndex = hallName as keyof typeof seatLayouts;
- const baseConfig: any = seatLayouts[arrIndex];
- if (!baseConfig) {
- currentHallLayout = null;
- return;
- }
-
- currentHallLayout = buildHallLayout(hallName, baseConfig);
-
- const occupiedKey = `${hallName}-${time}`;
- const occupiedSeats = new Set(Array.isArray(occupiedSeatsData?.[occupiedKey]) ? occupiedSeatsData[occupiedKey] : []);
-
- for (let rowIndex = 0; rowIndex < currentHallLayout.rows; rowIndex++) {
- const rowNumber = rowIndex + 1;
- const rowLabel = getRowLabel(rowIndex);
-
- const perspectiveFactor = (currentHallLayout.rows - rowNumber) / Math.max(currentHallLayout.rows - 1, 1);
- const rowIndent = Math.round(18 * perspectiveFactor);
-
- const row = document.createElement("div");
- row.className = "seat-row cinema-row";
- row.style.setProperty("--row-indent", `${rowIndent}px`);
-
- const leftLabel = document.createElement("div");
- leftLabel.className = "row-label";
- leftLabel.textContent = rowLabel;
-
- const rightLabel = document.createElement("div");
- rightLabel.className = "row-label row-label-right";
- rightLabel.textContent = rowLabel;
-
- const leftBlock = document.createElement("div");
- leftBlock.className = "row-seat-block left-block";
-
- const rightBlock = document.createElement("div");
- rightBlock.className = "row-seat-block right-block";
-
- for (let col = 1; col <= currentHallLayout.totalCols; col++) {
- const seatId = `R${rowNumber}-P${col}`;
- const seatType = getSeatType(currentHallLayout, rowNumber, col);
- const seat = createSeatElement({ seatId, seatType, occupiedSeats });
-
- if (col <= currentHallLayout.left) {
- leftBlock.appendChild(seat);
- } else {
- rightBlock.appendChild(seat);
- }
- }
-
- const aisle = document.createElement("div");
- aisle.className = "aisle-gap";
-
- row.append(leftLabel, leftBlock, aisle, rightBlock, rightLabel);
- seatGrid.appendChild(row);
- }
-}
-
-function renderBookingLegend() {
- const legend = document.getElementById("dynamic-legend");
- if (!legend || !currentHallLayout) {
- return;
- }
-
- const legendItems = [
- { type: "normal", label: "Standard" },
- { type: "selected", label: "Ausgewählt" },
- { type: "occupied", label: "Belegt" }
- ];
-
- if (currentHallLayout.isImax) {
- legendItems.unshift({ type: "imax", label: "IMAX" });
- }
-
- if (currentHallLayout.vipRows.length > 0) {
- legendItems.unshift({ type: "vip", label: "VIP" });
- }
-
- if (currentHallLayout.dboxMap.size > 0) {
- legendItems.unshift({ type: "dbox", label: "D-BOX" });
- }
-
- legend.innerHTML = legendItems
- .map((item) => `
-
-
- ${item.label}
-
- `)
- .join("");
-}
-
-function updateBookingSummary() {
- const selectedSeats = Array.from(document.querySelectorAll("#seat-grid .seat.selected")) as HTMLElement[];;
- const summaryPanel = document.getElementById("booking-summary");
- const summaryItems = document.getElementById("summary-items");
- const totalEl = document.getElementById("total-price");
-
- let total = 0;
-
- if (summaryItems) {
- summaryItems.innerHTML = selectedSeats
- .map((seat) => {
- const type = (seat.dataset.type || "normal") as keyof typeof prices;
- const seatPrice = Number(prices?.[type] ?? prices?.normal ?? 11);
- total += seatPrice;
-
- return `
-
- ${seat.dataset.seatId}
- ${seatPrice.toFixed(2).replace(".", ",")} EUR
-
- `;
- })
- .join("");
- } else {
- selectedSeats.forEach((seat) => {
- const type = seat.dataset.type || "normal";
- const seatPrice = Number(prices?.[type] ?? prices?.normal ?? 11);
- total += seatPrice;
- });
- }
-
- if (totalEl) {
- totalEl.innerText = `${total.toFixed(2).replace(".", ",")} EUR`;
- }
-
- summaryPanel?.classList.toggle("hidden", selectedSeats.length === 0);
-}
-
-function findMoviePoster(movieTitle: string) {
- const cards = Array.from(document.querySelectorAll(".movie-card, .detailed-card"));
- const normalizedTarget = String(movieTitle || "").trim().toLowerCase();
-
- for (const card of cards) {
- const currentCard = card.querySelector("h2, h3") as HTMLElement;
- const title = currentCard.innerText?.trim().toLowerCase();
- if (title === normalizedTarget) {
- const imageSrc = card.querySelector("img")?.src;
- if (imageSrc) {
- return imageSrc;
- }
- }
- }
-
- return "";
-}
-
-function confirmSelectedSeats() {
- const selectedSeats = Array.from(document.querySelectorAll("#seat-grid .seat.selected")) as HTMLElement[];
-
- if (!currentBookingContext || selectedSeats.length === 0) {
- alert("Bitte waehle mindestens einen Platz aus.");
- return;
- }
-
- const moviePoster = findMoviePoster(currentBookingContext.movie);
- const addedSeats = [];
-
- selectedSeats.forEach((seat) => {
- const seatId = seat.dataset.seatId;
- const seatType = seat.dataset.type || "normal";
-
- const alreadyInCart = cart.some((item: any) =>
- item.category === "movie" &&
- item.title === currentBookingContext.movie &&
- item.hall === currentBookingContext.hall &&
- item.time === currentBookingContext.time &&
- item.seatId === seatId
- );
-
- if (alreadyInCart) {
- return;
- }
-
- cart.push({
- id: Date.now() + Math.random(),
- category: "movie",
- title: currentBookingContext.movie,
- hall: currentBookingContext.hall,
- time: currentBookingContext.time,
- seatId,
- type: seatType.toUpperCase(),
- price: Number(prices?.[seatType] ?? prices?.normal ?? 11),
- img: moviePoster
- });
-
- addedSeats.push(seatId);
- });
-
- if (!addedSeats.length) {
- alert("Diese Plaetze sind bereits im Warenkorb.");
- return;
- }
-
- saveCart?.();
- renderCart?.();
- renderCheckout?.();
-
- document.getElementById("booking-modal")?.classList.add("hidden");
-
- const snackOverlay = document.getElementById("snack-prompt-overlay");
- snackOverlay?.classList.remove("hidden");
- document.body.style.overflow = "hidden";
-}
-
-document.addEventListener("DOMContentLoaded", () => {
- document.getElementById("btn-confirm-seats")?.addEventListener("click", confirmSelectedSeats);
-});
diff --git a/src/scripts/cart.ts b/src/scripts/cart.ts
deleted file mode 100644
index a81c934..0000000
--- a/src/scripts/cart.ts
+++ /dev/null
@@ -1,203 +0,0 @@
-import { cart } from "./main.js";
-
-function formatEuro(value: number) {
- return `${Number(value || 0).toFixed(2).replace(".", ",")} EUR`;
-}
-
-function escapeHtml(value: any) {
- return String(value || "")
- .replaceAll("&", "&")
- .replaceAll("<", "<")
- .replaceAll(">", ">")
- .replaceAll('"', """)
- .replaceAll("'", "'");
-}
-
-function buildCartKey(item: { category: string; seatId: any; hall: any; time: any; title: any; }) {
- const infoText = item.category === "movie"
- ? `Sitz: ${item.seatId} (${item.hall})`
- : item.time;
- return `${item.title}-${item.hall}-${infoText}`;
-}
-
-function isDrinkItem(item: { category: string; title: any; hall: any; }) {
- if (item.category !== "snack") {
- return false;
- }
-
- const title = String(item.title || "").toLowerCase();
- const size = String(item.hall || "").toLowerCase();
- const drinkKeywords = [
- "cola",
- "sprite",
- "fanta",
- "mezzo",
- "fuze",
- "wasser",
- "getraenk",
- "drink"
- ];
-
- return drinkKeywords.some((word) => title.includes(word)) || size.includes("l");
-}
-
-function buildItemInfo(item: { category: any; seatId?: any; hall: any; time?: any; title: any; }) {
- if (item.category === "movie") {
- return `
- Sitzplatz: ${escapeHtml(item.seatId || "-")}
- Saal: ${escapeHtml(item.hall || "-")}
- Uhrzeit: ${escapeHtml(item.time || "-")} Uhr
- `;
- }
-
- if (isDrinkItem(item)) {
- return `
- Variante: ${escapeHtml(item.time || "-")}
- Groesse: ${escapeHtml(item.hall || "-")}
- `;
- }
-
- return `
- Kategorie: Snack
- Variante: ${escapeHtml(item.time || "-")}
- Groesse: ${escapeHtml(item.hall || "-")}
- `;
-}
-
-function groupCartItems() {
- const groups = new Map();
-
- cart.forEach((item: { price?: any; category: string; seatId: any; hall: any; time: any; title: any; }) => {
- const key = buildCartKey(item);
-
- if (!groups.has(key)) {
- groups.set(key, {
- key,
- quantity: 0,
- total: 0,
- item
- });
- }
-
- const group = groups.get(key);
- group.quantity += 1;
- group.total += Number(item.price || 0);
- });
-
- return Array.from(groups.values());
-}
-
-export function saveCart() {
- localStorage.setItem("eagleCart", JSON.stringify(cart));
- updateCartBadge();
-}
-
-export function updateCartBadge() {
- const cartBadge = document.getElementById("cart-badge");
-
- if (!cartBadge) {
- return;
- }
-
- cartBadge.innerText = cart.length;
- cartBadge.classList.toggle("hidden", cart.length === 0);
-}
-
-export function renderCart() {
- const cartList = document.getElementById("cart-items-list");
- const totalEl = document.getElementById("cart-total-right");
- const vatEl = document.getElementById("cart-vat-right");
-
- if (!cartList || !totalEl || !vatEl) {
- return;
- }
-
- if (!Array.isArray(cart) || cart.length === 0) {
- cartList.innerHTML = 'Dein Warenkorb ist leer.
';
- totalEl.innerText = formatEuro(0);
- vatEl.innerText = `inkl. 19% MwSt: ${formatEuro(0)}`;
- return;
- }
-
- const groupedItems = groupCartItems();
-
- const header = /*html*/`
-
- `;
-
- const rows = groupedItems
- .map((group) => {
- const imageHtml = group.item.img
- ? /*html*/` `
- : /*html*/`Kein Bild
`;
- const quantityHtml = group.item.category === "movie"
- ? /*html*/`${group.quantity}x
`
- : /*html*/`
-
- -
- ${group.quantity}
- +
-
- `;
-
- return /*html*/`
-
-
- ${quantityHtml}
-
-
${imageHtml}
-
${escapeHtml(group.item.title)}
-
${buildItemInfo(group.item)}
-
${formatEuro(group.total)}
-
- 🗑️
-
-
- `;
- })
- .join("");
-
- cartList.innerHTML = header + rows;
-
- const total = cart.reduce((sum, item) => sum + Number(item.price || 0), 0);
- const vat = total - total / 1.19;
-
- totalEl.innerText = formatEuro(total);
- vatEl.innerText = `inkl. 19% MwSt: ${formatEuro(vat)}`;
-
- saveCart();
-}
-//@ts-ignore
-window.removeItem = function removeItem(id: any) {
- var localCart = cart.filter((item: { id: any; }) => item.id !== id);
- saveCart();
- renderCart();
-};
-
-//@ts-ignore
-window.changeQty = function changeQty(title, delta): void {
- if (delta > 0) {
- const item = cart.find((entry: { title: any; }) => entry.title === title);
- if (item) {
- cart.push({ ...item, id: Date.now() + Math.random() });
- }
- } else {
- const index = cart
- .map((entry: { title: any; }) => entry.title)
- .lastIndexOf(title);
- if (index !== -1) {
- cart.splice(index, 1);
- }
- }
-
- saveCart();
- renderCart();
-};
-
diff --git a/src/scripts/checkout.ts b/src/scripts/checkout.ts
deleted file mode 100644
index 2c7c58b..0000000
--- a/src/scripts/checkout.ts
+++ /dev/null
@@ -1,238 +0,0 @@
-import { currentUser, users } from "./account.js";
-import { renderCart, saveCart } from "./cart.js";
-import { cart, emptyCart, occupiedSeatsData } from "./main.js";
-
-function formatCheckoutEuro(value: number) {
- return `${Number(value || 0).toFixed(2).replace(".", ",")} EUR`;
-}
-
-let selectedPaymentMethod = "";
-let checkoutEventsBound = false;
-
-function setCheckoutStep(step: number) {
- const step1 = document.getElementById("checkout-step-1");
- const step2 = document.getElementById("checkout-step-2");
- const step3 = document.getElementById("checkout-step-3");
-
- step1?.classList.toggle("hidden", step !== 1);
- step2?.classList.toggle("hidden", step !== 2);
- step3?.classList.toggle("hidden", step !== 3);
-
- const line1 = document.getElementById("line-1");
- const line2 = document.getElementById("line-2");
- const indicator1 = document.getElementById("step-1-indicator");
- const indicator2 = document.getElementById("step-2-indicator");
- const indicator3 = document.getElementById("step-3-indicator");
-
- indicator1?.classList.add("active");
- indicator2?.classList.toggle("active", step >= 2);
- indicator3?.classList.toggle("active", step >= 3);
- line1?.classList.toggle("active", step >= 2);
- line2?.classList.toggle("active", step >= 3);
-}
-
-export function renderCheckout() {
- const summaryList = document.getElementById("checkout-summary-list");
- const totalDisplay = document.getElementById("checkout-total-display");
- const vatDisplay = document.getElementById("checkout-vat-display");
- const nextButton = document.getElementById("btn-next-step-2");
-
- if (!summaryList) {
- return;
- }
-
- summaryList.innerHTML = "";
-
- const safeCart = Array.isArray(cart) ? cart : [];
- const total = safeCart.reduce((sum, item) => sum + Number(item.price || 0), 0);
- const vat = total - total / 1.19;
-
- safeCart.forEach((item) => {
- const row = document.createElement("div");
- row.style.cssText = "display:flex; justify-content:space-between; gap:12px; margin-bottom:10px; font-size:0.95rem;";
-
- const infoText = item.category === "movie"
- ? `Sitz ${item.seatId || "-"} | ${item.hall || "-"} | ${item.time || "-"} Uhr`
- : `${item.time || "Standard"} | ${item.hall || "-"}`;
-
- row.innerHTML = `${item.title} (${infoText}) ${formatCheckoutEuro(item.price)} `;
- summaryList.appendChild(row);
- });
-
- if (totalDisplay) {
- totalDisplay.innerText = `Gesamtbetrag: ${formatCheckoutEuro(total)}`;
- }
-
- if (vatDisplay) {
- vatDisplay.innerText = `inkl. 19% MwSt: ${formatCheckoutEuro(vat)}`;
- }
-
- selectedPaymentMethod = "";
- document.querySelectorAll(".payment-method").forEach((method) => {
- method.classList.remove("selected");
- });
-
- nextButton?.classList.add("hidden");
- setCheckoutStep(1);
-}
-
-function generateTicket() {
- const ticketContainer = document.getElementById("ticket-container");
- if (!ticketContainer) {
- return;
- }
-
- const moviesInCart = (Array.isArray(cart) ? cart : []).filter((item) => item.category === "movie");
- if (!moviesInCart.length) {
- ticketContainer.innerHTML = "Danke fuer deinen Einkauf!
";
- return;
- }
-
- const mainMovie = moviesInCart[0];
- const matchingMovieSeats = moviesInCart
- .filter((item) => item.title === mainMovie.title && item.time === mainMovie.time)
- .map((item) => item.seatId)
- .join(", ");
-
- const qrData = encodeURIComponent(`EAGLE-IMAX|${mainMovie.title}|${mainMovie.hall}|${matchingMovieSeats}`);
- const qrUrl = `https://api.qrserver.com/v1/create-qr-code/?size=150x150&data=${qrData}&bgcolor=ffffff`;
-
- ticketContainer.innerHTML = /*html*/`
-
-
-
-
-
-
EAGLE'S IMAX PREMIUM
-
${mainMovie.title}
-
-
SAAL ${mainMovie.hall}
-
ZEIT ${mainMovie.time} Uhr
-
SITZE ${matchingMovieSeats || "-"}
-
-
-
-
- `;
-}
-
-function saveOrderForCurrentUser(orderItems: any[], orderTotal: any) {
- if (typeof currentUser === "undefined" || !currentUser) {
- return;
- }
-
- if (typeof users === "undefined" || !Array.isArray(users)) {
- return;
- }
-
- const order = {
- date: new Date().toLocaleString("de-DE"),
- items: orderItems,
- total: orderTotal,
- paymentMethod: selectedPaymentMethod || "-"
- };
-
- //@ts-ignore
- const userIndex = users.findIndex((entry) => entry.email === currentUser.email);
- if (userIndex === -1) {
- return;
- }
-
- if (!Array.isArray(users[userIndex].orders)) {
- users[userIndex].orders = [];
- }
-
- users[userIndex].orders.push(order);
- localStorage.setItem("eagleUsers", JSON.stringify(users));
-}
-
-function reserveSeatsAfterPayment(orderItems: any[]) {
- const movieItems = orderItems.filter((item) => item.category === "movie");
-
- movieItems.forEach((item) => {
- const key = `${item.hall}-${item.time}`;
- if (!occupiedSeatsData[key]) {
- occupiedSeatsData[key] = [];
- }
-
- occupiedSeatsData[key].push(item.seatId);
- });
-
- localStorage.setItem("eagleOccupied", JSON.stringify(occupiedSeatsData));
-}
-
-function completeCheckout() {
- const orderItems = Array.isArray(cart) ? [...cart] : [];
- const orderTotal = orderItems.reduce((sum, item) => sum + Number(item.price || 0), 0);
-
- saveOrderForCurrentUser(orderItems, orderTotal);
- reserveSeatsAfterPayment(orderItems);
-
- emptyCart?.()
- saveCart?.();
- renderCart?.();
-}
-
-function bindCheckoutEvents() {
- if (checkoutEventsBound) {
- return;
- }
-
- checkoutEventsBound = true;
-
- const nextButton = document.getElementById("btn-next-step-2");
- const backButton = document.getElementById("btn-back-to-step1");
- const payNowButton = document.getElementById("btn-pay-now") as HTMLButtonElement;
-
- document.querySelectorAll(".payment-method").forEach((method) => {
- method.addEventListener("click", () => {
- document.querySelectorAll(".payment-method").forEach((entry) => {
- entry.classList.remove("selected");
- });
-
- method.classList.add("selected");
- //@ts-ignore
- selectedPaymentMethod = method.dataset.method || "";
- nextButton?.classList.remove("hidden");
- });
- });
-
- nextButton?.addEventListener("click", () => {
- if (!selectedPaymentMethod) {
- alert("Bitte waehle zuerst eine Zahlungsmethode aus.");
- return;
- }
-
- setCheckoutStep(2);
- });
-
- backButton?.addEventListener("click", () => {
- setCheckoutStep(1);
- });
-
- payNowButton?.addEventListener("click", () => {
- if (!Array.isArray(cart) || !cart.length) {
- alert("Dein Warenkorb ist leer.");
- return;
- }
-
- payNowButton.disabled = true;
- payNowButton.innerText = "Verarbeite...";
- payNowButton.style.opacity = "0.7";
-
- setTimeout(() => {
- setCheckoutStep(3);
- generateTicket();
- completeCheckout();
-
- payNowButton.disabled = false;
- payNowButton.innerText = "Jetzt Bezahlen";
- payNowButton.style.opacity = "1";
- }, 1200);
- });
-}
-
-document.addEventListener("DOMContentLoaded", bindCheckoutEvents);
diff --git a/src/scripts/interfaces.ts b/src/scripts/interfaces.ts
deleted file mode 100644
index 5254fce..0000000
--- a/src/scripts/interfaces.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-export interface User {
- firstName: string;
- lastName: string;
- email: string;
- hashedPassword: string;
- orders: any[]; // TODO: figure out proper array type of orders. Probably smartest do create an Order interface which this would be an array of
- paymentMethods: any[]; // TODO: figure out proper array type of paymentMethods. create paymentMethod interface and make this an array of it
-}
-
-export interface MovieCatalog {
- title: string;
- genre: string;
- duration: number;
- fsk: string;
- description: string;
- poster: string;
- backdrop: string;
-}
diff --git a/src/scripts/main.ts b/src/scripts/main.ts
deleted file mode 100644
index 75e7af9..0000000
--- a/src/scripts/main.ts
+++ /dev/null
@@ -1,851 +0,0 @@
-import { currentUser, loginUser, openAccountDashboard, registerUser } from "./account.js";
-import { openBooking } from "./booking.js";
-import { renderCart, saveCart, updateCartBadge } from "./cart.js";
-import { renderCheckout } from "./checkout.js";
-import { movieCatalog } from "./bigConsts.js";
-
-// Shared app state for legacy script files (account.js, booking.js, cart.js, checkout.js)
-export const prices: Record = { normal: 11.0, imax: 15.0, vip: 12.0, dbox: 16.0 };
-export var seatLayouts = {
- "Kino 1": { rows: 6, left: 3, right: 7, vipRows: [5], dbox: [] },
- "Kino 2": { rows: 7, left: 5, right: 5, vipRows: [6], dbox: [] },
- "Deluxe 1": { rows: 10, left: 7, right: 8, vipRows: [9], dbox: [{ r: 4, c: 5, w: 4 }] },
- IMAX: { rows: 15, left: 10, right: 10, vipRows: [], dbox: [], isImax: true }
-};
-export var cart:any[] = JSON.parse(localStorage.getItem("eagleCart") || '[]');
-export var occupiedSeatsData = JSON.parse(localStorage.getItem("eagleOccupied") || '{}');
-
-document.addEventListener("DOMContentLoaded", () => {
- const views = {
- hero: document.querySelector(".hero"),
- moviesGrid: document.getElementById("movies-grid-section"),
- list: document.getElementById("movie-list-view"),
- halls: document.getElementById("halls-view"),
- dbox: document.getElementById("dbox-view"),
- collectors: document.getElementById("collectors-view"),
- about: document.getElementById("about-view"),
- snacks: document.getElementById("snacks-view"),
- cart: document.getElementById("cart-view"),
- checkout: document.getElementById("checkout-view"),
- account: document.getElementById("account-view")
- };
-
- const ui = {
- logo: document.getElementById("logo-home"),
- linkFilme: document.getElementById("link-filme"),
- linkSnacks: document.getElementById("link-snacks"),
- linkAbout: document.getElementById("link-about"),
- linkCart: document.getElementById("link-cart"),
- linkAccount: document.getElementById("link-account"),
- themeToggle: document.getElementById("theme-toggle"),
- heroBookingBtn: document.getElementById("hero-booking-btn"),
- heroSlider: document.getElementById("hero-slider"),
- heroDots: document.getElementById("hero-dots"),
- heroTitle: document.getElementById("hero-title"),
- heroText: document.getElementById("hero-text"),
- nowRunningRow: document.getElementById("now-running-row"),
- movieProgramList: document.getElementById("movie-program-list"),
- checkoutBtn: document.getElementById("btn-checkout-final"),
- backHomeBtn: document.getElementById("btn-back-home"),
- snacksView: document.getElementById("snacks-view"),
- snackOverlay: document.getElementById("snack-prompt-overlay"),
- btnYesSnacks: document.getElementById("btn-yes-snacks"),
- btnNoCart: document.getElementById("btn-no-cart"),
- bookingModal: document.getElementById("booking-modal"),
- closeBookingModalBtn: document.querySelector(".close-btn")
- };
-
- const checkoutSteps = {
- one: document.getElementById("checkout-step-1"),
- two: document.getElementById("checkout-step-2"),
- three: document.getElementById("checkout-step-3")
- };
-
- const hallRotation = ["IMAX", "Deluxe 1", "Kino 1", "Kino 2"];
- const timePatterns = [
- ["13:00", "15:20", "17:40", "20:00", "22:20"],
- ["13:00", "14:50", "17:10", "19:30", "21:50"],
- ["13:00", "15:10", "17:30", "19:50", "22:10"],
- ["13:00", "16:00", "18:20", "20:40"]
- ];
-
- let movieProgram: any = []; // TODO: Find type
- let heroItems: any = []; // TODO: find Type
- let heroIndex = 0;
- let heroTimer:any = null; // TODO: find type
-
- const weekdayShort = ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"];
-
- const hideAllViews = () => {
- Object.values(views).forEach((view) => view?.classList.add("hidden"));
- document.getElementById("about-tech-modal")?.classList.add("hidden");
- document.body.style.overflow = "auto";
- };
-
- const showHome = () => {
- hideAllViews();
- views.hero?.classList.remove("hidden");
- views.moviesGrid?.classList.remove("hidden");
- document.getElementById("about-tech-modal")?.classList.add("hidden");
- document.body.style.overflow = "auto";
- window.scrollTo({ top: 0, behavior: "smooth" });
- };
-
- const showMovieList = (programIndexToFocus:number = NaN) => {
- hideAllViews();
- views.list?.classList.remove("hidden");
-
- if (programIndexToFocus === null) {
- window.scrollTo({ top: 0, behavior: "smooth" });
- return;
- }
-
- const target = views.list?.querySelector(`[data-program-index="${programIndexToFocus}"]`);
- if (target) {
- target.scrollIntoView({ behavior: "smooth", block: "start" });
- target.classList.add("flash-focus");
- setTimeout(() => target.classList.remove("flash-focus"), 1200);
- }
- };
-
- const showStaticView = (viewElement: HTMLElement) => {
- if (!viewElement) {
- return;
- }
-
- hideAllViews();
- viewElement.classList.remove("hidden");
- window.scrollTo({ top: 0, behavior: "smooth" });
- };
-
- const showCheckoutStart = () => {
- if (!cart.length) {
- alert("Dein Warenkorb ist leer.");
- return;
- }
-
- hideAllViews();
- views.checkout?.classList.remove("hidden");
- checkoutSteps.one?.classList.remove("hidden");
- checkoutSteps.two?.classList.add("hidden");
- checkoutSteps.three?.classList.add("hidden");
- renderCheckout?.();
- window.scrollTo(0, 0);
- };
-
- const closeBookingModal = () => {
- ui.bookingModal?.classList.add("hidden");
- };
-
- const escapeHtml = (value: string) => String(value || "")
- .replaceAll("&", "&")
- .replaceAll("<", "<")
- .replaceAll(">", ">")
- .replaceAll('"', """)
- .replaceAll("'", "'");
-
- const formatDateShort = (dateObj: any) => {
- const day = String(dateObj.getDate()).padStart(2, "0");
- const month = String(dateObj.getMonth() + 1).padStart(2, "0");
- return `${day}.${month}.`;
- };
-
- const buildDayMeta = (offset: number) => {
- const date = new Date();
- date.setHours(0, 0, 0, 0);
- date.setDate(date.getDate() + offset);
-
- const weekday = weekdayShort[date.getDay()];
- const formattedDate = formatDateShort(date);
-
- if (offset === 0) {
- return {
- offset,
- date,
- short: "Heute",
- long: `Heute, ${formattedDate}`
- };
- }
-
- if (offset === 1) {
- return {
- offset,
- date,
- short: "Morgen",
- long: `Morgen, ${formattedDate}`
- };
- }
-
- return {
- offset,
- date,
- short: weekday,
- long: `${weekday}, ${formattedDate}`
- };
- };
-
- const buildScheduleForMovie = (movieIndex: number) => {
- return Array.from({ length: 7 }, (_, dayOffset) => {
- const dayMeta = buildDayMeta(dayOffset);
- const pattern = timePatterns[(movieIndex + dayOffset) % timePatterns.length] || "Error reading";
- const desiredCount = 4 + ((movieIndex + dayOffset) % 2);
- const showCount = Math.min(pattern.length, desiredCount);
-
- //@ts-ignore
- const showings = pattern.slice(0, showCount).map((time: any, slotIndex: number) => { // TODO: fix map issue
- const hall = hallRotation[(movieIndex + dayOffset + slotIndex) % hallRotation.length];
- return { time, hall };
- });
-
- return {
- ...dayMeta,
- showings
- };
- });
- };
-
- const buildMovieProgram = () => {
- //@ts-ignore
- movieProgram = movieCatalog.map((movie: any, movieIndex: number) => ({
- ...movie,
- schedule: buildScheduleForMovie(movieIndex)
- }));
- heroItems = movieProgram.slice(0, 5);
- };
-
- const setHeroSlide = (index: number) => {
- if (!heroItems.length || !ui.heroSlider) {
- return;
- }
-
- heroIndex = (index + heroItems.length) % heroItems.length;
-
- ui.heroSlider.querySelectorAll(".hero-slide").forEach((slide, slideIndex) => {
- slide.classList.toggle("active", slideIndex === heroIndex);
- });
-
- ui.heroDots?.querySelectorAll(".hero-dot").forEach((dot, dotIndex) => {
- dot.classList.toggle("active", dotIndex === heroIndex);
- });
-
- const activeMovie = heroItems[heroIndex];
- if (ui.heroTitle) {
- ui.heroTitle.textContent = activeMovie.title;
- }
- if (ui.heroText) {
- ui.heroText.textContent = `${activeMovie.genre} • ${activeMovie.duration} Min. • Heute erste Vorstellung um 13:00 Uhr.`;
- }
- };
-
- const renderHero = () => {
- if (!ui.heroSlider || !heroItems.length) {
- return;
- }
-
- ui.heroSlider.innerHTML = heroItems.map((movie: any, index: number) => `
-
- `).join("");
-
- if (ui.heroDots) {
- ui.heroDots.innerHTML = heroItems.map((_:any, index: number) => `
-
- `).join("");
-
- ui.heroDots.addEventListener("click", (event: any) => {
- const dotTarget = event.target || 0;
- const dot = dotTarget.closest(".hero-dot");
- if (!dot) {
- return;
- }
-
- const nextIndex = Number(dot.dataset.heroIndex || 0);
- setHeroSlide(nextIndex);
-
- if (heroTimer) {
- clearInterval(heroTimer);
- heroTimer = setInterval(() => setHeroSlide(heroIndex + 1), 6500);
- }
- });
- }
-
- setHeroSlide(0);
-
- if (heroTimer) {
- clearInterval(heroTimer);
- }
-
- heroTimer = setInterval(() => {
- setHeroSlide(heroIndex + 1);
- }, 6500);
- };
-
- const renderNowRunningRow = () => {
- if (!ui.nowRunningRow) {
- return;
- }
-
- // TODO: implement movie interface
- ui.nowRunningRow.innerHTML = movieProgram.map((movie: any, index: number) => /*html*/`
-
-
-
-
- `).join("");
- };
-
- const renderScheduleRows = (programIndex: number, dayIndex: number) => {
- const movie = movieProgram[programIndex];
- if (!movie) {
- return;
- }
-
- const day = movie.schedule[dayIndex];
- const body = document.getElementById(`schedule-body-${programIndex}`);
- if (!body || !day) {
- return;
- }
-
- body.innerHTML = day.showings.map((showing: { hall: string; time: string; }) => /*html*/`
-
- ${escapeHtml(day.long)}
- ${escapeHtml(showing.hall)}
- ${escapeHtml(showing.time)}
-
- `).join("");
- };
-
- const renderMovieProgramList = () => {
- if (!ui.movieProgramList) {
- return;
- }
-
- ui.movieProgramList.innerHTML = movieProgram.map((movie: { schedule: any[]; poster: string; title: string; fsk: string; duration: any; genre: string; description: string; }, programIndex: any) => {
- const dayTabs = movie.schedule.map((day, dayIndex) => /*html*/`
-
- ${escapeHtml(day.short)}
- ${escapeHtml(formatDateShort(day.date))}
-
- `).join("");
-
- return /*html*/`
-
-
-
-
${escapeHtml(movie.fsk)}
-
-
-
-
${escapeHtml(movie.description)}
-
-
${dayTabs}
-
-
-
-
- `;
- }).join("");
-
- movieProgram.forEach((_: any, programIndex: number) => {
- renderScheduleRows(programIndex, 0);
- });
- };
-
- const initRevealAnimations = () => {
- const revealElements = Array.from(document.querySelectorAll(".reveal-on-scroll"));
- if (!revealElements.length) {
- return;
- }
-
- if (!("IntersectionObserver" in window)) {
- revealElements.forEach((element) => element.classList.add("is-visible"));
- return;
- }
-
- const observer = new IntersectionObserver((entries, obs) => {
- entries.forEach((entry) => {
- if (!entry.isIntersecting) {
- return;
- }
-
- entry.target.classList.add("is-visible");
- obs.unobserve(entry.target);
- });
- }, { threshold: 0.2 });
-
- revealElements.forEach((element) => observer.observe(element));
- };
-
- const renderMovieExperience = () => {
- buildMovieProgram();
- renderHero();
- renderNowRunningRow();
- renderMovieProgramList();
- initRevealAnimations();
- };
-
- const bindNavigation = () => {
- ui.logo?.addEventListener("click", showHome);
-
- ui.linkFilme?.addEventListener("click", (event) => {
- event.preventDefault();
- showMovieList();
- });
-
- ui.linkSnacks?.addEventListener("click", (event) => {
- event.preventDefault();
- if (views.snacks) {
- showStaticView(views.snacks);
- }
- });
-
- ui.linkAbout?.addEventListener("click", (event) => {
- event.preventDefault();
- if (views.about) {
- showStaticView(views.about);
- }
- });
-
- ui.linkCart?.addEventListener("click", (event) => {
- event.preventDefault();
- hideAllViews();
- views.cart?.classList.remove("hidden");
- renderCart?.();
- });
-
- ui.linkAccount?.addEventListener("click", (event) => {
- event.preventDefault();
- hideAllViews();
- views.account?.classList.remove("hidden");
-
- const isUserLoggedIn = typeof currentUser !== "undefined" && currentUser;
- if (isUserLoggedIn && typeof openAccountDashboard === "function") {
- openAccountDashboard();
- }
- });
-
- ui.heroBookingBtn?.addEventListener("click", () => {
- showMovieList();
- });
-
- ui.checkoutBtn?.addEventListener("click", showCheckoutStart);
- ui.backHomeBtn?.addEventListener("click", showHome);
- };
-
- const bindProgramActions = () => {
- views.moviesGrid?.addEventListener("click", (event:any) => {
- const trigger = event.target.closest(".open-program-btn");
- if (!trigger) {
- return;
- }
-
- const programIndex = Number(trigger.dataset.programIndex) || 0;
- showMovieList(programIndex);
- });
-
- ui.movieProgramList?.addEventListener("click", (event:any) => {
- const dayButton = event.target.closest(".program-day-tab");
- if (!dayButton) {
- return;
- }
-
- const programIndex = Number(dayButton.dataset.programIndex || 0);
- const dayIndex = Number(dayButton.dataset.dayIndex || 0);
-
- const tabRow = dayButton.closest(".program-day-tabs");
- tabRow?.querySelectorAll(".program-day-tab").forEach((tab: { classList: { remove: (arg0: string) => any; }; }) => tab.classList.remove("active"));
- dayButton.classList.add("active");
-
- renderScheduleRows(programIndex, dayIndex);
- });
- };
-
- const bindHomeInfoNavigation = () => {
- const openButtons = Array.from(document.querySelectorAll("[data-home-view-open]"));
- const backButtons = Array.from(document.querySelectorAll("[data-go-home]"));
- const aboutOpenButtons = Array.from(document.querySelectorAll("[data-about-modal-open]"));
- const aboutCloseButtons = Array.from(document.querySelectorAll("[data-about-modal-close]"));
- const aboutModal = document.getElementById("about-tech-modal");
-
- if (!openButtons.length) {
- return;
- }
-
- const targetMap = {
- "halls-view": views.halls,
- "dbox-view": views.dbox,
- "collectors-view": views.collectors
- };
-
- openButtons.forEach((button) => {
- button.addEventListener("click", () => {
- const targetId = button.getAttribute("data-home-view-open") as keyof typeof targetMap;
- const target = targetId ? targetMap[targetId] : null;
- if (target) {
- showStaticView(target);
- }
- });
- });
-
- backButtons.forEach((button) => {
- button.addEventListener("click", () => {
- showHome();
- });
- });
-
- aboutOpenButtons.forEach((button) => {
- button.addEventListener("click", () => {
- const targetId = button.getAttribute("data-about-modal-open");
- if (targetId === "about-tech-modal" && aboutModal) {
- aboutModal.classList.remove("hidden");
- document.body.style.overflow = "hidden";
- }
- });
- });
-
- aboutCloseButtons.forEach((button) => {
- button.addEventListener("click", () => {
- aboutModal?.classList.add("hidden");
- document.body.style.overflow = "auto";
- });
- });
-
- aboutModal?.addEventListener("click", (event) => {
- if (event.target === aboutModal) {
- aboutModal.classList.add("hidden");
- document.body.style.overflow = "auto";
- }
- });
-
- document.addEventListener("keydown", (event) => {
- if (event.key === "Escape" && aboutModal && !aboutModal.classList.contains("hidden")) {
- aboutModal.classList.add("hidden");
- document.body.style.overflow = "auto";
- }
- });
- };
-
- const initThemeToggle = () => {
- if (!ui.themeToggle) {
- return;
- }
-
- const THEME_KEY = "eagleTheme";
-
- const applyTheme = (theme: any) => {
- const isLight = theme === "light";
- document.body.classList.toggle("theme-light", isLight);
- document.body.classList.toggle("theme-dark", !isLight);
- //@ts-ignore
- ui.themeToggle.classList.toggle("is-light", isLight);
- localStorage.setItem(THEME_KEY, isLight ? "light" : "dark");
- };
-
- const storedTheme = localStorage.getItem(THEME_KEY);
- applyTheme(storedTheme === "light" ? "light" : "dark");
-
- ui.themeToggle.addEventListener("click", () => {
- const nextTheme = document.body.classList.contains("theme-light") ? "dark" : "light";
- applyTheme(nextTheme);
- });
- };
-
- const bindAccountActions = () => {
- const registerModal = document.getElementById("register-modal");
- const forgotModal = document.getElementById("forgot-modal");
- const forgotEmailInput = document.getElementById("forgot-email") as HTMLInputElement;
- const resetMessage = document.getElementById("reset-message");
- const loginError = document.getElementById("login-error");
- const loginEmailInput = document.getElementById("login-email");
- const loginPasswordInput = document.getElementById("login-password");
-
- const openModal = (modal: HTMLElement | null) => modal?.classList.remove("hidden");
- const closeModal = (modal: HTMLElement | null) => modal?.classList.add("hidden");
- const triggerLogin = () => {
- loginError?.classList.add("hidden");
- if (typeof loginUser === "function") {
- loginUser();
- }
- };
-
- document.getElementById("btn-open-register")?.addEventListener("click", () => {
- openModal(registerModal);
- });
-
- document.getElementById("btn-close-register")?.addEventListener("click", () => {
- closeModal(registerModal);
- });
-
- document.getElementById("btn-register-save")?.addEventListener("click", () => {
- if (typeof registerUser === "function") {
- registerUser();
- }
- });
-
- document.getElementById("btn-login-account")?.addEventListener("click", triggerLogin);
-
- [loginEmailInput, loginPasswordInput].forEach((input) => {
- input?.addEventListener("keydown", (event) => {
- if (event.key !== "Enter") {
- return;
- }
-
- event.preventDefault();
- triggerLogin();
- });
- });
-
- document.getElementById("btn-forgot-password")?.addEventListener("click", () => {
- if (forgotEmailInput != null) {
- forgotEmailInput.value = "";
- }
- resetMessage?.classList.add("hidden");
- openModal(forgotModal);
- });
-
- document.getElementById("btn-close-forgot")?.addEventListener("click", () => {
- closeModal(forgotModal);
- });
-
- document.getElementById("btn-send-reset")?.addEventListener("click", () => {
- const email = forgotEmailInput?.value.trim() || "";
- if (!email || !email.includes("@")) {
- alert("Bitte gib eine gueltige E-Mail-Adresse ein.");
- return;
- }
-
- if (resetMessage) {
- resetMessage.textContent = "Wenn ein Konto existiert, wurde ein Reset-Code simuliert versendet.";
- resetMessage.classList.remove("hidden");
- }
- });
-
- registerModal?.addEventListener("click", (event) => {
- if (event.target === registerModal) {
- closeModal(registerModal);
- }
- });
-
- forgotModal?.addEventListener("click", (event) => {
- if (event.target === forgotModal) {
- closeModal(forgotModal);
- }
- });
-
- document.addEventListener("keydown", (event) => {
- if (event.key === "Escape") {
- closeModal(registerModal);
- closeModal(forgotModal);
- }
- });
- };
-
- const bindGlobalDocumentClicks = () => {
- document.addEventListener("click", (event: any) => {
- if (event.target.classList.contains("opt-btn")) {
- const optionGroup = event.target.parentElement;
- optionGroup?.querySelectorAll(".opt-btn").forEach((button: { classList: { remove: (arg0: string) => any; }; }) => button.classList.remove("active"));
- event.target.classList.add("active");
- }
-
- const deleteBtn = event.target.closest(".btn-delete-item");
- if (deleteBtn?.dataset.key) {
- const row = deleteBtn.closest(".cart-item-row");
- if (row) {
- row.classList.add("slide-out-left");
- row.querySelectorAll("button").forEach((button: { disabled: boolean; }) => {
- button.disabled = true;
- });
-
- setTimeout(() => {
- //@ts-ignore
- removeFromCartByKey(deleteBtn.dataset.key); //TODO: removeFromCartByKey doesnt exist
- }, 380);
- } else {
- //@ts-ignore
- removeFromCartByKey(deleteBtn.dataset.key); //TODO: removeFromCartByKey doesnt exist
- }
- return;
- }
-
- const chip = event.target.closest(".time-chip");
- if (chip) {
- const movieFromData = chip.getAttribute("data-movie");
- const movieCard = chip.closest(".movie-card, .detailed-card, .program-card");
- const movie = movieFromData || movieCard?.querySelector("h2, h3")?.innerText || "Film";
- const hall = chip.getAttribute("data-hall");
- const time = chip.getAttribute("data-time");
-
- if (hall && time && typeof openBooking === "function") {
- openBooking(movie, hall, time);
- }
- }
-
- const qtyBtn = event.target.closest(".btn-qty");
- if (!qtyBtn) {
- return;
- }
-
- const action = qtyBtn.dataset.action;
- const key = qtyBtn.dataset.key;
- if (!action || !key) {
- return;
- }
-
- const relatedItem = cart.find((item: { category: string; seatId: any; hall: any; time: any; title: any; }) => {
- const infoText = item.category === "movie"
- ? `Sitz: ${item.seatId} (${item.hall})`
- : item.time;
- return `${item.title}-${item.hall}-${infoText}` === key;
- });
-
- if (!relatedItem || relatedItem.category === "movie") {
- return;
- }
-
- if (action === "plus") {
- cart.push({ ...relatedItem, id: Date.now() + Math.random() });
- } else {
- const keyList = cart.map((item: { category: string; seatId: any; hall: any; time: any; title: any; }) => {
- const infoText = item.category === "movie"
- ? `Sitz: ${item.seatId} (${item.hall})`
- : item.time;
- return `${item.title}-${item.hall}-${infoText}`;
- });
- const lastMatch = keyList.lastIndexOf(key);
-
- if (lastMatch !== -1) {
- cart.splice(lastMatch, 1);
- }
- }
-
- saveCart?.();
- renderCart?.();
- });
- };
-
- const bindSnacksActions = () => {
- ui.snacksView?.addEventListener("click", (event:any) => {
- const sizeChip = event.target.closest(".size-chip");
- if (!sizeChip) {
- return;
- }
-
- const snackCard = sizeChip.closest(".snack-card");
- if (!snackCard) {
- return;
- }
-
- const snackTitle = snackCard.querySelector("h3, h2")?.innerText || "Snack";
- const snackImg = snackCard.querySelector("img")?.src || "";
- const priceSpan = sizeChip.querySelector("span");
- const rawPriceText = (priceSpan ? priceSpan.innerText : sizeChip.innerText)
- .replace("EUR", "")
- .replace("€", "")
- .replace(",", ".")
- .trim();
- const priceVal = parseFloat(rawPriceText) || 0;
- const sizeVal = sizeChip.innerText.replace(priceSpan?.innerText || "", "").trim() || "Standard";
- const activeOption = snackCard.querySelector(".opt-btn.active");
- const variantVal = activeOption ? activeOption.innerText : "Normal";
-
- cart.push({
- id: Date.now() + Math.random(),
- category: "snack",
- title: snackTitle,
- hall: sizeVal,
- time: variantVal,
- type: "SNACK",
- price: priceVal,
- img: snackImg
- });
-
- saveCart?.();
-
- const originalHtml = sizeChip.innerHTML;
- sizeChip.innerHTML = "Hinzugefügt!";
- setTimeout(() => {
- sizeChip.innerHTML = originalHtml;
- }, 800);
- });
-
- document.querySelectorAll(".tab-btn").forEach((button: any) => {
- button.addEventListener("click", () => {
- document.querySelectorAll(".tab-btn").forEach((tab) => tab.classList.remove("active"));
- button.classList.add("active");
-
- document.querySelectorAll(".snack-category").forEach((category) => category.classList.add("hidden"));
- document.getElementById(button.dataset.target)?.classList.remove("hidden");
- });
- });
- };
-
- const bindOverlayActions = () => {
- ui.btnYesSnacks?.addEventListener("click", () => {
- ui.snackOverlay?.classList.add("hidden");
- hideAllViews();
- views.snacks?.classList.remove("hidden");
- document.body.style.overflow = "auto";
- });
-
- ui.btnNoCart?.addEventListener("click", () => {
- ui.snackOverlay?.classList.add("hidden");
- hideAllViews();
- views.cart?.classList.remove("hidden");
- renderCart?.();
- document.body.style.overflow = "auto";
- });
- };
-
- const bindBookingModalClose = () => {
- ui.closeBookingModalBtn?.addEventListener("click", closeBookingModal);
-
- ui.bookingModal?.addEventListener("click", (event) => {
- if (event.target === ui.bookingModal) {
- closeBookingModal();
- }
- });
- };
- // @ts-ignore
- window.removeFromCartByKey = function removeFromCartByKey(key: string) {
- cart = cart.filter((item: { category: string; seatId: any; hall: any; time: any; title: any; }) => {
- const infoText = item.category === "movie"
- ? `Sitz: ${item.seatId} (${item.hall})`
- : item.time;
- return `${item.title}-${item.hall}-${infoText}` !== key;
- });
-
- saveCart?.();
- renderCart?.();
- };
-
- renderMovieExperience();
- initThemeToggle();
- bindNavigation();
- bindProgramActions();
- bindHomeInfoNavigation();
- bindAccountActions();
- bindGlobalDocumentClicks();
- bindSnacksActions();
- bindOverlayActions();
- bindBookingModalClose();
-
- updateCartBadge?.();
- renderCheckout?.();
-});
-
-export function emptyCart() {
- cart = []
- return
-}
\ No newline at end of file
diff --git a/style.css b/style.css
new file mode 100644
index 0000000..c355eec
--- /dev/null
+++ b/style.css
@@ -0,0 +1,3867 @@
+:root {
+ --bg-black: #000000;
+ --card-bg: #1c1c1e;
+ --text-white: #f5f5f7;
+ --accent-blue: #0071e3;
+ --glass: rgba(29, 29, 31, 0.75);
+}
+
+/* Global Reset */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+ font-family: 'Segoe UI', sans-serif;
+}
+
+body {
+ background: var(--bg-black);
+ color: var(--text-white);
+ overflow-x: hidden;
+}
+
+.hidden { display: none !important; }
+
+/* --- Navigation --- */
+.navbar {
+ position: fixed;
+ top: 0;
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ padding: 1.2rem 10%;
+ background: var(--glass);
+ backdrop-filter: blur(20px);
+ z-index: 1000;
+}
+
+.nav-links {
+ display: flex;
+ list-style: none;
+ gap: 2rem;
+}
+
+.nav-links a {
+ color: white;
+ text-decoration: none;
+ opacity: 0.8;
+ font-size: 0.9rem;
+}
+
+/* --- Hero Section --- */
+.hero {
+ height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ background: linear-gradient(rgba(0,0,0,0.4), #000), url('https://images.unsplash.com/photo-1485846234645-a62644f84728?q=80&w=2000') center/cover;
+}
+
+.badge {
+ background: var(--accent-blue);
+ padding: 4px 12px;
+ border-radius: 20px;
+ font-size: 0.7rem;
+ font-weight: bold;
+}
+
+.hero h1 {
+ font-size: 4.5rem;
+ margin: 10px 0;
+}
+
+/* --- Movie Grid & Sections --- */
+.movie-section { padding: 80px 10%; }
+
+.movie-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
+ gap: 30px;
+}
+
+.movie-card {
+ background: var(--card-bg);
+ border-radius: 20px;
+ overflow: hidden;
+}
+
+.movie-poster img {
+ width: 100%;
+ aspect-ratio: 2/3;
+ object-fit: cover;
+}
+
+.movie-info { padding: 20px; }
+
+.showtimes {
+ display: flex;
+ gap: 10px;
+ margin-top: 15px;
+}
+
+/* --- UI Elements (Chips & Buttons) --- */
+.time-chip {
+ background: rgba(255,255,255,0.1);
+ border: none;
+ color: white;
+ padding: 8px 15px;
+ border-radius: 10px;
+ cursor: pointer;
+ transition: 0.3s;
+}
+
+.time-chip:hover { background: var(--accent-blue); }
+
+.btn-primary {
+ background: var(--accent-blue);
+ color: white;
+ border: none;
+ padding: 12px 25px;
+ border-radius: 20px;
+ cursor: pointer;
+}
+
+/* --- Detailed List View --- */
+.detailed-card {
+ display: flex;
+ background: var(--card-bg);
+ border-radius: 24px;
+ margin-bottom: 30px;
+ overflow: hidden;
+}
+
+.card-left {
+ width: 250px;
+ position: relative;
+}
+
+.card-left img {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.card-right {
+ flex: 1;
+ padding: 30px;
+}
+
+.fsk {
+ position: absolute;
+ bottom: 10px;
+ left: 10px;
+ width: 35px;
+ height: 35px;
+ border-radius: 50%;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: bold;
+}
+
+.fsk-0 { background: #d6d6d6; }
+.fsk-6 { background: #e3c500; }
+.fsk-12 { background: #008d39; }
+.fsk-16 { background: #0095ff; }
+.fsk-18 { background: #ff3730; }
+
+.schedule-container {
+ background: rgba(0,0,0,0.2);
+ padding: 15px;
+ border-radius: 15px;
+ margin-top: 20px;
+}
+
+.schedule-header {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ color: #86868b;
+ font-size: 0.7rem;
+ margin-bottom: 10px;
+}
+
+.schedule-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr 1fr;
+ align-items: center;
+ padding: 10px;
+ border-radius: 10px;
+}
+
+.time-btn {
+ background: var(--accent-blue);
+ padding: 5px 10px;
+ border-radius: 5px;
+ width: fit-content;
+}
+
+/* --- Booking Modal --- */
+.modal {
+ position: fixed;
+ top: 0; left: 0; width: 100%; height: 100%;
+ background: rgba(0,0,0,0.85);
+ backdrop-filter: blur(20px);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 2000;
+}
+
+.modal-content {
+ background: #1c1c1e;
+ padding: 40px;
+ border-radius: 32px;
+ width: 90%;
+ max-width: 1000px;
+ border: 1px solid rgba(255,255,255,0.1);
+ position: relative;
+}
+
+.close-btn {
+ position: absolute;
+ top: 20px;
+ right: 25px;
+ font-size: 2rem;
+ cursor: pointer;
+ color: #86868b;
+}
+
+.modal-close-btn {
+ position: absolute;
+ top: 16px;
+ right: 16px;
+ width: 36px;
+ height: 36px;
+ border: 0;
+ border-radius: 50%;
+ background: #2b2b2d;
+ color: #fff;
+ font-size: 1.4rem;
+ line-height: 1;
+ cursor: pointer;
+ transition: background 0.2s ease;
+}
+
+.modal-close-btn:hover {
+ background: #3a3a3d;
+}
+
+.screen {
+ height: 5px;
+ background: white;
+ width: 80%;
+ margin: 20px auto;
+ box-shadow: 0 0 15px white;
+}
+
+.screen-text {
+ text-align: center;
+ font-size: 0.7rem;
+ color: #86868b;
+ letter-spacing: 5px;
+}
+
+/* --- MODAL & SITZPLAN UPDATE --- */
+.modal-large {
+ max-width: 95vw !important; /* Fast die ganze Breite nutzen */
+ max-height: 90vh;
+ overflow-y: auto; /* Vertikales Scrollen erlauben */
+ width: 1000px !important;
+}
+
+#deluxe-logos {
+ display: flex;
+ gap: 10px;
+ justify-content: center;
+ margin-top: 15px;
+}
+
+.logo-placeholder {
+ background: rgba(255,255,255,0.1);
+ padding: 6px 12px;
+ border-radius: 8px;
+ font-size: 0.75rem;
+ color: #86868b;
+ border: 1px dashed rgba(255,255,255,0.3);
+}
+
+.seat-map-container {
+ width: 100%;
+ overflow-x: auto; /* Horizontales Scrollen für IMAX */
+ padding: 10px 0 20px 0;
+}
+
+.seat-grid-custom {
+ display: flex;
+ flex-direction: column;
+ gap: 10px;
+ align-items: center;
+ margin: 20px auto;
+ width: fit-content;
+}
+
+.seat-row {
+ display: flex;
+ gap: 8px;
+ justify-content: center;
+}
+
+.aisle {
+ width: 25px; /* Breite des Durchgangs */
+}
+
+/* Sitzplatz Design */
+/* --- SITZPLATZ DESIGN UPDATE --- */
+.seat {
+ width: 26px;
+ height: 26px;
+ background: #3a3a3c; /* Standard Grau */
+ border-radius: 6px;
+ cursor: pointer;
+ transition: all 0.2s ease-in-out;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: relative;
+ border: 1px solid rgba(255,255,255,0.1);
+}
+
+/* Hover-Effekt (Hervorhebung) */
+.seat:hover:not(.occupied) {
+ transform: scale(1.25);
+ z-index: 10;
+ border-color: rgba(255,255,255,0.5);
+}
+
+/* Farben der Typen */
+.seat.normal, .seat.imax { background: #3a3a3c; }
+.seat.vip { background: #ff9500; } /* Orange */
+.seat.dbox {
+ background: #ffca28; /* Gold */
+ box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
+}
+
+/* Ausgewählter Zustand (Grün + Glow) */
+.seat.selected {
+ background: #34c759 !important; /* iOS Grün */
+ box-shadow: 0 0 15px #34c759;
+ transform: scale(1.1);
+ border-color: white;
+}
+
+/* Belegter Zustand (Rot mit X) */
+.seat.occupied {
+ background: #ff3b30 !important; /* Rot */
+ cursor: not-allowed;
+ opacity: 1;
+ transform: none;
+}
+
+.seat.occupied::after {
+ content: '×';
+ color: white;
+ font-size: 18px;
+ font-weight: bold;
+ line-height: 1;
+}
+
+/* Legende Styling */
+.legend .seat { cursor: default; pointer-events: none; width: 20px; height: 20px; }
+.legend .item { display: flex; align-items: center; gap: 8px; font-size: 0.8rem; color: #86868b; }
+
+#dynamic-legend {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 15px;
+ margin-top: 20px;
+ padding: 15px;
+ background: rgba(255,255,255,0.05);
+ border-radius: 12px;
+}
+
+/* --- Snack Tabs Navigation --- */
+.category-tabs {
+ display: flex;
+ justify-content: center;
+ gap: 15px;
+ margin-bottom: 50px;
+}
+
+.tab-btn {
+ background: #1c1c1e;
+ border: 1px solid rgba(255,255,255,0.1);
+ color: white;
+ padding: 12px 25px;
+ border-radius: 30px;
+ cursor: pointer;
+ transition: 0.3s;
+}
+.tab-btn:hover { background: rgba(255,255,255,0.1); }
+.tab-btn.active { background: var(--accent-blue); border-color: var(--accent-blue); }
+
+.snack-category {
+ animation: fadeIn 0.4s ease-in-out;
+}
+
+@keyframes fadeIn {
+ from { opacity: 0; transform: translateY(10px); }
+ to { opacity: 1; transform: translateY(0); }
+}
+
+/* --- Snack Grid & Cards --- */
+.snack-section { padding: 100px 10%; }
+.snack-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
+ gap: 25px;
+}
+
+.snack-card {
+ background: var(--card-bg);
+ border-radius: 20px;
+ overflow: hidden;
+ transition: 0.3s;
+ border: 1px solid rgba(255,255,255,0.05);
+}
+
+.snack-card:hover {
+ transform: translateY(-8px); border-color: var(--accent-blue);
+}
+
+.snack-card.highlight {
+ border: 1px solid var(--accent-blue);
+ background: linear-gradient(145deg, #1c1c1e, #0a2540);
+}
+
+.snack-img {
+ width: 100%;
+ height: 150px;
+ background: #111;
+}
+
+.snack-img img {
+ width: 100%;
+ height: 100%;
+ object-fit: contain; /* Ideal für Produktfotos auf dunklem Grund */
+ padding: 10px;
+}
+
+/* --- SNACK INFO ZENTRIERUNG --- */
+
+.snack-info {
+ padding: 20px;
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.snack-info h3 {
+ font-size: 1rem;
+ margin-bottom: 15px;
+ width: 100%;
+}
+
+.size-selector {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ justify-content: center;
+}
+
+.size-chip {
+ background: rgba(255,255,255,0.05);
+ border: 1px solid rgba(255,255,255,0.1);
+ color: white;
+ padding: 6px 12px;
+ border-radius: 8px;
+ font-size: 0.75rem;
+ cursor: pointer;
+ transition: 0.2s;
+}
+
+.size-chip span {
+ display: block;
+ color: var(--accent-blue);
+ font-weight: bold;
+}
+
+.size-chip:hover {
+ background: var(--accent-blue);
+ border-color: var(--accent-blue);
+}
+
+.size-chip:hover span {
+ color: white;
+}
+
+.size-chip.special {
+ background: rgba(229, 160, 13, 0.1);
+ border: 1px solid #e5a00d;
+}
+
+.size-chip.special span {
+ color: #e5a00d;
+}
+
+/* Snack Options (Sweet/Salty & Dips) */
+.option-group {
+ display: flex;
+ gap: 5px;
+ margin-bottom: 15px;
+ background: rgba(0, 0, 0, 0.3);
+ padding: 4px;
+ border-radius: 10px;
+}
+
+.opt-btn {
+ flex: 1;
+ background: transparent;
+ border: none;
+ color: #86868b;
+ padding: 6px;
+ font-size: 0.75rem;
+ font-weight: bold;
+ cursor: pointer;
+ border-radius: 7px;
+ transition: 0.2s;
+}
+
+.opt-btn.active {
+ background: #3a3a3c;
+ color: white;
+}
+
+/* --- Coming Soon Banner --- */
+.coming-soon-banner {
+ background: linear-gradient(45deg, #1c1c1e, #2a2a2d);
+ border: 2px dashed rgba(255,255,255,0.2);
+ border-radius: 20px;
+ padding: 80px 20px;
+ text-align: center;
+ color: var(--text-white);
+}
+
+.coming-soon-banner h2 {
+ font-size: 2.5rem;
+ margin-bottom: 10px;
+ color: var(--accent-blue);
+}
+
+.coming-soon-banner p {
+ font-size: 1.5rem;
+ font-weight: bold;
+ margin-bottom: 10px;
+}
+
+.coming-soon-banner span { color: #86868b; }
+
+/* Layout breiter machen */
+.booking-layout {
+ display: flex;
+ gap: 40px; /* Mehr Abstand zwischen Plan und Preis */
+ align-items: flex-start;
+ justify-content: center;
+ max-width: 1200px; /* Erlaubt dem Fenster mehr Platz */
+ margin: 0 auto;
+ transition: all 0.8s cubic-bezier(0.25, 1, 0.5, 1);
+}
+
+/* Das rechte Panel optimiert */
+.summary-panel {
+ width: 300px; /* Etwas breiter für bessere Lesbarkeit */
+ background: rgba(255, 255, 255, 0.03);
+ backdrop-filter: blur(10px);
+ border-radius: 24px;
+ padding: 25px;
+ border: 1px solid rgba(255, 255, 255, 0.08);
+
+ /* Langsamere, sanftere Animation */
+ animation: slideInSoft 0.8s cubic-bezier(0.25, 1, 0.5, 1) forwards;
+}
+
+@keyframes slideInSoft {
+ from {
+ opacity: 0;
+ transform: translateX(40px) scale(0.98);
+ }
+ to {
+ opacity: 1;
+ transform: translateX(0) scale(1);
+ }
+}
+
+.summary-row {
+ display: flex;
+ justify-content: space-between;
+ font-size: 0.95rem;
+ margin-bottom: 12px;
+ color: #a1a1a6;
+ /* Die einzelnen Zeilen faden auch sanft ein */
+ animation: fadeInRow 0.5s ease forwards;
+}
+
+@keyframes fadeInRow {
+ from { opacity: 0; }
+ to { opacity: 1; }
+}
+
+.summary-row .type { color: #f5f5f7; }
+.summary-row .price { font-weight: bold; color: var(--accent-blue); }
+
+.divider {
+ height: 1px;
+ background: rgba(255, 255, 255, 0.1);
+ margin: 15px 0;
+}
+
+.total-row {
+ display: flex;
+ justify-content: space-between;
+ font-weight: 600;
+ font-size: 1.2rem;
+ color: #ffffff;
+ letter-spacing: -0.02em;
+}
+
+/* Verstecken mit sanftem Übergang */
+.hidden { display: none !important; }
+
+.header-sub-info {
+ display: flex;
+ align-items: center;
+ gap: 15px;
+ margin-top: 5px;
+}
+
+.tech-badges-container {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ /* Sanfter Übergang beim Einblenden */
+ animation: fadeIn 0.5s ease;
+}
+
+.tech-badge {
+ height: 14px; /* Schön klein und dezent */
+ width: auto;
+ opacity: 0.7; /* Leicht transparent für den edlen Look */
+ filter: brightness(0) invert(1); /* Macht schwarze Logos weiß, passend zum Dark Mode */
+}
+
+.tech-badges-container.hidden {
+ display: none;
+}
+
+.tech-badges-container {
+ display: flex;
+ gap: 10px;
+ align-items: center;
+ margin-left: 10px;
+}
+
+.tech-badge {
+ height: 18px; /* Oder die gewünschte Höhe */
+ width: auto;
+ opacity: 0.8;
+}
+
+/* --- Warenkorb Badge --- */
+.cart-badge {
+ background-color: #e50914; /* Kino-Rot */
+ color: white;
+ font-size: 0.75rem;
+ font-weight: bold;
+ border-radius: 50%;
+ padding: 2px 6px;
+ position: absolute;
+ top: -8px;
+ right: -15px;
+ transition: transform 0.3s ease;
+}
+.cart-badge.hidden { display: none; }
+.cart-badge.pop { transform: scale(1.3); } /* Für eine kleine Animation beim Hinzufügen */
+
+/* --- WARENKORB SPALTEN-LAYOUT & HINTERGRÜNDE --- */
+/* --- WARENKORB DESIGN (SPALTEN-LAYOUT) --- */
+.cart-container {
+ display: flex;
+ gap: 50px;
+ align-items: flex-start;
+ margin-top: 40px;
+}
+
+/* Linke Seite (Artikelliste) mit Panel-Hintergrund */
+.cart-left {
+ flex: 2;
+ background-color: #1c1c1e !important; /* !important stellt sicher, dass es grau bleibt */
+ padding: 35px;
+ border-radius: 28px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+/* Rechte Seite (Zusammenfassung) */
+.cart-right {
+ flex: 1;
+ min-width: 380px;
+}
+
+.cart-items {
+ flex: 2;
+ background: #1c1c1e;
+ border-radius: 12px;
+ padding: 20px;
+}
+.cart-summary-box {
+ flex: 1;
+ background: #1c1c1e;
+ border-radius: 12px;
+ padding: 25px;
+ position: sticky;
+ top: 100px;
+}
+.cart-total-row {
+ display: flex;
+ justify-content: space-between;
+ font-size: 1.3rem;
+ font-weight: bold;
+ margin-top: 15px;
+ padding-top: 15px;
+ border-top: 1px solid #333;
+}
+.payment-methods-panel {
+ background: #2c2c2e !important; /* Ein helleres Grau als die Boxen oben */
+ padding: 20px;
+ border-radius: 18px;
+ margin-top: 30px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+}
+
+/* Die Logos selbst */
+.payment-methods-panel div {
+ display: flex;
+ justify-content: center;
+ gap: 15px;
+ opacity: 0.95; /* Fast volle Sichtbarkeit (vorher 0.6) */
+}
+
+.payment-methods-panel img {
+ height: 22px; /* Etwas größer für bessere Sichtbarkeit */
+ filter: drop-shadow(0 2px 4px rgba(0,0,0,0.5)); /* Kleiner Schatten für Tiefe */
+ transition: transform 0.2s;
+}
+
+.payment-methods-panel img:hover {
+ transform: scale(1.1); /* Kleiner Effekt beim Drüberfahren */
+}
+
+/* --- Snack Prompt Overlay --- */
+.snack-overlay {
+ position: fixed;
+ top: 0; left: 0; width: 100%; height: 100%;
+ background: rgba(0,0,0,0.8);
+ backdrop-filter: blur(5px);
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ z-index: 2000;
+ opacity: 1;
+ transition: opacity 0.4s ease;
+}
+.snack-overlay.hidden {
+ opacity: 0;
+ pointer-events: none;
+}
+.snack-prompt-box {
+ background: #1c1c1e;
+ padding: 40px;
+ border-radius: 16px;
+ text-align: center;
+ max-width: 500px;
+ transform: translateY(0);
+ transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275);
+}
+.snack-overlay.hidden .snack-prompt-box {
+ transform: translateY(50px);
+}
+.snack-prompt-box h2 { margin-bottom: 15px; color: #fff; }
+.snack-prompt-box p { color: #aaa; margin-bottom: 25px; }
+.prompt-buttons { display: flex; gap: 15px; justify-content: center; }
+.btn-secondary {
+ background: transparent;
+ border: 1px solid #fff;
+ color: #fff;
+ padding: 12px 24px;
+ border-radius: 8px;
+ cursor: pointer;
+ transition: 0.3s;
+}
+.btn-secondary:hover { background: rgba(255,255,255,0.1); }
+
+/* --- WARENKORB TABELLEN-LAYOUT --- */
+.cart-item-row,
+.cart-header {
+ display: grid;
+ grid-template-columns: 100px 80px 1.5fr 1fr 100px 50px;
+ align-items: center;
+ gap: 0; /* Wir nutzen kein gap, um volle Kontrolle über die Spalten zu haben */
+}
+
+.cart-header {
+ font-size: 0.75rem;
+ color: #86868b;
+ font-weight: bold;
+ letter-spacing: 1.2px;
+ border-bottom: 1px solid #333;
+ padding: 15px 0;
+ margin-bottom: 10px;
+}
+
+.cart-item-row {
+ padding: 20px 0;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+/* 1. Spalte: Menge (Zentriert den Stepper/Text etwas) */
+.cart-item-row > div:nth-child(1),
+.cart-header > div:nth-child(1) {
+ padding-left: 5px;
+}
+
+/* 2. Spalte: Das Bild (Bekommt links Platz zum Stepper) */
+.cart-item-row > div:nth-child(2) {
+ padding-left: 15px; /* Abstand zwischen +/- Button und Bild */
+}
+
+/* 3. Spalte: ARTIKEL (Titel) - Hier schieben wir die Schrift nach rechts */
+.cart-header > div:nth-child(3),
+.cart-item-row > div:nth-child(3) {
+ padding-left: 30px; /* Dieser Wert sorgt für die Ordnung */
+}
+
+/* 4. Spalte: INFO - Auch hier schieben wir für die vertikale Linie nach rechts */
+.cart-header > div:nth-child(4),
+.cart-item-row > div:nth-child(4) {
+ padding-left: 30px;
+}
+
+/* 5. Spalte: PREIS (Rechtsbündig für Tabellen-Look) */
+.cart-header > div:nth-child(5),
+.cart-item-row > div:nth-child(5) {
+ text-align: right;
+ padding-right: 15px;
+}
+
+/* 6. Spalte: LÖSCHEN (Zentriert am Ende) */
+.cart-header > div:nth-child(6),
+.cart-item-row > div:nth-child(6) {
+ text-align: right;
+}
+
+/* Bild-Styling innerhalb der Spalte */
+.cart-item-row img {
+ width: 45px;
+ height: 60px;
+ object-fit: cover;
+ border-radius: 8px;
+ display: block;
+}
+/* Plus-Minus Buttons */
+.qty-stepper {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ background: rgba(0,0,0,0.3);
+ padding: 5px 10px;
+ border-radius: 20px;
+ width: fit-content;
+}
+
+.btn-qty {
+ background: none;
+ border: 1px solid var(--accent-blue);
+ color: var(--accent-blue);
+ width: 22px;
+ height: 22px;
+ border-radius: 50%;
+ cursor: pointer;
+ font-weight: bold;
+}
+.btn-delete-item {
+ transition: background 0.2s ease, transform 0.1s ease, opacity 0.2s ease;
+ cursor: pointer;
+}
+
+.btn-qty:hover,
+.btn-delete-item:hover {
+ background: #0071e3 !important; /* Das Apple-Blau */
+ border-radius: 6px; /* Schön abgerundet */
+ transform: scale(1.1); /* Minimal vergrößern */
+}
+/* Animationen */
+@keyframes popIn {
+ 0% { transform: scale(0.9); opacity: 0; }
+ 100% { transform: scale(1); opacity: 1; }
+}
+
+.animate-pop-in {
+ animation: popIn 0.4s cubic-bezier(0.17, 0.67, 0.83, 0.67);
+}
+
+.btn-delete-item {
+ background: none;
+ border: none;
+ font-size: 1.2rem;
+ cursor: pointer;
+ opacity: 0.5;
+ transition: 0.3s;
+}
+
+.btn-delete-item:hover {
+ opacity: 1; transform: scale(1.2);
+}
+
+/* Checkout Container */
+.checkout-container {
+ max-width: 600px;
+ margin: 0 auto;
+ padding: 30px;
+ background: #1a1a1a;
+ border-radius: 12px;
+ box-shadow: 0 10px 30px rgba(0,0,0,0.5);
+}
+
+/* Fortschrittsleiste */
+.progress-bar {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin-bottom: 40px;
+}
+
+.progress-bar .step {
+ width: 35px;
+ height: 35px;
+ border-radius: 50%;
+ background: #333;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-weight: bold;
+ color: #e5e5e7; /* Zahlen deutlich heller gemacht */
+ transition: 0.3s;
+}
+
+.progress-bar .step.active {
+ background: #4caf50 !important; /* Grün statt Rot/Blau */
+ color: white;
+ border-color: #4caf50 !important;
+}
+
+.progress-bar .line {
+ height: 4px;
+ width: 80px;
+ background: #333;
+ margin: 0 15px;
+ transition: all 0.5s ease;
+}
+
+.progress-bar .line.active {
+ background: #4caf50 !important;
+}
+/* Zahlungsarten */
+.payment-grid {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 15px;
+}
+
+.payment-method {
+ background: #1c1c1e;
+ padding: 20px;
+ border-radius: 12px;
+ cursor: pointer;
+ border: 2px solid transparent;
+ display: flex;
+ flex-direction: row; /* Nebeneinander statt untereinander */
+ align-items: center; /* Vertikal zentriert */
+ justify-content: center;
+ gap: 15px;
+ transition: 0.3s;
+}
+
+.payment-method img {
+ height: 22px; /* Einheitliche Größe */
+ width: auto;
+ margin-top: 2px; /* Schiebt das Bild dezent nach unten für optische Symmetrie zum Text */
+}
+
+.payment-method:hover {
+ border-color: #888;
+}
+
+.payment-method.selected {
+ border-color: #e50914;
+ background: rgba(229, 9, 20, 0.1);
+ transform: scale(1.02);
+}
+
+/* Hover-Effekt für den Zurück-Pfeil */
+#btn-back-to-step1:hover {
+ opacity: 1;
+ transform: translateX(-3px);
+}
+
+.cart-header-row,
+.cart-item-row {
+ display: grid;
+ /* Spalten: Menge(100px) | Bild(100px) | Produkt(1.5fr) | Details(2fr) | Preis(100px) | Aktion(80px) */
+ grid-template-columns: 100px 100px 1.5fr 2fr 100px 80px;
+ gap: 15px;
+ align-items: center;
+ padding: 15px 20px;
+}
+
+.cart-header-row,
+.cart-item-row {
+ display: grid;
+ /* Menge | Bild | Produkt | Details | Preis | Aktion */
+ grid-template-columns: 110px 100px 1.3fr 1.7fr 100px 60px;
+ gap: 10px;
+ align-items: center;
+ padding: 15px 20px;
+}
+
+.col-amount { text-align: center; }
+.col-img { text-align: center; }
+
+/* Produkt & Details nach rechts schieben */
+.col-product {
+ text-align: left;
+ padding-left: 25px; /* Minimal mehr nach rechts */
+}
+
+.col-details {
+ text-align: left;
+ padding-left: 35px; /* Minimal mehr nach rechts */
+}
+
+/* Preis weiter links ausrichten */
+.col-price {
+ text-align: left;
+ padding-left: 10px;
+}
+
+.col-action { text-align: right; }
+
+/* Menge-Stepper im Warenkorb */
+.qty-stepper {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ background: #2c2c2e;
+ padding: 5px 10px;
+ border-radius: 8px;
+ width: fit-content;
+}
+
+.btn-qty {
+ cursor: pointer;
+ width: 28px;
+ height: 28px;
+ border: none;
+ background: #3a3a3c;
+ color: white;
+ border-radius: 6px;
+ font-weight: bold;
+ transition: 0.2s;
+}
+/* Klick-Zustand: Leicht eindrücken */
+.btn-qty:active,
+.btn-delete-item:active {
+ transform: scale(0.95);
+}
+
+/* Spezifisches Styling für den Mülleimer (damit der Hover-Hintergrund passt) */
+.btn-delete-item {
+ background: none;
+ border: none;
+ font-size: 1.2rem;
+ padding: 5px 8px; /* Etwas Platz für den blauen Hintergrund */
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.cart-img-small {
+ width: 60px;
+ height: 85px;
+ object-fit: cover;
+ border-radius: 6px;
+ box-shadow: 0 4px 10px rgba(0,0,0,0.3);
+}
+
+.cart-item-info {
+ color: #0071e3;
+ font-size: 0.9rem;
+ line-height: 1.4;
+}
+
+/* --- Luxury Dark Ticket --- */
+.luxury-ticket {
+ background: #111; /* Dunkel statt Weiß */
+ color: #f5f5f7;
+ display: flex;
+ max-width: 600px;
+ margin: 20px auto;
+ border-radius: 15px;
+ overflow: hidden;
+ border: 1px solid #333;
+ box-shadow: 0 20px 40px rgba(0,0,0,0.8);
+}
+
+.ticket-left {
+ width: 35%;
+}
+
+.ticket-poster {
+ width: 100%;
+ height: 100%;
+ object-fit: cover;
+}
+
+.ticket-right {
+ width: 65%;
+ padding: 25px;
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+}
+
+.ticket-brand {
+ font-size: 0.7rem;
+ letter-spacing: 3px;
+ color: #0071e3;
+ margin-bottom: 10px;
+}
+
+.ticket-title {
+ font-size: 1.8rem;
+ margin-bottom: 20px;
+ border-bottom: 1px solid #333;
+ padding-bottom: 10px;
+}
+
+.ticket-details p {
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 8px;
+ font-size: 0.9rem;
+}
+
+.ticket-details span {
+ color: #86868b;
+}
+
+.ticket-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-end;
+ margin-top: 20px;
+}
+
+.ticket-qr {
+ width: 100px;
+ height: 100px;
+ border: 5px solid white; /* Weißer Rand für Scanbarkeit auf dunklem Grund */
+ border-radius: 5px;
+}
+
+.ticket-code {
+ font-family: 'Courier New', Courier, monospace;
+ color: #444;
+ font-size: 1.2rem;
+}
+
+/* Kinoticket */
+.kinoticket {
+ background: #fff;
+ color: #000;
+ padding: 20px;
+ border-radius: 15px;
+ max-width: 300px; /* Begrenzt die Breite des Tickets */
+ margin: 20px auto;
+ text-align: center;
+ box-shadow: 0 10px 30px rgba(0,0,0,0.5);
+}
+
+.kinoticket .poster {
+ width: 100%;
+ max-height: 180px; /* Macht das Bild deutlich kleiner */
+ object-fit: cover; /* Verhindert Verzerrung */
+ border-radius: 10px;
+ margin-bottom: 15px;
+}
+
+.kinoticket h3 {
+ margin: 10px 0 5px;
+ font-size: 1.2rem;
+}
+.kinoticket p { color: #ccc; margin-bottom: 5px; font-size: 0.9rem; }
+.kinoticket .seats { font-weight: bold; color: #e50914; margin-top: 10px; font-size: 1.1rem; }
+
+.kinoticket .qr-code {
+ background: white;
+ padding: 10px;
+ display: inline-block;
+ margin-top: 15px;
+ border: 1px solid #ddd;
+}
+
+.kinoticket .qr-code img {
+ width: 130px; /* Feste Größe für den QR-Code */
+ height: 130px;
+ display: block;
+}
+
+/* Fix für Screenshot 1: Modal-Info Zeile */
+#modal-info-text {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 15px;
+}
+
+/* --- Lösch-Animation nach Links --- */
+.cart-item-row.slide-out-left {
+ animation: slideOutLeft 0.4s ease forwards;
+ pointer-events: none; /* Verhindert Klicks während der Animation */
+}
+
+@keyframes slideOutLeft {
+ 0% {
+ transform: translateX(0);
+ opacity: 1;
+ }
+ 100% {
+ transform: translateX(-100%); /* Vollständig nach links raus */
+ opacity: 0;
+ /* Verhindert, dass die Lücke abrupt kollabiert */
+ height: 0;
+ padding-top: 0;
+ padding-bottom: 0;
+ margin-top: 0;
+ margin-bottom: 0;
+ border: none;
+ }
+}
+.summary-box-black {
+ background-color: #1c1c1e !important;
+ padding: 35px;
+ border-radius: 28px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ position: sticky;
+ top: 120px;
+}
+
+.summary-row-large {
+ display: flex;
+ justify-content: space-between;
+ font-size: 1.6rem;
+ font-weight: 600;
+ margin-top: 25px;
+}
+
+.blue-button {
+ width: 100%;
+ background: var(--accent-blue);
+ color: white;
+ border: none;
+ padding: 18px;
+ border-radius: 14px;
+ font-weight: bold;
+ font-size: 1.1rem;
+ margin-top: 30px;
+ cursor: pointer;
+ transition: all 0.3s ease;
+}
+
+.blue-button:hover {
+ background: #0077ed;
+ transform: scale(1.02);
+}
+
+.summary-content {
+ width: 100%;
+ max-width: 350px;
+ text-align: right;
+}
+
+.total-row {
+ font-size: 1.5rem;
+ font-weight: bold;
+ display: flex;
+ justify-content: space-between;
+ margin-bottom: 5px;
+}
+
+.vat-row {
+ color: #86868b;
+ font-size: 0.9rem;
+ margin-bottom: 20px;
+}
+
+.checkout-main-btn {
+ width: 100%;
+ padding: 16px;
+ background: #e50914;
+ color: white;
+ border: none;
+ border-radius: 8px;
+ font-weight: bold;
+ font-size: 1.1rem;
+ cursor: pointer;
+ transition: transform 0.2s, background 0.2s;
+}
+
+.checkout-main-btn:hover {
+ background: #f40a16;
+ transform: translateY(-2px);
+}
+
+#modal-info-text {
+ display: block; /* Verhindert das Nebeneinanderquetschen */
+ margin-top: 5px;
+ color: #ccc;
+}
+
+.modal-header-container {
+ padding-bottom: 15px;
+ border-bottom: 1px solid #333;
+ margin-bottom: 20px;
+}
+
+#snacks-view, #movie-list-view, #cart-view {
+ padding-bottom: 100px; /* Platz unten lassen */
+ min-height: 100vh;
+ overflow-y: auto; /* Sicherstellen, dass gescrollt werden kann */
+}
+
+/* --- Account View (stabil & sichtbar) --- */
+#account-view {
+ padding: 130px 8% 60px;
+ min-height: 100vh;
+}
+
+.account-login-box,
+.account-panel {
+ width: min(820px, 100%);
+ margin: 0 auto;
+ background: #1c1c1e;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 24px;
+ padding: 28px;
+}
+
+.account-login-box {
+ display: flex;
+ flex-direction: column;
+ align-items: stretch;
+}
+
+.account-login-box h2,
+.account-panel h2 {
+ margin-bottom: 16px;
+}
+
+.account-login-box input {
+ width: 100%;
+ margin-bottom: 12px;
+ padding: 12px 14px;
+ background: #111214;
+ border: 1px solid #3a3a3a;
+ border-radius: 10px;
+ color: #fff;
+}
+
+.account-login-box button {
+ width: 100%;
+ margin-top: 10px;
+ padding: 12px 14px;
+ border: 0;
+ border-radius: 10px;
+ background: #0071e3;
+ color: #fff;
+ cursor: pointer;
+}
+
+#btn-forgot-password {
+ width: auto !important;
+ align-self: flex-start;
+ margin-top: 2px;
+ margin-bottom: 12px;
+ padding: 0;
+ background: transparent !important;
+ border: none !important;
+ color: #95bce9;
+ font-size: 0.82rem;
+ text-decoration: underline;
+}
+
+#btn-open-register {
+ width: auto !important;
+ align-self: flex-start;
+ margin-top: 6px;
+ padding: 8px 14px !important;
+ font-size: 0.82rem;
+ background: #2a2d31 !important;
+ border: 1px solid #4d4f54 !important;
+}
+
+#account-register-hint {
+ margin-top: 18px;
+ margin-bottom: 2px;
+ font-size: 0.82rem;
+ color: #9ca0a8;
+ align-self: flex-start;
+}
+
+/* --- Auth Modals (Register + Forgot) --- */
+.account-auth-modal {
+ width: min(460px, 92vw);
+ max-width: 460px;
+ padding: 30px 24px 22px;
+ border-radius: 22px;
+ background: linear-gradient(180deg, #1f2125 0%, #181a1e 100%);
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.45);
+}
+
+.account-auth-modal h2 {
+ font-size: 1.45rem;
+ margin-bottom: 8px;
+}
+
+.auth-modal-subtitle {
+ color: #9da3ad;
+ font-size: 0.9rem;
+ margin-bottom: 16px;
+ line-height: 1.4;
+}
+
+.account-auth-modal input {
+ width: 100%;
+ margin-bottom: 11px;
+ padding: 12px 13px;
+ border-radius: 10px;
+ border: 1px solid #3a3f46;
+ background: #111317;
+ color: #f5f5f7;
+ outline: none;
+ transition: border-color 0.2s ease, box-shadow 0.2s ease;
+}
+
+.account-auth-modal input:focus {
+ border-color: #0071e3;
+ box-shadow: 0 0 0 3px rgba(0, 113, 227, 0.18);
+}
+
+.auth-submit-btn {
+ width: 100%;
+ margin-top: 6px;
+ padding: 12px 14px;
+ border: 0;
+ border-radius: 11px;
+ background: #0071e3;
+ color: #fff;
+ font-weight: 600;
+ cursor: pointer;
+ transition: background 0.2s ease, transform 0.15s ease;
+}
+
+.auth-submit-btn:hover {
+ background: #0a7cf0;
+ transform: translateY(-1px);
+}
+
+#reset-message {
+ margin-top: 12px;
+ padding: 10px 12px;
+ border-radius: 10px;
+ background: rgba(17, 101, 42, 0.22);
+ border: 1px solid rgba(74, 199, 123, 0.32);
+ color: #84e5aa;
+ font-size: 0.88rem;
+}
+
+.account-panel-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 16px;
+}
+
+.account-logout-btn {
+ border: 1px solid #4a4a4a;
+ background: transparent;
+ color: #fff;
+ border-radius: 10px;
+ padding: 8px 12px;
+ cursor: pointer;
+}
+
+.account-tabs {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin: 20px 0 16px;
+}
+
+.account-tab-btn {
+ border: 1px solid #3f3f3f;
+ background: #151618;
+ color: #fff;
+ border-radius: 999px;
+ padding: 8px 14px;
+ cursor: pointer;
+}
+
+#account-tab-content {
+ margin-top: 8px;
+}
+
+.account-card,
+.order-box {
+ background: #111214;
+ border: 1px solid #2f2f2f;
+ border-radius: 12px;
+ padding: 14px 16px;
+ margin-bottom: 10px;
+}
+
+/* --- Cart Columns (final override) --- */
+#cart-items-list .cart-header-row,
+#cart-items-list .cart-item-row {
+ display: grid;
+ grid-template-columns: 120px 90px 1.2fr 1.5fr 130px 70px;
+ gap: 12px;
+ align-items: center;
+}
+
+#cart-items-list .cart-header-row {
+ padding: 12px 8px;
+ margin-bottom: 6px;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.15);
+ color: #9ca0a8;
+ font-size: 0.74rem;
+ font-weight: 700;
+ letter-spacing: 1px;
+}
+
+#cart-items-list .cart-item-row {
+ padding: 16px 8px;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+#cart-items-list .col-amount {
+ display: flex;
+ justify-content: center;
+}
+
+#cart-items-list .col-img {
+ display: flex;
+ justify-content: center;
+}
+
+#cart-items-list .col-product {
+ font-weight: 600;
+}
+
+#cart-items-list .col-details {
+ color: #8fbef6;
+ font-size: 0.9rem;
+ line-height: 1.35;
+}
+
+#cart-items-list .col-price {
+ font-weight: 700;
+ text-align: right;
+ padding-right: 18px;
+}
+
+#cart-items-list .cart-header-row .col-price {
+ text-align: left;
+ padding-left: 8px;
+ padding-right: 0;
+}
+
+#cart-items-list .col-action {
+ display: flex;
+ justify-content: flex-end;
+ text-align: right;
+ padding-right: 0;
+}
+
+#cart-items-list .btn-delete-item {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 34px;
+ height: 34px;
+ border-radius: 8px;
+ border: 1px solid #7a3a45;
+ background: #2b1116;
+ color: #ff7a90;
+ font-size: 1.05rem;
+ opacity: 1;
+ transform: translateX(6px);
+}
+
+#cart-items-list .btn-delete-item:hover {
+ background: #3a161d;
+ color: #ff95a7;
+ border-color: #97505d;
+ transform: translateX(6px) scale(1.06);
+}
+
+#cart-items-list .btn-delete-item:active {
+ transform: translateX(6px) scale(0.96);
+}
+
+.cart-img-fallback {
+ width: 60px;
+ height: 85px;
+ border-radius: 8px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.7rem;
+ text-align: center;
+ background: #2b2d31;
+ color: #aeb3bb;
+ padding: 6px;
+}
+
+@media (max-width: 980px) {
+ .cart-container {
+ flex-direction: column;
+ gap: 24px;
+ }
+
+ .cart-right {
+ width: 100%;
+ min-width: 0;
+ }
+
+ #cart-items-list .cart-header-row {
+ display: none;
+ }
+
+ #cart-items-list .cart-item-row {
+ grid-template-columns: 1fr;
+ gap: 10px;
+ padding: 14px 0;
+ }
+
+ #cart-items-list .col-amount,
+ #cart-items-list .col-img,
+ #cart-items-list .col-action {
+ justify-content: flex-start;
+ text-align: left;
+ }
+
+ #cart-items-list .col-price {
+ text-align: left;
+ }
+}
+
+/* --- Seat Map Refresh (Cinema-Like Layout) --- */
+.seat-map-container {
+ perspective: 900px;
+}
+
+#seat-grid.seat-grid-custom {
+ display: flex;
+ flex-direction: column;
+ gap: 9px;
+ align-items: center;
+ min-width: max-content;
+ padding: 16px 8px 6px;
+ transform: rotateX(4deg);
+ transform-origin: top center;
+}
+
+#seat-grid .seat-row.cinema-row {
+ display: grid;
+ grid-template-columns: 28px auto 40px auto 28px;
+ align-items: center;
+ gap: 9px;
+ width: max-content;
+ margin-left: var(--row-indent, 0);
+ margin-right: var(--row-indent, 0);
+}
+
+#seat-grid .row-seat-block {
+ display: flex;
+ gap: 7px;
+}
+
+#seat-grid .row-label {
+ font-size: 0.72rem;
+ letter-spacing: 1px;
+ color: #8f949c;
+ font-weight: 700;
+ text-align: center;
+}
+
+#seat-grid .row-label-right {
+ opacity: 0.65;
+}
+
+#seat-grid .aisle-gap {
+ width: 40px;
+ height: 1px;
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.25), transparent);
+}
+
+#seat-grid .seat {
+ width: 24px;
+ height: 20px;
+ border-radius: 8px 8px 5px 5px;
+ border: 1px solid rgba(255, 255, 255, 0.18);
+ position: relative;
+ appearance: none;
+ padding: 0;
+ cursor: pointer;
+ transition: transform 0.2s ease, box-shadow 0.2s ease, background 0.2s ease;
+}
+
+#seat-grid .seat::before {
+ content: "";
+ position: absolute;
+ left: 2px;
+ right: 2px;
+ top: -4px;
+ height: 5px;
+ border-radius: 5px 5px 0 0;
+ background: inherit;
+ opacity: 0.92;
+}
+
+#seat-grid .seat:hover:not(.occupied) {
+ transform: translateY(-2px) scale(1.08);
+ box-shadow: 0 10px 20px rgba(0, 0, 0, 0.45);
+}
+
+#seat-grid .seat.normal,
+#seat-grid .seat.imax {
+ background: linear-gradient(180deg, #45484f 0%, #2f3238 100%);
+}
+
+#seat-grid .seat.vip {
+ background: linear-gradient(180deg, #ffb74d 0%, #ff8f00 100%);
+}
+
+#seat-grid .seat.dbox {
+ background: linear-gradient(180deg, #ffeb3b 0%, #f9a825 100%);
+}
+
+#seat-grid .seat.selected {
+ background: linear-gradient(180deg, #56f189 0%, #28a745 100%) !important;
+ box-shadow: 0 0 14px rgba(69, 233, 120, 0.72);
+ border-color: #d6ffe4;
+}
+
+#seat-grid .seat.occupied {
+ background: linear-gradient(180deg, #ef5350 0%, #c62828 100%) !important;
+ opacity: 1;
+ cursor: not-allowed;
+}
+
+#seat-grid .seat:disabled {
+ opacity: 1;
+}
+
+#seat-grid .seat.occupied::after {
+ content: "×";
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #fff;
+ font-size: 14px;
+ font-weight: 700;
+}
+
+#dynamic-legend {
+ margin-top: 14px;
+}
+
+#summary-items .summary-row {
+ display: flex;
+ justify-content: space-between;
+ gap: 14px;
+ padding: 7px 0;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+ font-size: 0.9rem;
+}
+
+/* --- April 2026 Refresh --- */
+.hero-overlay {
+ max-width: 860px;
+ border-radius: 24px;
+ background: linear-gradient(90deg, rgba(6, 9, 14, 0.7), rgba(6, 9, 14, 0.25));
+ backdrop-filter: blur(2px);
+}
+
+.running-poster {
+ display: flex;
+ flex-direction: column;
+}
+
+.running-poster img {
+ height: 240px;
+ object-position: center 18%;
+}
+
+.running-meta {
+ display: flex;
+ flex-direction: column;
+ min-height: 150px;
+}
+
+.running-meta p {
+ margin-bottom: 14px;
+}
+
+.open-program-btn {
+ margin-top: auto;
+}
+
+/* --- Latest home/account refinement --- */
+.hero {
+ min-height: 94vh;
+}
+
+.hero::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(180deg, rgba(3, 5, 8, 0.05) 0%, rgba(3, 5, 8, 0.62) 80%, rgba(3, 5, 8, 0.88) 100%);
+ pointer-events: none;
+ z-index: 1;
+}
+
+.hero-overlay {
+ z-index: 2;
+ max-width: 980px;
+ padding: 180px 8% 118px;
+ background: transparent;
+ backdrop-filter: none;
+ border-radius: 0;
+ text-shadow: 0 8px 30px rgba(0, 0, 0, 0.45);
+}
+
+.hero-slide {
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-color: #06080d;
+ transform: none;
+}
+
+.hero-slide.active {
+ transform: none;
+}
+
+.home-experience {
+ margin-top: 34px;
+ display: grid;
+ grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
+ gap: 16px;
+}
+
+.experience-main-card,
+.experience-side-card {
+ background: linear-gradient(158deg, #151820 0%, #0f1219 100%);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 18px;
+ padding: 20px 20px 22px;
+}
+
+.experience-main-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ gap: 12px;
+ margin-bottom: 10px;
+}
+
+.experience-main-head h3 {
+ font-size: 1.25rem;
+}
+
+.experience-main-head span {
+ color: #9aa4b2;
+ font-size: 0.78rem;
+}
+
+.experience-main-card p,
+.experience-side-card p {
+ color: #b4becb;
+ line-height: 1.5;
+ font-size: 0.92rem;
+}
+
+.experience-tags,
+.experience-chip-row {
+ margin-top: 14px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.experience-tags span,
+.experience-chip-row span {
+ border-radius: 999px;
+ border: 1px solid rgba(0, 113, 227, 0.45);
+ background: rgba(0, 113, 227, 0.16);
+ color: #c4dffe;
+ padding: 4px 11px;
+ font-size: 0.76rem;
+}
+
+.experience-side-stack {
+ display: grid;
+ gap: 16px;
+}
+
+.collector-card .collector-placeholder-grid {
+ margin-top: 12px;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.collector-card .collector-slot {
+ min-height: 100px;
+}
+
+.account-orders-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
+ gap: 10px;
+ margin-top: 8px;
+}
+
+.order-item-btn {
+ width: 100%;
+ text-align: left;
+ cursor: pointer;
+ transition: border-color 0.2s ease, transform 0.2s ease, background 0.2s ease;
+}
+
+.order-item-btn:hover {
+ border-color: rgba(0, 113, 227, 0.58);
+ transform: translateY(-2px);
+}
+
+.order-item-btn.active {
+ border-color: #0071e3;
+ background: linear-gradient(150deg, #162334 0%, #111720 100%);
+}
+
+.order-item-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 8px;
+}
+
+.order-item-head h4 {
+ font-size: 0.98rem;
+}
+
+.order-item-head span {
+ color: #9ed0ff;
+ font-weight: 700;
+ font-size: 0.86rem;
+}
+
+.order-ticket-details {
+ margin-top: 14px;
+}
+
+.order-ticket-card {
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 16px;
+ background: linear-gradient(155deg, #12161f 0%, #0c1017 100%);
+ padding: 14px;
+ display: grid;
+ grid-template-columns: 120px minmax(0, 1fr);
+ gap: 14px;
+}
+
+.order-ticket-poster img {
+ width: 100%;
+ height: 100%;
+ max-height: 180px;
+ object-fit: cover;
+ border-radius: 10px;
+}
+
+.order-ticket-poster-fallback {
+ height: 100%;
+ min-height: 150px;
+ border-radius: 10px;
+ background: #202632;
+ color: #9aa4b2;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.8rem;
+}
+
+.order-ticket-brand {
+ color: #9ec3ee;
+ font-size: 0.73rem;
+ letter-spacing: 0.8px;
+ margin-bottom: 6px;
+}
+
+.order-ticket-content h4 {
+ margin-bottom: 10px;
+}
+
+.order-ticket-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 8px 14px;
+}
+
+.order-ticket-grid p {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ margin: 0;
+}
+
+.order-ticket-grid span {
+ font-size: 0.74rem;
+ color: #8c98a9;
+}
+
+.order-ticket-grid strong {
+ font-size: 0.9rem;
+}
+
+.payment-logo-slot img {
+ max-width: 72%;
+ max-height: 30px;
+ object-fit: contain;
+ filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.35));
+}
+
+@media (max-width: 1000px) {
+ .home-experience {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 720px) {
+ .hero-overlay {
+ padding: 145px 6% 92px;
+ }
+
+ .order-ticket-card {
+ grid-template-columns: 1fr;
+ }
+
+ .order-ticket-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .collector-card .collector-placeholder-grid {
+ grid-template-columns: 1fr;
+ }
+}
+
+.home-feature-grid {
+ margin-top: 34px;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
+ gap: 14px;
+}
+
+.feature-card {
+ background: linear-gradient(155deg, #17191f 0%, #101218 100%);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 16px;
+ padding: 16px 16px 18px;
+}
+
+.feature-card h4 {
+ margin-bottom: 8px;
+ font-size: 0.95rem;
+}
+
+.feature-card p {
+ color: #a7afbb;
+ font-size: 0.86rem;
+ line-height: 1.45;
+}
+
+.feature-card-wide {
+ grid-column: span 2;
+}
+
+.hall-tags {
+ margin-top: 12px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.hall-tags span {
+ border: 1px solid rgba(0, 113, 227, 0.5);
+ background: rgba(0, 113, 227, 0.18);
+ color: #c6e1ff;
+ border-radius: 999px;
+ padding: 4px 10px;
+ font-size: 0.75rem;
+}
+
+.feature-highlight {
+ margin-top: 12px;
+ background: rgba(255, 255, 255, 0.04);
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 10px;
+ color: #d8dee8;
+ padding: 8px 10px;
+ font-size: 0.8rem;
+}
+
+.feature-card-collector {
+ grid-column: span 2;
+}
+
+.collector-placeholder-grid {
+ margin-top: 12px;
+ display: grid;
+ grid-template-columns: repeat(3, 1fr);
+ gap: 10px;
+}
+
+.collector-slot {
+ min-height: 90px;
+ border-radius: 12px;
+ border: 1px dashed rgba(255, 255, 255, 0.25);
+ background: linear-gradient(140deg, rgba(255, 255, 255, 0.04), rgba(255, 255, 255, 0.02));
+ color: #9ca6b3;
+ font-size: 0.78rem;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ padding: 6px;
+}
+
+#cart-items-list .qty-static {
+ min-width: 68px;
+ text-align: center;
+ padding: 7px 10px;
+ border-radius: 999px;
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ background: rgba(255, 255, 255, 0.05);
+ color: #d8dce3;
+ font-weight: 600;
+}
+
+.account-payments-note {
+ color: #9aa1ad;
+ font-size: 0.9rem;
+ margin-bottom: 12px;
+}
+
+.account-payment-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
+ gap: 10px;
+}
+
+.account-payment-card {
+ background: #141518;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 12px;
+ padding: 12px;
+}
+
+.account-payment-card h4 {
+ font-size: 0.9rem;
+ margin-bottom: 4px;
+}
+
+.account-payment-card p {
+ color: #9aa1ad;
+ font-size: 0.8rem;
+}
+
+.payment-logo-slot {
+ height: 52px;
+ border-radius: 10px;
+ border: 1px dashed rgba(255, 255, 255, 0.28);
+ margin-bottom: 10px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #9aa1ad;
+ font-size: 0.8rem;
+}
+
+@media (max-width: 900px) {
+ .feature-card-wide,
+ .feature-card-collector {
+ grid-column: span 1;
+ }
+
+ .collector-placeholder-grid {
+ grid-template-columns: 1fr;
+ }
+}
+/* =========================================================
+ Cinecity-Inspired Home + Program Refresh
+ ========================================================= */
+
+.hero {
+ position: relative;
+ min-height: 92vh;
+ height: auto;
+ display: block;
+ overflow: hidden;
+ isolation: isolate;
+}
+
+.hero-slider {
+ position: absolute;
+ inset: 0;
+}
+
+.hero-slide {
+ position: absolute;
+ inset: 0;
+ background-size: cover;
+ background-position: center;
+ opacity: 0;
+ transform: scale(1.03);
+ transition: opacity 0.8s ease, transform 1.4s ease;
+}
+
+.hero-slide.active {
+ opacity: 1;
+ transform: scale(1);
+}
+
+.hero-overlay {
+ position: relative;
+ z-index: 2;
+ max-width: 760px;
+ margin: 0 auto;
+ padding: 190px 10% 130px;
+ text-align: left;
+}
+
+.hero-overlay h1 {
+ font-size: clamp(2.2rem, 5vw, 4.7rem);
+ letter-spacing: 0.4px;
+ margin: 12px 0;
+}
+
+.hero-overlay p {
+ color: #d1d4da;
+ font-size: 1.05rem;
+ max-width: 620px;
+ margin-bottom: 22px;
+}
+
+.hero-dots {
+ margin-top: 22px;
+ display: flex;
+ gap: 10px;
+ align-items: center;
+}
+
+.hero-dot {
+ width: 30px;
+ height: 6px;
+ border-radius: 99px;
+ border: 0;
+ background: rgba(255, 255, 255, 0.3);
+ cursor: pointer;
+}
+
+.hero-dot.active {
+ background: #0071e3;
+}
+
+.cinema-home {
+ background:
+ radial-gradient(circle at 20% -10%, rgba(0, 113, 227, 0.15), transparent 45%),
+ radial-gradient(circle at 85% 15%, rgba(255, 255, 255, 0.08), transparent 38%),
+ #07080b;
+ border-top: 1px solid rgba(255, 255, 255, 0.08);
+}
+
+.home-poster-band {
+ margin-top: 18px;
+ padding: 18px;
+ background: rgba(255, 255, 255, 0.03);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 18px;
+}
+
+.home-band-header {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ margin-bottom: 14px;
+}
+
+.home-band-header h3 {
+ font-size: 1.2rem;
+}
+
+.home-band-header span {
+ color: #8f95a0;
+ font-size: 0.85rem;
+}
+
+.now-running-row {
+ display: grid;
+ grid-template-columns: repeat(auto-fill, minmax(180px, 1fr));
+ gap: 14px;
+}
+
+.running-poster {
+ background: #121317;
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 14px;
+ overflow: hidden;
+}
+
+.running-poster img {
+ width: 100%;
+ height: 210px;
+ object-fit: cover;
+ display: block;
+}
+
+.running-meta {
+ padding: 12px;
+}
+
+.running-meta h4 {
+ font-size: 0.95rem;
+ margin-bottom: 4px;
+}
+
+.running-meta p {
+ color: #94a0af;
+ font-size: 0.78rem;
+ margin-bottom: 10px;
+}
+
+.open-program-btn {
+ width: 100%;
+ border: 1px solid rgba(255, 255, 255, 0.25);
+ background: transparent;
+ color: #e7ebf0;
+ border-radius: 8px;
+ font-size: 0.78rem;
+ padding: 7px 10px;
+ cursor: pointer;
+}
+
+.open-program-btn:hover {
+ background: rgba(255, 255, 255, 0.08);
+}
+
+.home-program-head {
+ margin-top: 36px;
+}
+
+.home-program-grid {
+ margin-top: 10px;
+}
+
+.home-movie-card {
+ box-shadow: 0 20px 30px rgba(0, 0, 0, 0.3);
+}
+
+.home-info-grid {
+ margin-top: 34px;
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
+ gap: 14px;
+}
+
+.info-card {
+ background: linear-gradient(155deg, #17191f 0%, #101218 100%);
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ border-radius: 16px;
+ padding: 16px 16px 18px;
+}
+
+.info-card h4 {
+ margin-bottom: 8px;
+ font-size: 0.95rem;
+}
+
+.info-card p {
+ color: #a7afbb;
+ font-size: 0.86rem;
+ line-height: 1.45;
+}
+
+.movie-list-shell {
+ padding: 120px 8% 60px;
+}
+
+.list-subtitle {
+ margin-top: 8px;
+ color: #9aa1ac;
+ margin-bottom: 22px;
+}
+
+.movie-program-list {
+ display: flex;
+ flex-direction: column;
+ gap: 28px;
+}
+
+.program-card {
+ border: 1px solid rgba(255, 255, 255, 0.08);
+ box-shadow: 0 22px 40px rgba(0, 0, 0, 0.33);
+}
+
+.program-card .card-header {
+ margin-bottom: 12px;
+}
+
+.program-card .description {
+ color: #c2c8d1;
+ margin-bottom: 16px;
+ line-height: 1.55;
+}
+
+.program-day-tabs {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 14px;
+}
+
+.program-day-tab {
+ min-width: 78px;
+ border: 1px solid rgba(255, 255, 255, 0.16);
+ background: rgba(255, 255, 255, 0.03);
+ color: #f2f5f9;
+ border-radius: 12px;
+ padding: 7px 10px;
+ cursor: pointer;
+ display: inline-flex;
+ flex-direction: column;
+ align-items: flex-start;
+ gap: 3px;
+}
+
+.program-day-tab small {
+ font-size: 0.72rem;
+ color: #94a0ad;
+}
+
+.program-day-tab.active {
+ border-color: #0071e3;
+ background: rgba(0, 113, 227, 0.2);
+}
+
+.program-schedule-shell {
+ margin-top: 0;
+}
+
+.program-schedule-body {
+ display: flex;
+ flex-direction: column;
+ gap: 8px;
+}
+
+.program-time-row {
+ width: 100%;
+ text-align: left;
+ padding: 12px 14px;
+ display: grid;
+ grid-template-columns: 1fr 130px 90px;
+ align-items: center;
+ gap: 10px;
+ border: 1px solid rgba(255, 255, 255, 0.09);
+ background: rgba(0, 0, 0, 0.2);
+}
+
+.program-time-row:hover {
+ border-color: #0071e3;
+ transform: translateX(3px);
+}
+
+.hall-pill {
+ justify-self: center;
+ font-size: 0.78rem;
+ color: #bcd6f6;
+ border: 1px solid rgba(0, 113, 227, 0.4);
+ background: rgba(0, 113, 227, 0.15);
+ border-radius: 999px;
+ padding: 4px 10px;
+}
+
+.flash-focus {
+ animation: cardFlash 1.1s ease;
+}
+
+@keyframes cardFlash {
+ 0% {
+ box-shadow: 0 0 0 rgba(0, 113, 227, 0);
+ transform: translateY(0);
+ }
+ 40% {
+ box-shadow: 0 0 0 4px rgba(0, 113, 227, 0.35);
+ transform: translateY(-2px);
+ }
+ 100% {
+ box-shadow: 0 0 0 rgba(0, 113, 227, 0);
+ transform: translateY(0);
+ }
+}
+
+.reveal-on-scroll {
+ opacity: 0;
+ transform: translateY(28px);
+ transition: opacity 0.7s ease, transform 0.7s ease;
+}
+
+.reveal-on-scroll.is-visible {
+ opacity: 1;
+ transform: translateY(0);
+}
+
+@media (max-width: 900px) {
+ .hero-overlay {
+ padding: 150px 8% 90px;
+ }
+
+ .program-time-row {
+ grid-template-columns: 1fr;
+ align-items: flex-start;
+ }
+
+ .hall-pill {
+ justify-self: flex-start;
+ }
+
+ .movie-list-shell {
+ padding-left: 5%;
+ padding-right: 5%;
+ }
+}
+
+/* --- Final visual overrides --- */
+.hero-overlay {
+ max-width: 860px;
+ border-radius: 24px;
+ background: linear-gradient(90deg, rgba(6, 9, 14, 0.7), rgba(6, 9, 14, 0.25));
+ backdrop-filter: blur(2px);
+}
+
+.running-poster {
+ display: flex;
+ flex-direction: column;
+}
+
+.running-poster img {
+ height: 240px;
+ object-position: center 18%;
+}
+
+.running-meta {
+ display: flex;
+ flex-direction: column;
+ min-height: 150px;
+}
+
+.running-meta p {
+ margin-bottom: 14px;
+}
+
+.open-program-btn {
+ margin-top: auto;
+}
+
+/* --- 2026-04 final overrides (keep at file end) --- */
+.hero {
+ min-height: 94vh;
+}
+
+.hero::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(180deg, rgba(3, 5, 8, 0.05) 0%, rgba(3, 5, 8, 0.62) 80%, rgba(3, 5, 8, 0.88) 100%);
+ pointer-events: none;
+ z-index: 1;
+}
+
+.hero-overlay {
+ z-index: 2;
+ max-width: 980px;
+ padding: 180px 8% 118px;
+ background: transparent;
+ backdrop-filter: none;
+ border-radius: 0;
+ text-shadow: 0 8px 30px rgba(0, 0, 0, 0.45);
+}
+
+.home-experience {
+ margin-top: 34px;
+ display: grid;
+ grid-template-columns: minmax(0, 1.4fr) minmax(0, 1fr);
+ gap: 16px;
+}
+
+.experience-main-card,
+.experience-side-card {
+ background: linear-gradient(158deg, #151820 0%, #0f1219 100%);
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 18px;
+ padding: 20px 20px 22px;
+}
+
+.experience-main-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: baseline;
+ gap: 12px;
+ margin-bottom: 10px;
+}
+
+.experience-main-head h3 {
+ font-size: 1.25rem;
+}
+
+.experience-main-head span {
+ color: #9aa4b2;
+ font-size: 0.78rem;
+}
+
+.experience-main-card p,
+.experience-side-card p {
+ color: #b4becb;
+ line-height: 1.5;
+ font-size: 0.92rem;
+}
+
+.experience-tags,
+.experience-chip-row {
+ margin-top: 14px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.experience-tags span,
+.experience-chip-row span {
+ border-radius: 999px;
+ border: 1px solid rgba(0, 113, 227, 0.45);
+ background: rgba(0, 113, 227, 0.16);
+ color: #c4dffe;
+ padding: 4px 11px;
+ font-size: 0.76rem;
+}
+
+.experience-side-stack {
+ display: grid;
+ gap: 16px;
+}
+
+.collector-card .collector-placeholder-grid {
+ margin-top: 12px;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.collector-card .collector-slot {
+ min-height: 100px;
+}
+
+.account-orders-grid {
+ display: grid;
+ grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
+ gap: 10px;
+ margin-top: 8px;
+}
+
+.order-item-btn {
+ width: 100%;
+ text-align: left;
+ cursor: pointer;
+ transition: border-color 0.2s ease, transform 0.2s ease, background 0.2s ease;
+}
+
+.order-item-btn:hover {
+ border-color: rgba(0, 113, 227, 0.58);
+ transform: translateY(-2px);
+}
+
+.order-item-btn.active {
+ border-color: #0071e3;
+ background: linear-gradient(150deg, #162334 0%, #111720 100%);
+}
+
+.order-item-head {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 8px;
+}
+
+.order-item-head h4 {
+ font-size: 0.98rem;
+}
+
+.order-item-head span {
+ color: #9ed0ff;
+ font-weight: 700;
+ font-size: 0.86rem;
+}
+
+.order-ticket-details {
+ margin-top: 14px;
+}
+
+.order-ticket-card {
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ border-radius: 16px;
+ background: linear-gradient(155deg, #12161f 0%, #0c1017 100%);
+ padding: 14px;
+ display: grid;
+ grid-template-columns: 120px minmax(0, 1fr);
+ gap: 14px;
+}
+
+.order-ticket-poster img {
+ width: 100%;
+ height: 100%;
+ max-height: 180px;
+ object-fit: cover;
+ border-radius: 10px;
+}
+
+.order-ticket-poster-fallback {
+ height: 100%;
+ min-height: 150px;
+ border-radius: 10px;
+ background: #202632;
+ color: #9aa4b2;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 0.8rem;
+}
+
+.order-ticket-brand {
+ color: #9ec3ee;
+ font-size: 0.73rem;
+ letter-spacing: 0.8px;
+ margin-bottom: 6px;
+}
+
+.order-ticket-content h4 {
+ margin-bottom: 10px;
+}
+
+.order-ticket-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 8px 14px;
+}
+
+.order-ticket-grid p {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ margin: 0;
+}
+
+.order-ticket-grid span {
+ font-size: 0.74rem;
+ color: #8c98a9;
+}
+
+.order-ticket-grid strong {
+ font-size: 0.9rem;
+}
+
+.payment-logo-slot img {
+ max-width: 72%;
+ max-height: 30px;
+ object-fit: contain;
+ filter: drop-shadow(0 4px 12px rgba(0, 0, 0, 0.35));
+}
+
+@media (max-width: 1000px) {
+ .home-experience {
+ grid-template-columns: 1fr;
+ }
+}
+
+@media (max-width: 720px) {
+ .hero-overlay {
+ padding: 145px 6% 92px;
+ }
+
+ .order-ticket-card {
+ grid-template-columns: 1fr;
+ }
+
+ .order-ticket-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .collector-card .collector-placeholder-grid {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* hero slide clarity final */
+.hero-slide {
+ background-size: contain;
+ background-repeat: no-repeat;
+ background-position: center center;
+ background-color: #06080d;
+ transform: none;
+}
+
+.hero-slide.active {
+ transform: none;
+}
+
+/* --- 2026-04-21 final UX overrides --- */
+.hero-overlay {
+ padding: 230px 8% 74px;
+}
+
+.hero-slide {
+ background-size: cover;
+ background-repeat: no-repeat;
+ background-position: center 34%;
+ transform: scale(1.09);
+}
+
+.hero-slide.active {
+ transform: scale(1.02);
+}
+
+.home-inline-showcase {
+ margin-top: 36px;
+ display: flex;
+ flex-direction: column;
+ gap: 28px;
+}
+
+.inline-section {
+ display: grid;
+ grid-template-columns: 1.15fr 1fr;
+ border-radius: 26px;
+ overflow: hidden;
+ border: 1px solid rgba(255, 255, 255, 0.11);
+ background: #0d1118;
+ min-height: 290px;
+ box-shadow: 0 26px 50px rgba(0, 0, 0, 0.34);
+}
+
+.inline-media {
+ position: relative;
+ background-size: cover;
+ background-position: center;
+}
+
+.inline-media::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(110deg, rgba(4, 6, 10, 0.08), rgba(4, 6, 10, 0.58));
+}
+
+.inline-halls .inline-media {
+ background-image: linear-gradient(120deg, rgba(0, 113, 227, 0.3), rgba(7, 10, 16, 0.55)), url('img/shelter.jpg');
+}
+
+.inline-dbox .inline-media {
+ background-image: linear-gradient(120deg, rgba(255, 176, 0, 0.2), rgba(8, 12, 18, 0.62)), url('img/dbox.jpg');
+}
+
+.inline-collectors .inline-media {
+ background-image: linear-gradient(120deg, rgba(185, 124, 255, 0.15), rgba(8, 12, 18, 0.62)), url('img/popcorn.jpg');
+}
+
+.inline-content {
+ padding: 28px 26px;
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+}
+
+.inline-content h3 {
+ font-size: clamp(1.3rem, 2.3vw, 1.9rem);
+ margin-bottom: 12px;
+}
+
+.inline-content p {
+ color: #b4bfcc;
+ line-height: 1.58;
+ margin-bottom: 16px;
+}
+
+.inline-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ margin-bottom: 16px;
+}
+
+.inline-tags span {
+ border-radius: 999px;
+ border: 1px solid rgba(0, 113, 227, 0.5);
+ background: rgba(0, 113, 227, 0.16);
+ color: #cae3ff;
+ padding: 5px 11px;
+ font-size: 0.76rem;
+}
+
+.story-more-btn {
+ align-self: flex-start;
+ border: 1px solid rgba(255, 255, 255, 0.24);
+ background: rgba(255, 255, 255, 0.04);
+ color: #e8edf3;
+ border-radius: 999px;
+ padding: 10px 16px;
+ font-size: 0.82rem;
+ cursor: pointer;
+ transition: transform 0.25s ease, background 0.25s ease, border-color 0.25s ease, box-shadow 0.25s ease;
+}
+
+.story-more-btn:hover {
+ transform: translateY(-2px) scale(1.03);
+ background: rgba(0, 113, 227, 0.16);
+ border-color: rgba(0, 113, 227, 0.72);
+ box-shadow: 0 10px 24px rgba(0, 113, 227, 0.22);
+}
+
+.dbox-now-highlight {
+ border: 1px solid rgba(255, 181, 59, 0.5);
+ background: linear-gradient(160deg, rgba(255, 164, 27, 0.2), rgba(255, 213, 128, 0.08));
+ border-radius: 14px;
+ padding: 12px;
+ margin-bottom: 16px;
+}
+
+.dbox-now-highlight h4 {
+ font-size: 0.88rem;
+ margin-bottom: 8px;
+ color: #ffe2b5;
+}
+
+.dbox-mini-cards {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 8px;
+}
+
+.dbox-mini-cards div {
+ border-radius: 10px;
+ border: 1px solid rgba(255, 228, 168, 0.35);
+ background: rgba(23, 16, 8, 0.42);
+ padding: 7px 10px;
+ font-size: 0.78rem;
+ color: #f7dfb6;
+ text-align: center;
+}
+
+.home-modal-overlay {
+ position: fixed;
+ inset: 0;
+ background: rgba(2, 5, 10, 0.74);
+ backdrop-filter: blur(8px);
+ z-index: 2500;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 24px;
+}
+
+.home-modal-panel {
+ width: min(980px, 100%);
+ max-height: 90vh;
+ overflow-y: auto;
+ border-radius: 22px;
+ border: 1px solid rgba(255, 255, 255, 0.14);
+ background: linear-gradient(165deg, #171b24 0%, #10141c 100%);
+ padding: 22px;
+ position: relative;
+}
+
+.home-modal-wide {
+ width: min(1120px, 100%);
+}
+
+.home-modal-close {
+ position: absolute;
+ top: 14px;
+ right: 14px;
+ width: 34px;
+ height: 34px;
+ border-radius: 50%;
+ border: 0;
+ background: #2a2f3a;
+ color: #fff;
+ font-size: 1.2rem;
+ cursor: pointer;
+}
+
+.home-modal-sub {
+ color: #96a1b2;
+ margin-top: 4px;
+ margin-bottom: 14px;
+}
+
+.hall-modal-grid {
+ display: grid;
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ gap: 12px;
+}
+
+.hall-modal-item {
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 14px;
+ padding: 12px;
+ background: rgba(255, 255, 255, 0.02);
+}
+
+.hall-modal-item h4 {
+ margin-bottom: 10px;
+}
+
+.hall-modal-item textarea,
+.hall-modal-item input,
+.dbox-modal-section input,
+.collector-entry-content input {
+ width: 100%;
+ border-radius: 10px;
+ border: 1px solid #3e4658;
+ background: #111621;
+ color: #f3f6fb;
+ padding: 10px 11px;
+}
+
+.hall-modal-item textarea {
+ min-height: 100px;
+ resize: vertical;
+ margin-bottom: 8px;
+}
+
+.dbox-modal-section {
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ border-radius: 14px;
+ padding: 14px;
+ margin-top: 12px;
+}
+
+.dbox-image-grid {
+ margin-top: 12px;
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 10px;
+}
+
+.dbox-image-slot {
+ min-height: 98px;
+ border: 1px dashed rgba(255, 255, 255, 0.3);
+ border-radius: 12px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ color: #9aa8ba;
+ font-size: 0.78rem;
+}
+
+.modal-highlight {
+ margin-top: 14px;
+}
+
+.collector-zigzag {
+ margin-top: 14px;
+ display: flex;
+ flex-direction: column;
+ gap: 14px;
+}
+
+.collector-entry {
+ width: 82%;
+ display: grid;
+ grid-template-columns: 90px 1fr;
+ gap: 10px;
+ border-radius: 14px;
+ border: 1px solid rgba(255, 255, 255, 0.1);
+ background: rgba(255, 255, 255, 0.03);
+ padding: 12px;
+}
+
+.collector-entry.left {
+ align-self: flex-start;
+}
+
+.collector-entry.right {
+ align-self: flex-end;
+}
+
+.collector-film-logo {
+ border-radius: 10px;
+ border: 1px dashed rgba(255, 255, 255, 0.35);
+ min-height: 72px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ color: #9ba7b9;
+ font-size: 0.74rem;
+}
+
+.collector-entry-content h4 {
+ margin-bottom: 6px;
+}
+
+.collector-entry-content p {
+ color: #b3becc;
+ margin-bottom: 8px;
+ font-size: 0.9rem;
+}
+
+.account-payment-card {
+ text-align: left;
+ cursor: pointer;
+}
+
+.account-payment-card:hover {
+ border-color: rgba(0, 113, 227, 0.6);
+ transform: translateY(-2px);
+}
+
+.payment-logo-slot {
+ border: 1px solid rgba(255, 255, 255, 0.16);
+ background: rgba(255, 255, 255, 0.04);
+}
+
+.pay-modal-overlay {
+ position: fixed;
+ inset: 0;
+ z-index: 2600;
+ background: rgba(2, 4, 9, 0.72);
+ backdrop-filter: blur(8px);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 20px;
+}
+
+.pay-modal-panel {
+ width: min(460px, 100%);
+ border-radius: 18px;
+ border: 1px solid rgba(255, 255, 255, 0.16);
+ background: #12151d;
+ padding: 18px;
+ position: relative;
+}
+
+.pay-modal-head {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin-bottom: 12px;
+}
+
+.pay-modal-head img {
+ height: 26px;
+ width: auto;
+}
+
+.pay-close-btn {
+ position: absolute;
+ top: 11px;
+ right: 11px;
+ width: 32px;
+ height: 32px;
+ border-radius: 50%;
+ border: 0;
+ background: rgba(255, 255, 255, 0.08);
+ color: #fff;
+ cursor: pointer;
+ font-size: 1.1rem;
+}
+
+.pay-form-grid label,
+.pay-modal-panel label {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ font-size: 0.84rem;
+ color: #b2bece;
+ margin-top: 8px;
+}
+
+.pay-form-grid input,
+.pay-modal-panel input {
+ border-radius: 10px;
+ border: 1px solid #3b4255;
+ background: #10141f;
+ color: #f2f6fd;
+ padding: 10px;
+}
+
+.pay-form-row {
+ display: grid;
+ grid-template-columns: 1fr 1fr;
+ gap: 10px;
+}
+
+.pay-submit-btn {
+ width: 100%;
+ margin-top: 14px;
+ border: 0;
+ border-radius: 11px;
+ padding: 11px 12px;
+ font-weight: 600;
+ cursor: pointer;
+ background: #0071e3;
+ color: #fff;
+}
+
+.paypal-btn {
+ background: linear-gradient(90deg, #005ea6, #0b84e3);
+}
+
+.apple-btn {
+ background: linear-gradient(90deg, #e9edf5, #cfd7e5);
+ color: #0c1016;
+}
+
+.google-btn {
+ background: linear-gradient(90deg, #1967d2, #34a853);
+}
+
+.pay-modal-paypal-style {
+ background: linear-gradient(160deg, #112544 0%, #0f1e34 100%);
+}
+
+.pay-modal-apple-style {
+ background: linear-gradient(160deg, #1d212b 0%, #131722 100%);
+}
+
+.pay-modal-google-style {
+ background: linear-gradient(160deg, #122033 0%, #141925 100%);
+}
+
+@media (max-width: 980px) {
+ .inline-section {
+ grid-template-columns: 1fr;
+ }
+
+ .inline-media {
+ min-height: 210px;
+ }
+
+ .hall-modal-grid {
+ grid-template-columns: 1fr;
+ }
+
+ .dbox-image-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .collector-entry {
+ width: 100%;
+ }
+}
+
+/* --- 2026-04-21 nav/theme/info pages --- */
+#link-cart {
+ transform: translateY(2px);
+}
+
+.theme-toggle-item {
+ display: flex;
+ align-items: center;
+}
+
+.theme-toggle-btn {
+ width: 44px;
+ height: 44px;
+ border-radius: 999px;
+ border: 1px solid rgba(255, 255, 255, 0.24);
+ background: linear-gradient(140deg, rgba(255, 255, 255, 0.12), rgba(255, 255, 255, 0.02));
+ color: #fff;
+ position: relative;
+ cursor: pointer;
+ transition: transform 0.35s ease, box-shadow 0.35s ease, background 0.35s ease;
+}
+
+.theme-toggle-btn:hover {
+ transform: translateY(-1px) scale(1.03);
+ box-shadow: 0 10px 18px rgba(0, 0, 0, 0.28);
+}
+
+.theme-icon {
+ position: absolute;
+ inset: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 1.05rem;
+ transition: opacity 0.35s ease, transform 0.45s cubic-bezier(0.2, 0.8, 0.2, 1);
+}
+
+.theme-icon-sun {
+ opacity: 0;
+ transform: rotate(-35deg) scale(0.5);
+}
+
+.theme-icon-moon {
+ opacity: 1;
+ transform: rotate(0deg) scale(1);
+}
+
+.theme-toggle-btn.is-light .theme-icon-sun {
+ opacity: 1;
+ transform: rotate(0deg) scale(1);
+}
+
+.theme-toggle-btn.is-light .theme-icon-moon {
+ opacity: 0;
+ transform: rotate(35deg) scale(0.55);
+}
+
+.info-view {
+ min-height: 100vh;
+ padding-top: 120px;
+ padding-bottom: 70px;
+}
+
+.info-view-shell {
+ padding: 0 8%;
+}
+
+.info-view-shell h1 {
+ font-size: clamp(2rem, 4vw, 3rem);
+}
+
+.info-view-subtitle {
+ color: #98a3b3;
+ margin-top: 8px;
+ margin-bottom: 22px;
+}
+
+.full-page-grid {
+ margin-top: 16px;
+}
+
+.subpage-back-btn {
+ border: 1px solid rgba(255, 255, 255, 0.2);
+ background: rgba(255, 255, 255, 0.04);
+ color: #ebf1f9;
+ border-radius: 999px;
+ padding: 10px 14px;
+ margin-bottom: 18px;
+ cursor: pointer;
+ transition: transform 0.2s ease, border-color 0.2s ease;
+}
+
+.subpage-back-btn:hover {
+ transform: translateX(-2px);
+ border-color: rgba(0, 113, 227, 0.65);
+}
+
+.about-intro {
+ margin-top: 12px;
+ color: #b2bcc9;
+ line-height: 1.65;
+ max-width: 900px;
+}
+
+.about-cards {
+ margin-top: 24px;
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 14px;
+}
+
+.about-card {
+ border: 1px solid rgba(255, 255, 255, 0.11);
+ border-radius: 16px;
+ background: linear-gradient(155deg, #151922 0%, #10141c 100%);
+ padding: 16px;
+}
+
+.about-card h3 {
+ margin-bottom: 8px;
+}
+
+.about-card p {
+ color: #aeb8c6;
+ margin-bottom: 14px;
+ line-height: 1.5;
+}
+
+body.theme-dark .program-card .description,
+body.theme-dark .inline-content p,
+body.theme-dark .about-intro {
+ color: #d1d7e0;
+}
+
+body.theme-dark #checkout-summary-list,
+body.theme-dark .hall-modal-item,
+body.theme-dark .dbox-modal-section {
+ color: #eaf1fc;
+}
+
+body.theme-light {
+ background: #eef2f8;
+ color: #121620;
+}
+
+body.theme-light .navbar {
+ background: rgba(244, 248, 255, 0.85);
+ border-bottom: 1px solid rgba(11, 22, 42, 0.08);
+}
+
+body.theme-light .nav-links a,
+body.theme-light .logo {
+ color: #1a2435;
+ opacity: 0.95;
+}
+
+body.theme-light .hero::after {
+ background: linear-gradient(180deg, rgba(240, 246, 255, 0.04) 0%, rgba(240, 246, 255, 0.26) 100%);
+}
+
+body.theme-light .hero-overlay h1,
+body.theme-light .hero-overlay p {
+ color: #131a26;
+ text-shadow: none;
+}
+
+body.theme-light .home-poster-band,
+body.theme-light .inline-section,
+body.theme-light .detailed-card,
+body.theme-light .program-card,
+body.theme-light .hall-modal-item,
+body.theme-light .dbox-modal-section,
+body.theme-light .about-card,
+body.theme-light .account-panel,
+body.theme-light .account-login-box,
+body.theme-light .account-card,
+body.theme-light .order-box,
+body.theme-light .summary-box-black,
+body.theme-light .cart-left,
+body.theme-light .pay-modal-panel,
+body.theme-light .home-modal-panel,
+body.theme-light .snack-card,
+body.theme-light .snack-card.highlight {
+ background: #ffffff !important;
+ color: #1a2435;
+ border-color: rgba(21, 35, 58, 0.14) !important;
+ box-shadow: 0 10px 30px rgba(21, 35, 58, 0.08);
+}
+
+body.theme-light .inline-content p,
+body.theme-light .program-card .description,
+body.theme-light .list-subtitle,
+body.theme-light .info-view-subtitle,
+body.theme-light .about-intro,
+body.theme-light .about-card p,
+body.theme-light .account-payments-note,
+body.theme-light .running-meta p {
+ color: #45556f !important;
+}
+
+body.theme-light .running-poster,
+body.theme-light .order-ticket-card,
+body.theme-light .order-item-btn.active,
+body.theme-light .dbox-now-highlight,
+body.theme-light .modal-highlight,
+body.theme-light .collector-entry {
+ background: #f7f9fd !important;
+ border-color: rgba(28, 56, 94, 0.16) !important;
+}
+
+body.theme-light .story-more-btn,
+body.theme-light .subpage-back-btn,
+body.theme-light .open-program-btn,
+body.theme-light .account-tab-btn,
+body.theme-light .account-logout-btn,
+body.theme-light .theme-toggle-btn {
+ color: #1c2b44;
+ background: #f3f7ff;
+ border-color: rgba(28, 56, 94, 0.22);
+}
+
+body.theme-light .btn-primary,
+body.theme-light .blue-button,
+body.theme-light .auth-submit-btn,
+body.theme-light .pay-submit-btn {
+ color: #fff;
+}
+
+body.theme-light #checkout-summary-list,
+body.theme-light .hall-modal-item textarea,
+body.theme-light .hall-modal-item input,
+body.theme-light .pay-modal-panel input,
+body.theme-light .collector-entry-content input,
+body.theme-light .account-login-box input,
+body.theme-light .account-auth-modal input {
+ background: #f5f8ff !important;
+ color: #1a2435 !important;
+ border-color: rgba(33, 55, 91, 0.22) !important;
+}
+
+body.theme-light .pay-modal-overlay,
+body.theme-light .home-modal-overlay,
+body.theme-light .modal,
+body.theme-light .snack-overlay {
+ background: rgba(203, 216, 236, 0.7);
+}
+
+body.theme-light .theme-toggle-btn {
+ background: linear-gradient(140deg, #fff9d5, #ffe9b0);
+}
+
+@media (max-width: 1000px) {
+ .about-cards {
+ grid-template-columns: 1fr;
+ }
+}
+
+/* --- 2026-04-28 light-mode polish + new about design --- */
+.about-hero-block {
+ margin-top: 8px;
+ border-radius: 24px;
+ overflow: hidden;
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ display: grid;
+ grid-template-columns: 1.2fr 1fr;
+ background: linear-gradient(130deg, #111722 0%, #0b111a 100%);
+ box-shadow: 0 24px 46px rgba(0, 0, 0, 0.3);
+}
+
+.about-hero-content {
+ padding: 30px 28px;
+}
+
+.about-hero-content h1 {
+ margin-bottom: 10px;
+}
+
+.about-pill-row {
+ margin-top: 18px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+}
+
+.about-pill-row span {
+ border: 1px solid rgba(0, 113, 227, 0.45);
+ background: rgba(0, 113, 227, 0.15);
+ color: #c8e2ff;
+ border-radius: 999px;
+ padding: 6px 12px;
+ font-size: 0.76rem;
+}
+
+.about-hero-media {
+ min-height: 300px;
+ background-image:
+ linear-gradient(150deg, rgba(0, 0, 0, 0.12), rgba(0, 0, 0, 0.58)),
+ url('img/derAustronaut.jpg');
+ background-size: cover;
+ background-position: center;
+ position: relative;
+}
+
+.about-hero-media::after {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background:
+ radial-gradient(circle at 25% 25%, rgba(0, 113, 227, 0.22), transparent 45%),
+ radial-gradient(circle at 70% 70%, rgba(255, 184, 92, 0.18), transparent 42%);
+}
+
+.about-stats-grid {
+ margin-top: 18px;
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 10px;
+}
+
+.about-stats-grid article {
+ border-radius: 14px;
+ border: 1px solid rgba(255, 255, 255, 0.12);
+ background: rgba(255, 255, 255, 0.03);
+ padding: 12px;
+}
+
+.about-stats-grid h3 {
+ color: #8ec8ff;
+ margin-bottom: 4px;
+}
+
+.about-stats-grid p {
+ color: #aab7c8;
+ font-size: 0.84rem;
+}
+
+.about-cards {
+ margin-top: 20px;
+ gap: 16px;
+}
+
+.about-card {
+ position: relative;
+ overflow: hidden;
+ border-radius: 18px;
+ min-height: 230px;
+ display: flex;
+ flex-direction: column;
+ justify-content: flex-end;
+ padding: 18px;
+ background-size: cover;
+ background-position: center;
+}
+
+.about-card::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background: linear-gradient(175deg, rgba(7, 10, 15, 0.2), rgba(7, 10, 15, 0.82));
+ z-index: 0;
+}
+
+.about-card > * {
+ position: relative;
+ z-index: 1;
+}
+
+.about-card-halls {
+ background-image: url('img/zoomania-2.jpg');
+}
+
+.about-card-dbox {
+ background-image: url('img/shelter.jpg');
+}
+
+.about-card-tech {
+ background-image: url('img/spidermannewday.jpg');
+}
+
+.about-card p {
+ color: #d7dfeb;
+}
+
+/* Light mode readability improvements */
+body.theme-light .cinema-home {
+ background:
+ radial-gradient(circle at 12% -2%, rgba(0, 113, 227, 0.17), transparent 36%),
+ radial-gradient(circle at 88% 18%, rgba(123, 164, 218, 0.22), transparent 34%),
+ #edf2fb;
+}
+
+body.theme-light .home-band-header h3,
+body.theme-light .section-header h2,
+body.theme-light .list-title,
+body.theme-light .movie-info h3,
+body.theme-light .duration,
+body.theme-light .program-card h2,
+body.theme-light .running-meta h4,
+body.theme-light .snack-info h3,
+body.theme-light #account-view h2,
+body.theme-light #account-tab-content h3,
+body.theme-light .order-item-head h4 {
+ color: #13233c !important;
+}
+
+body.theme-light .home-band-header span,
+body.theme-light .movie-info .genre,
+body.theme-light .program-day-tab small,
+body.theme-light .card-right .description,
+body.theme-light .account-card p,
+body.theme-light .order-box p,
+body.theme-light .order-ticket-grid span,
+body.theme-light .order-ticket-brand,
+body.theme-light .summary-row,
+body.theme-light .vat-row,
+body.theme-light .snack-prompt-box p {
+ color: #4a5d79 !important;
+}
+
+body.theme-light .program-day-tab {
+ border-color: rgba(22, 45, 74, 0.24);
+ background: #f4f8ff;
+ color: #13233c;
+}
+
+body.theme-light .program-day-tab.active {
+ border-color: #0071e3;
+ background: rgba(0, 113, 227, 0.14);
+}
+
+body.theme-light .program-time-row {
+ border-color: rgba(24, 52, 87, 0.2);
+ background: #f5f9ff;
+ color: #13233c;
+}
+
+body.theme-light .program-time-row:hover {
+ background: #ebf3ff;
+}
+
+body.theme-light .hall-pill {
+ color: #144274;
+ border-color: rgba(0, 113, 227, 0.32);
+ background: rgba(0, 113, 227, 0.11);
+}
+
+body.theme-light .time-btn {
+ background: #0071e3;
+ color: #fff;
+}
+
+body.theme-light .category-tabs {
+ background: rgba(255, 255, 255, 0.65);
+ border: 1px solid rgba(26, 51, 83, 0.12);
+ border-radius: 18px;
+ padding: 10px;
+}
+
+body.theme-light .tab-btn {
+ background: #eef4ff;
+ color: #1b2f4d;
+ border-color: rgba(20, 45, 78, 0.2);
+}
+
+body.theme-light .tab-btn.active {
+ background: #0071e3;
+ color: #fff;
+}
+
+body.theme-light .option-group {
+ background: #edf3ff;
+}
+
+body.theme-light .opt-btn {
+ color: #445976;
+}
+
+body.theme-light .opt-btn.active {
+ background: #dbe9ff;
+ color: #11325b;
+}
+
+body.theme-light .size-chip {
+ background: #f4f8ff;
+ color: #122741;
+ border-color: rgba(17, 41, 72, 0.2);
+}
+
+body.theme-light .size-chip span {
+ color: #0057ae;
+}
+
+body.theme-light .size-chip:hover {
+ background: #0071e3;
+ color: #fff;
+}
+
+body.theme-light .size-chip:hover span {
+ color: #fff;
+}
+
+body.theme-light .summary-row-large,
+body.theme-light .total-row,
+body.theme-light #cart-total-right,
+body.theme-light #cart-vat-right,
+body.theme-light #checkout-total-display,
+body.theme-light #checkout-vat-display,
+body.theme-light .col-price {
+ color: #10213a !important;
+}
+
+body.theme-light .order-item-btn.active .order-item-head span {
+ color: #0053aa;
+}
+
+body.theme-light .order-ticket-grid strong,
+body.theme-light .order-item-head span,
+body.theme-light .order-ticket-content h4 {
+ color: #112742;
+}
+
+body.theme-light .about-hero-block {
+ background: linear-gradient(130deg, #f7fbff 0%, #ecf3ff 100%);
+ border-color: rgba(24, 48, 80, 0.14);
+}
+
+body.theme-light .about-hero-content h1,
+body.theme-light .about-stats-grid h3,
+body.theme-light .about-card h3 {
+ color: #122440;
+}
+
+body.theme-light .about-hero-content p,
+body.theme-light .about-stats-grid p,
+body.theme-light .about-card p {
+ color: #455a77;
+}
+
+body.theme-light .about-stats-grid article {
+ background: #ffffff;
+ border-color: rgba(24, 49, 82, 0.14);
+}
+
+body.theme-light .about-card::before {
+ background: linear-gradient(175deg, rgba(245, 250, 255, 0.2), rgba(245, 250, 255, 0.78));
+}
+
+body.theme-light .about-card {
+ border-color: rgba(22, 47, 80, 0.18);
+}
+
+@media (max-width: 980px) {
+ .about-hero-block {
+ grid-template-columns: 1fr;
+ }
+
+ .about-hero-media {
+ min-height: 230px;
+ }
+
+ .about-stats-grid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+}