commit 556ce19725ef309448436d321d58bcdd6b1e3610
Author: Andrew P. Harper <115321970+KoopaCode@users.noreply.github.com>
Date: Thu Mar 5 23:15:46 2026 -0500
Add frontend scaffold, assets, and config
Initial project add: React + Vite frontend scaffold including index.html (with metadata and redirect), src files (App.jsx, main.jsx, styles.css), vite.config.js, and package.json. Adds README, MIT LICENSE, .gitignore, GitHub issue & PR templates, and a large collection of static assets (images, logos, loading screens, backgrounds, and audio). Prepares the repository for local development and deployment to Cloudflare Pages.
Co-Authored-By: uhalexz_ <152796233+uhalexz@users.noreply.github.com>
Co-Authored-By: Leighton Marley <65038774+lmarl3y@users.noreply.github.com>
Co-Authored-By: lolali054 <62222309+lolali054@users.noreply.github.com>
diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
new file mode 100644
index 0000000..e725142
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -0,0 +1,45 @@
+name: Bug Report
+description: Report a bug on minecraftlegacy.com
+labels: ["bug"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thanks for taking the time to report a bug.
+ - type: input
+ id: url
+ attributes:
+ label: Page URL
+ description: Which page is affected?
+ placeholder: https://minecraftlegacy.com
+ validations:
+ required: true
+ - type: textarea
+ id: description
+ attributes:
+ label: What happened?
+ description: Describe the bug clearly.
+ validations:
+ required: true
+ - type: textarea
+ id: expected
+ attributes:
+ label: Expected behavior
+ description: What should have happened instead?
+ validations:
+ required: true
+ - type: input
+ id: browser
+ attributes:
+ label: Browser
+ description: Which browser are you using?
+ placeholder: Chrome 120, Firefox 121, etc.
+ validations:
+ required: false
+ - type: textarea
+ id: screenshots
+ attributes:
+ label: Screenshots
+ description: Paste any relevant screenshots here.
+ validations:
+ required: false
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
new file mode 100644
index 0000000..78e38db
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -0,0 +1,22 @@
+name: Feature Request
+description: Suggest a feature or improvement for the website
+labels: ["enhancement"]
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Got an idea to make the site better? Let us know.
+ - type: textarea
+ id: description
+ attributes:
+ label: What would you like?
+ description: Describe the feature or change you'd like to see.
+ validations:
+ required: true
+ - type: textarea
+ id: context
+ attributes:
+ label: Why?
+ description: Why would this be useful?
+ validations:
+ required: false
diff --git a/.github/logo.png b/.github/logo.png
new file mode 100644
index 0000000..416d9fa
Binary files /dev/null and b/.github/logo.png differ
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..122c055
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,17 @@
+## What does this PR do?
+
+
+
+## Type of change
+
+- [ ] Bug fix
+- [ ] New feature
+- [ ] Styling/UI change
+- [ ] Refactor
+- [ ] Other
+
+## Checklist
+
+- [ ] `npm run build` passes
+- [ ] Tested locally with `npm run dev`
+- [ ] No unnecessary files included
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9dc24f1
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+node_modules/
+dist/
+.DS_Store
+*.log
+.deploy-tmp/
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..73e04f9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2026 Minecraft Legacy Community
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..9234bc7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+### Source code for [minecraftlegacy.com](https://minecraftlegacy.com)
+
+[](https://minecraftlegacy.com)
+[](https://discord.gg/MinecraftLegacy)
+
+---
+
+
+
+The Legacy Repository Index - a searchable, paginated directory of archived Minecraft source code, tools, launchers, and community projects. Built with React + Vite, powered by data from the [json](https://github.com/MinecraftConsole/json) repo.
+
+## Setup
+
+```
+npm install
+npm run dev
+```
+
+Runs on `localhost:5173`. Uses `placeholder.json` on localhost and `projects.json` in production.
+
+## Build
+
+```
+npm run build
+```
+
+Output goes to `dist/`.
+
+## Deploy
+
+Deployed to Cloudflare Pages.
+
+```
+npm run build
+```
+
+Push the built `dist/` output to your Cloudflare Pages project.
+
+## Stack
+
+- React 18
+- Vite 5
+- Minecraft font (`typeface-minecraft`)
+- Cloudflare Pages
+
+## Contributing
+
+1. Fork this repo
+2. Create a branch (`git checkout -b feature/thing`)
+3. Commit your changes
+4. Open a PR
+
+For adding projects to the index, use the [json repo](https://github.com/MinecraftConsole/json) instead.
+
+## License
+
+[MIT](LICENSE)
+
+
+Not affiliated with Mojang AB or Microsoft. "Minecraft" is a trademark of Mojang Synergies AB.
+
diff --git a/assets/audio/music/Aria Math.mp3 b/assets/audio/music/Aria Math.mp3
new file mode 100644
index 0000000..493f769
Binary files /dev/null and b/assets/audio/music/Aria Math.mp3 differ
diff --git a/assets/audio/music/Beginning.mp3 b/assets/audio/music/Beginning.mp3
new file mode 100644
index 0000000..40f96b5
Binary files /dev/null and b/assets/audio/music/Beginning.mp3 differ
diff --git a/assets/audio/music/Biome Fest.mp3 b/assets/audio/music/Biome Fest.mp3
new file mode 100644
index 0000000..be47498
Binary files /dev/null and b/assets/audio/music/Biome Fest.mp3 differ
diff --git a/assets/audio/music/Blind Spots.mp3 b/assets/audio/music/Blind Spots.mp3
new file mode 100644
index 0000000..311c3f5
Binary files /dev/null and b/assets/audio/music/Blind Spots.mp3 differ
diff --git a/assets/audio/music/Clark.mp3 b/assets/audio/music/Clark.mp3
new file mode 100644
index 0000000..d9db79f
Binary files /dev/null and b/assets/audio/music/Clark.mp3 differ
diff --git a/assets/audio/music/Danny.mp3 b/assets/audio/music/Danny.mp3
new file mode 100644
index 0000000..fb14630
Binary files /dev/null and b/assets/audio/music/Danny.mp3 differ
diff --git a/assets/audio/music/Dreiton.mp3 b/assets/audio/music/Dreiton.mp3
new file mode 100644
index 0000000..53f7e32
Binary files /dev/null and b/assets/audio/music/Dreiton.mp3 differ
diff --git a/assets/audio/music/Dry Hands.mp3 b/assets/audio/music/Dry Hands.mp3
new file mode 100644
index 0000000..61df102
Binary files /dev/null and b/assets/audio/music/Dry Hands.mp3 differ
diff --git a/assets/audio/music/Haggstrom.mp3 b/assets/audio/music/Haggstrom.mp3
new file mode 100644
index 0000000..1e86afd
Binary files /dev/null and b/assets/audio/music/Haggstrom.mp3 differ
diff --git a/assets/audio/music/Haunt Muskie.mp3 b/assets/audio/music/Haunt Muskie.mp3
new file mode 100644
index 0000000..d6da16e
Binary files /dev/null and b/assets/audio/music/Haunt Muskie.mp3 differ
diff --git a/assets/audio/music/Mice On Venus.mp3 b/assets/audio/music/Mice On Venus.mp3
new file mode 100644
index 0000000..d675a0c
Binary files /dev/null and b/assets/audio/music/Mice On Venus.mp3 differ
diff --git a/assets/audio/music/Minecraft.mp3 b/assets/audio/music/Minecraft.mp3
new file mode 100644
index 0000000..192afa1
Binary files /dev/null and b/assets/audio/music/Minecraft.mp3 differ
diff --git a/assets/audio/music/Moog City 2.mp3 b/assets/audio/music/Moog City 2.mp3
new file mode 100644
index 0000000..9e1f70a
Binary files /dev/null and b/assets/audio/music/Moog City 2.mp3 differ
diff --git a/assets/audio/music/Oxygène.mp3 b/assets/audio/music/Oxygène.mp3
new file mode 100644
index 0000000..5221336
Binary files /dev/null and b/assets/audio/music/Oxygène.mp3 differ
diff --git a/assets/audio/music/Subwoofer Lullaby.mp3 b/assets/audio/music/Subwoofer Lullaby.mp3
new file mode 100644
index 0000000..4052991
Binary files /dev/null and b/assets/audio/music/Subwoofer Lullaby.mp3 differ
diff --git a/assets/audio/music/Sweden.mp3 b/assets/audio/music/Sweden.mp3
new file mode 100644
index 0000000..6988204
Binary files /dev/null and b/assets/audio/music/Sweden.mp3 differ
diff --git a/assets/audio/music/Taswell.mp3 b/assets/audio/music/Taswell.mp3
new file mode 100644
index 0000000..051a040
Binary files /dev/null and b/assets/audio/music/Taswell.mp3 differ
diff --git a/assets/audio/music/Wet Hands.mp3 b/assets/audio/music/Wet Hands.mp3
new file mode 100644
index 0000000..2ef11b7
Binary files /dev/null and b/assets/audio/music/Wet Hands.mp3 differ
diff --git a/assets/audio/sound/click.mp3 b/assets/audio/sound/click.mp3
new file mode 100644
index 0000000..828ce1f
Binary files /dev/null and b/assets/audio/sound/click.mp3 differ
diff --git a/assets/audio/sound/pig.mp3 b/assets/audio/sound/pig.mp3
new file mode 100644
index 0000000..c756d86
Binary files /dev/null and b/assets/audio/sound/pig.mp3 differ
diff --git a/assets/images/backgrounds/Dirt_background_JE1.webp b/assets/images/backgrounds/Dirt_background_JE1.webp
new file mode 100644
index 0000000..30bc538
Binary files /dev/null and b/assets/images/backgrounds/Dirt_background_JE1.webp differ
diff --git a/assets/images/backgrounds/End_Poem_Background_JE.webp b/assets/images/backgrounds/End_Poem_Background_JE.webp
new file mode 100644
index 0000000..fa7c8d1
Binary files /dev/null and b/assets/images/backgrounds/End_Poem_Background_JE.webp differ
diff --git a/assets/images/backgrounds/End_Stone_background_BE2.webp b/assets/images/backgrounds/End_Stone_background_BE2.webp
new file mode 100644
index 0000000..5f06098
Binary files /dev/null and b/assets/images/backgrounds/End_Stone_background_BE2.webp differ
diff --git a/assets/images/backgrounds/Portal_Backgrounid_Je1.webp b/assets/images/backgrounds/Portal_Backgrounid_Je1.webp
new file mode 100644
index 0000000..aaf5ba5
Binary files /dev/null and b/assets/images/backgrounds/Portal_Backgrounid_Je1.webp differ
diff --git a/assets/images/deco/steveandalex.png b/assets/images/deco/steveandalex.png
new file mode 100644
index 0000000..b898a91
Binary files /dev/null and b/assets/images/deco/steveandalex.png differ
diff --git a/assets/images/deco/techno.png b/assets/images/deco/techno.png
new file mode 100644
index 0000000..3824e08
Binary files /dev/null and b/assets/images/deco/techno.png differ
diff --git a/assets/images/loading/Cod_loading.webp b/assets/images/loading/Cod_loading.webp
new file mode 100644
index 0000000..f9abbb7
Binary files /dev/null and b/assets/images/loading/Cod_loading.webp differ
diff --git a/assets/images/loading/Gear_loading.webp b/assets/images/loading/Gear_loading.webp
new file mode 100644
index 0000000..6e0055d
Binary files /dev/null and b/assets/images/loading/Gear_loading.webp differ
diff --git a/assets/images/logos/MINECRAFT LEGACY EDITION logo large.png b/assets/images/logos/MINECRAFT LEGACY EDITION logo large.png
new file mode 100644
index 0000000..416d9fa
Binary files /dev/null and b/assets/images/logos/MINECRAFT LEGACY EDITION logo large.png differ
diff --git a/assets/images/logos/MINECRAFT LEGACY EDITION medium.png b/assets/images/logos/MINECRAFT LEGACY EDITION medium.png
new file mode 100644
index 0000000..32fb1f0
Binary files /dev/null and b/assets/images/logos/MINECRAFT LEGACY EDITION medium.png differ
diff --git a/assets/images/logos/MINECRAFT LEGACY EDITION small.png b/assets/images/logos/MINECRAFT LEGACY EDITION small.png
new file mode 100644
index 0000000..91958db
Binary files /dev/null and b/assets/images/logos/MINECRAFT LEGACY EDITION small.png differ
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c68819e
--- /dev/null
+++ b/index.html
@@ -0,0 +1,75 @@
+
+
+
+
+
+
+ Minecraft Legacy | Repository Index, Mods, and Discord Bot Resources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..3f5f8a2
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1684 @@
+{
+ "name": "minecraft-legacy-frontend",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "minecraft-legacy-frontend",
+ "version": "0.1.0",
+ "dependencies": {
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "typeface-minecraft": "^1.0.0"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-react": "^4.4.1",
+ "vite": "^5.4.11"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz",
+ "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz",
+ "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz",
+ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-compilation-targets": "^7.28.6",
+ "@babel/helper-module-transforms": "^7.28.6",
+ "@babel/helpers": "^7.28.6",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/remapping": "^2.3.5",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.29.1",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz",
+ "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "@jridgewell/gen-mapping": "^0.3.12",
+ "@jridgewell/trace-mapping": "^0.3.28",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz",
+ "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/compat-data": "^7.28.6",
+ "@babel/helper-validator-option": "^7.27.1",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-globals": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+ "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz",
+ "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/traverse": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz",
+ "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.28.6",
+ "@babel/helper-validator-identifier": "^7.28.5",
+ "@babel/traverse": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz",
+ "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+ "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.28.5",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
+ "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+ "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.6.tgz",
+ "integrity": "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz",
+ "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.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",
+ "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-source": {
+ "version": "7.27.1",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+ "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.27.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.28.6",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz",
+ "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.28.6",
+ "@babel/parser": "^7.28.6",
+ "@babel/types": "^7.28.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz",
+ "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/code-frame": "^7.29.0",
+ "@babel/generator": "^7.29.0",
+ "@babel/helper-globals": "^7.28.0",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/types": "^7.29.0",
+ "debug": "^4.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz",
+ "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.27.1",
+ "@babel/helper-validator-identifier": "^7.28.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz",
+ "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz",
+ "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz",
+ "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz",
+ "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz",
+ "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz",
+ "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz",
+ "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz",
+ "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz",
+ "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz",
+ "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz",
+ "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz",
+ "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz",
+ "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz",
+ "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz",
+ "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz",
+ "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz",
+ "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz",
+ "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz",
+ "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz",
+ "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz",
+ "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.0-beta.27",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz",
+ "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz",
+ "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz",
+ "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz",
+ "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz",
+ "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz",
+ "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz",
+ "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz",
+ "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz",
+ "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz",
+ "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz",
+ "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz",
+ "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loong64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz",
+ "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz",
+ "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz",
+ "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz",
+ "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz",
+ "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz",
+ "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz",
+ "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-openbsd-x64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz",
+ "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openbsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-openharmony-arm64": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz",
+ "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz",
+ "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz",
+ "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-gnu": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz",
+ "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz",
+ "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.27.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+ "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.28.0",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+ "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.28.2"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@vitejs/plugin-react": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz",
+ "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.28.0",
+ "@babel/plugin-transform-react-jsx-self": "^7.27.1",
+ "@babel/plugin-transform-react-jsx-source": "^7.27.1",
+ "@rolldown/pluginutils": "1.0.0-beta.27",
+ "@types/babel__core": "^7.20.5",
+ "react-refresh": "^0.17.0"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+ }
+ },
+ "node_modules/baseline-browser-mapping": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.0.tgz",
+ "integrity": "sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "baseline-browser-mapping": "dist/cli.cjs"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.28.1",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz",
+ "integrity": "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "baseline-browser-mapping": "^2.9.0",
+ "caniuse-lite": "^1.0.30001759",
+ "electron-to-chromium": "^1.5.263",
+ "node-releases": "^2.0.27",
+ "update-browserslist-db": "^1.2.0"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001776",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001776.tgz",
+ "integrity": "sha512-sg01JDPzZ9jGshqKSckOQthXnYwOEP50jeVFhaSFbZcOy05TiuuaffDOfcwtCisJ9kNQuLBFibYywv2Bgm9osw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "CC-BY-4.0"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.307",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.307.tgz",
+ "integrity": "sha512-5z3uFKBWjiNR44nFcYdkcXjKMbg5KXNdciu7mhTPo9tB7NbqSNP2sSnGR+fqknZSCwKkBN+oxiiajWs4dT6ORg==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/esbuild": {
+ "version": "0.21.5",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz",
+ "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.21.5",
+ "@esbuild/android-arm": "0.21.5",
+ "@esbuild/android-arm64": "0.21.5",
+ "@esbuild/android-x64": "0.21.5",
+ "@esbuild/darwin-arm64": "0.21.5",
+ "@esbuild/darwin-x64": "0.21.5",
+ "@esbuild/freebsd-arm64": "0.21.5",
+ "@esbuild/freebsd-x64": "0.21.5",
+ "@esbuild/linux-arm": "0.21.5",
+ "@esbuild/linux-arm64": "0.21.5",
+ "@esbuild/linux-ia32": "0.21.5",
+ "@esbuild/linux-loong64": "0.21.5",
+ "@esbuild/linux-mips64el": "0.21.5",
+ "@esbuild/linux-ppc64": "0.21.5",
+ "@esbuild/linux-riscv64": "0.21.5",
+ "@esbuild/linux-s390x": "0.21.5",
+ "@esbuild/linux-x64": "0.21.5",
+ "@esbuild/netbsd-x64": "0.21.5",
+ "@esbuild/openbsd-x64": "0.21.5",
+ "@esbuild/sunos-x64": "0.21.5",
+ "@esbuild/win32-arm64": "0.21.5",
+ "@esbuild/win32-ia32": "0.21.5",
+ "@esbuild/win32-x64": "0.21.5"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+ "license": "MIT"
+ },
+ "node_modules/jsesc": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+ "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "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==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.36",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.36.tgz",
+ "integrity": "sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/postcss": {
+ "version": "8.5.8",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz",
+ "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-refresh": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+ "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.59.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz",
+ "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.59.0",
+ "@rollup/rollup-android-arm64": "4.59.0",
+ "@rollup/rollup-darwin-arm64": "4.59.0",
+ "@rollup/rollup-darwin-x64": "4.59.0",
+ "@rollup/rollup-freebsd-arm64": "4.59.0",
+ "@rollup/rollup-freebsd-x64": "4.59.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.59.0",
+ "@rollup/rollup-linux-arm-musleabihf": "4.59.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.59.0",
+ "@rollup/rollup-linux-arm64-musl": "4.59.0",
+ "@rollup/rollup-linux-loong64-gnu": "4.59.0",
+ "@rollup/rollup-linux-loong64-musl": "4.59.0",
+ "@rollup/rollup-linux-ppc64-gnu": "4.59.0",
+ "@rollup/rollup-linux-ppc64-musl": "4.59.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.59.0",
+ "@rollup/rollup-linux-riscv64-musl": "4.59.0",
+ "@rollup/rollup-linux-s390x-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-gnu": "4.59.0",
+ "@rollup/rollup-linux-x64-musl": "4.59.0",
+ "@rollup/rollup-openbsd-x64": "4.59.0",
+ "@rollup/rollup-openharmony-arm64": "4.59.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.59.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.59.0",
+ "@rollup/rollup-win32-x64-gnu": "4.59.0",
+ "@rollup/rollup-win32-x64-msvc": "4.59.0",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/typeface-minecraft": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/typeface-minecraft/-/typeface-minecraft-1.0.0.tgz",
+ "integrity": "sha512-EuS7/PEPe7D9Z9zi0Hnn+uwgkGHG/Drkufo9IUjUzPUwW0+EdAepaHUmtmfbBBnhFu7r3JbnK5EczngBQ3ZQLw==",
+ "license": "MIT"
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz",
+ "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/browserslist"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/browserslist"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.1"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/vite": {
+ "version": "5.4.21",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz",
+ "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "esbuild": "^0.21.3",
+ "postcss": "^8.4.43",
+ "rollup": "^4.20.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "sass-embedded": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true,
+ "license": "ISC"
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..6d6ca60
--- /dev/null
+++ b/package.json
@@ -0,0 +1,31 @@
+{
+ "name": "minecraftlegacy-web",
+ "private": false,
+ "version": "1.0.0",
+ "description": "Frontend for Minecraft Legacy Edition project",
+ "author": "MinecraftConsole",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/MinecraftConsole/MinecraftLegacy.git"
+ },
+ "bugs": {
+ "url": "https://github.com/MinecraftConsole/MinecraftLegacy/issues"
+ },
+ "homepage": "https://github.com/MinecraftConsole/MinecraftLegacy",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "preview": "vite preview"
+ },
+ "dependencies": {
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "typeface-minecraft": "^1.0.0"
+ },
+ "devDependencies": {
+ "@vitejs/plugin-react": "^4.4.1",
+ "vite": "^5.4.11"
+ }
+}
\ No newline at end of file
diff --git a/public/.well-known/discord b/public/.well-known/discord
new file mode 100644
index 0000000..bdd65c8
--- /dev/null
+++ b/public/.well-known/discord
@@ -0,0 +1 @@
+dh=22a8c497d1462547b8a1463e7e80cc62540a1b37
\ No newline at end of file
diff --git a/public/logos/MINECRAFT LEGACY EDITION logo large.png b/public/logos/MINECRAFT LEGACY EDITION logo large.png
new file mode 100644
index 0000000..416d9fa
Binary files /dev/null and b/public/logos/MINECRAFT LEGACY EDITION logo large.png differ
diff --git a/public/logos/MINECRAFT LEGACY EDITION medium.png b/public/logos/MINECRAFT LEGACY EDITION medium.png
new file mode 100644
index 0000000..32fb1f0
Binary files /dev/null and b/public/logos/MINECRAFT LEGACY EDITION medium.png differ
diff --git a/public/logos/MINECRAFT LEGACY EDITION small.png b/public/logos/MINECRAFT LEGACY EDITION small.png
new file mode 100644
index 0000000..91958db
Binary files /dev/null and b/public/logos/MINECRAFT LEGACY EDITION small.png differ
diff --git a/public/logos/welcome.png b/public/logos/welcome.png
new file mode 100644
index 0000000..1c85e81
Binary files /dev/null and b/public/logos/welcome.png differ
diff --git a/public/logos/welcome.webp b/public/logos/welcome.webp
new file mode 100644
index 0000000..aaf5ba5
Binary files /dev/null and b/public/logos/welcome.webp differ
diff --git a/public/robots.txt b/public/robots.txt
new file mode 100644
index 0000000..d214b76
--- /dev/null
+++ b/public/robots.txt
@@ -0,0 +1,4 @@
+User-agent: *
+Allow: /
+
+Sitemap: https://minecraftlegacy.com/sitemap.xml
diff --git a/public/seo/favicon.png b/public/seo/favicon.png
new file mode 100644
index 0000000..25f3cf6
Binary files /dev/null and b/public/seo/favicon.png differ
diff --git a/public/seo/og-image.png b/public/seo/og-image.png
new file mode 100644
index 0000000..416d9fa
Binary files /dev/null and b/public/seo/og-image.png differ
diff --git a/public/site.webmanifest b/public/site.webmanifest
new file mode 100644
index 0000000..c72ace7
--- /dev/null
+++ b/public/site.webmanifest
@@ -0,0 +1,26 @@
+{
+ "name": "Minecraft Legacy Repository Index",
+ "short_name": "Minecraft Legacy",
+ "description": "Search and prioritize Minecraft Legacy repositories, source mirrors, and Discord bot resources.",
+ "start_url": "/",
+ "display": "standalone",
+ "background_color": "#0d0e10",
+ "theme_color": "#0d0e10",
+ "icons": [
+ {
+ "src": "/logos/MINECRAFT%20LEGACY%20EDITION%20small.png",
+ "sizes": "192x192",
+ "type": "image/png"
+ },
+ {
+ "src": "/logos/MINECRAFT%20LEGACY%20EDITION%20medium.png",
+ "sizes": "384x384",
+ "type": "image/png"
+ },
+ {
+ "src": "/logos/MINECRAFT%20LEGACY%20EDITION%20logo%20large.png",
+ "sizes": "512x512",
+ "type": "image/png"
+ }
+ ]
+}
diff --git a/public/sitemap.xml b/public/sitemap.xml
new file mode 100644
index 0000000..d32ca94
--- /dev/null
+++ b/public/sitemap.xml
@@ -0,0 +1,8 @@
+
+
+
+ https://minecraftlegacy.com/
+ daily
+ 1.0
+
+
diff --git a/src/App.jsx b/src/App.jsx
new file mode 100644
index 0000000..54cbf57
--- /dev/null
+++ b/src/App.jsx
@@ -0,0 +1,402 @@
+import { useEffect, useMemo, useRef, useState } from "react";
+
+import dirtBg from "../assets/images/backgrounds/Dirt_background_JE1.webp";
+import endPoemBg from "../assets/images/backgrounds/End_Poem_Background_JE.webp";
+import endStoneBg from "../assets/images/backgrounds/End_Stone_background_BE2.webp";
+import portalBg from "../assets/images/backgrounds/Portal_Backgrounid_Je1.webp";
+import steveAndAlex from "../assets/images/deco/steveandalex.png";
+import technoDeco from "../assets/images/deco/techno.png";
+import codLoader from "../assets/images/loading/Cod_loading.webp";
+import gearLoader from "../assets/images/loading/Gear_loading.webp";
+import logoLarge from "../assets/images/logos/MINECRAFT LEGACY EDITION logo large.png";
+import logoMedium from "../assets/images/logos/MINECRAFT LEGACY EDITION medium.png";
+import logoSmall from "../assets/images/logos/MINECRAFT LEGACY EDITION small.png";
+import clickSoundFile from "../assets/audio/sound/click.mp3";
+import pigSoundFile from "../assets/audio/sound/pig.mp3";
+import ariaMath from "../assets/audio/music/Aria Math.mp3";
+import beginning from "../assets/audio/music/Beginning.mp3";
+import biomeFest from "../assets/audio/music/Biome Fest.mp3";
+import blindSpots from "../assets/audio/music/Blind Spots.mp3";
+import clark from "../assets/audio/music/Clark.mp3";
+import danny from "../assets/audio/music/Danny.mp3";
+import dreiton from "../assets/audio/music/Dreiton.mp3";
+import dryHands from "../assets/audio/music/Dry Hands.mp3";
+import haggstrom from "../assets/audio/music/Haggstrom.mp3";
+import hauntMuskie from "../assets/audio/music/Haunt Muskie.mp3";
+import miceOnVenus from "../assets/audio/music/Mice On Venus.mp3";
+import minecraftSong from "../assets/audio/music/Minecraft.mp3";
+import moogCity from "../assets/audio/music/Moog City 2.mp3";
+import subwooferLullaby from "../assets/audio/music/Subwoofer Lullaby.mp3";
+import sweden from "../assets/audio/music/Sweden.mp3";
+import taswell from "../assets/audio/music/Taswell.mp3";
+import wetHands from "../assets/audio/music/Wet Hands.mp3";
+
+const logoSet = {
+ small: logoSmall,
+ medium: logoMedium,
+ large: logoLarge
+};
+
+const COD_EASTER_EGG_CHANCE = 0.0000003;
+const MIN_LOADING_MS = 1200;
+const LOADER_FADE_MS = 420;
+
+const MUSIC_TRACKS = [
+ ariaMath,
+ beginning,
+ biomeFest,
+ blindSpots,
+ clark,
+ danny,
+ dreiton,
+ dryHands,
+ haggstrom,
+ hauntMuskie,
+ miceOnVenus,
+ minecraftSong,
+ moogCity,
+ subwooferLullaby,
+ sweden,
+ taswell,
+ wetHands
+];
+
+const BACKGROUND_IMAGES = [dirtBg, endPoemBg, endStoneBg, portalBg];
+
+function randomItem(list) {
+ return list[Math.floor(Math.random() * list.length)];
+}
+
+function App() {
+ const [repoConfig, setRepoConfig] = useState([]);
+ const [query, setQuery] = useState("");
+ const [page, setPage] = useState(1);
+ const [loading, setLoading] = useState(true);
+ const [error, setError] = useState("");
+ const [loaderFadingOut, setLoaderFadingOut] = useState(false);
+ const [showLoader, setShowLoader] = useState(true);
+
+ const startTimeRef = useRef(Date.now());
+ const audioStartedRef = useRef(false);
+ const backgroundMusicRef = useRef(null);
+ const clickPoolRef = useRef([]);
+ const clickIndexRef = useRef(0);
+
+ const pigAudioRef = useRef(null);
+ const pigTimerRef = useRef(null);
+
+ const backgroundImage = useMemo(() => randomItem(BACKGROUND_IMAGES), []);
+ const loadingImage = useMemo(() => {
+ return Math.random() < COD_EASTER_EGG_CHANCE ? codLoader : gearLoader;
+ }, []);
+ const isCodLoadingScreen = loadingImage === codLoader;
+
+ useEffect(() => {
+ const loadRepos = async () => {
+ try {
+ const jsonFile = window.location.hostname === "localhost" ? "placeholder.json" : "projects.json";
+ const response = await fetch(`https://raw.githubusercontent.com/MinecraftConsole/json/refs/heads/main/${jsonFile}`);
+ if (!response.ok) {
+ throw new Error(`Could not load project list (${response.status})`);
+ }
+ const data = await response.json();
+ setRepoConfig(Array.isArray(data.repos) ? data.repos : []);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : "Unknown error loading repos");
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ loadRepos();
+ }, []);
+
+ useEffect(() => {
+ if (loading) return;
+
+ const elapsed = Date.now() - startTimeRef.current;
+ const waitMs = Math.max(0, MIN_LOADING_MS - elapsed);
+ const fadeTimer = window.setTimeout(() => {
+ setLoaderFadingOut(true);
+ }, waitMs);
+ const hideTimer = window.setTimeout(() => {
+ setShowLoader(false);
+ }, waitMs + LOADER_FADE_MS);
+
+ return () => {
+ window.clearTimeout(fadeTimer);
+ window.clearTimeout(hideTimer);
+ };
+ }, [loading]);
+
+ useEffect(() => {
+ const music = new Audio(randomItem(MUSIC_TRACKS));
+ music.loop = true;
+ music.volume = 0.14;
+ music.preload = "auto";
+ backgroundMusicRef.current = music;
+
+ clickPoolRef.current = Array.from({ length: 5 }, () => {
+ const click = new Audio(clickSoundFile);
+ click.volume = 0.2;
+ click.preload = "auto";
+ return click;
+ });
+
+ const startMusic = () => {
+ if (audioStartedRef.current) return;
+ audioStartedRef.current = true;
+ void music.play().catch(() => {
+ audioStartedRef.current = false;
+ });
+ };
+
+ const playClickSound = () => {
+ startMusic();
+
+ const pool = clickPoolRef.current;
+ if (!pool.length) return;
+
+ const currentIndex = clickIndexRef.current % pool.length;
+ clickIndexRef.current += 1;
+ const click = pool[currentIndex];
+
+ try {
+ click.currentTime = 0;
+ void click.play();
+ } catch {
+ // Ignore playback exceptions from strict browser media policies.
+ }
+ };
+
+ window.addEventListener("mousedown", playClickSound, true);
+ window.addEventListener("touchstart", startMusic, true);
+ window.addEventListener("keydown", startMusic, true);
+
+ return () => {
+ window.removeEventListener("mousedown", playClickSound, true);
+ window.removeEventListener("touchstart", startMusic, true);
+ window.removeEventListener("keydown", startMusic, true);
+ music.pause();
+ music.src = "";
+ };
+ }, []);
+
+ useEffect(() => {
+ const pig = new Audio(pigSoundFile);
+ pig.volume = 0.35;
+ pig.preload = "auto";
+ pigAudioRef.current = pig;
+ return () => { pig.pause(); pig.src = ""; };
+ }, []);
+
+ const handleTechnoMouseEnter = () => {
+ pigTimerRef.current = window.setTimeout(() => {
+ const pig = pigAudioRef.current;
+ if (pig) {
+ pig.currentTime = 0;
+ void pig.play().catch(() => {});
+ }
+ }, 5000);
+ };
+
+ const handleTechnoMouseLeave = () => {
+ if (pigTimerRef.current) {
+ window.clearTimeout(pigTimerRef.current);
+ pigTimerRef.current = null;
+ }
+ };
+
+ const sortedRepos = useMemo(() => {
+ return [...repoConfig].sort((a, b) => {
+ const aPriority = Number.isFinite(a.priority) ? a.priority : 9999;
+ const bPriority = Number.isFinite(b.priority) ? b.priority : 9999;
+ if (aPriority !== bPriority) return aPriority - bPriority;
+ return String(a.name || "").localeCompare(String(b.name || ""));
+ });
+ }, [repoConfig]);
+
+ const filteredRepos = useMemo(() => {
+ const normalized = query.trim().toLowerCase();
+ if (!normalized) return sortedRepos;
+
+ return sortedRepos.filter((repo) => {
+ const priorityLabel = `p${repo.priority ?? ""}`.toLowerCase();
+ return (
+ String(repo.name || "").toLowerCase().includes(normalized) ||
+ String(repo.url || "").toLowerCase().includes(normalized) ||
+ priorityLabel.includes(normalized)
+ );
+ });
+ }, [query, sortedRepos]);
+
+ const REPOS_PER_PAGE = 4;
+ const totalPages = Math.max(1, Math.ceil(filteredRepos.length / REPOS_PER_PAGE));
+ const currentPage = Math.min(page, totalPages);
+ const pagedRepos = filteredRepos.slice((currentPage - 1) * REPOS_PER_PAGE, currentPage * REPOS_PER_PAGE);
+
+ return (
+
+
+
+
+
+ {showLoader && (
+
+
+ Loading Legacy World...
+ Not affiliated with Mojang AB or Microsoft. "Minecraft" is a trademark of Mojang Synergies AB.
+
+ )}
+
+
+
+
+
+
+
+
+ Minecraft Legacy Repository Index
+ Legacy Repository Index
+
+ Search Minecraft Legacy repositories, source mirrors, and Discord bot resources sorted by
+ priority.
+
+
+ Join the Discord
+
+
+
+
+
+ Search repos
+
+
+ { setQuery(event.target.value); setPage(1); }}
+ placeholder="Search by name, URL, or priority (p1, p2...)"
+ autoComplete="off"
+ />
+ {query && (
+ setQuery("")}>
+ Clear
+
+ )}
+
+
+
+ {loading && Loading repo list...
}
+ {error && {error}
}
+
+ {!loading && !error && (
+ <>
+ Showing {filteredRepos.length} repos - Page {currentPage} of {totalPages}
+
+
+ {totalPages > 1 && (
+
+ setPage((p) => Math.max(1, p - 1))}
+ >
+ Prev
+
+ {currentPage} / {totalPages}
+ = totalPages}
+ onClick={() => setPage((p) => Math.min(totalPages, p + 1))}
+ >
+ Next
+
+
+ )}
+
+ {filteredRepos.length === 0 && (
+ No repos matched your search.
+ )}
+
+
+
+ >
+ )}
+
+
+
+
+
+
"If you wish to defeat me, train for another 100 years."
+
- Technoblade
+
Technoblade Never Dies.
+
+
+
+
+ Buy Me a Coffee
+
+
+ Not affiliated with Mojang AB or Microsoft. "Minecraft" is a trademark of Mojang Synergies AB.
+
+ );
+}
+
+export default App;
diff --git a/src/main.jsx b/src/main.jsx
new file mode 100644
index 0000000..0b822e6
--- /dev/null
+++ b/src/main.jsx
@@ -0,0 +1,11 @@
+import React from "react";
+import ReactDOM from "react-dom/client";
+import "typeface-minecraft";
+import App from "./App.jsx";
+import "./styles.css";
+
+ReactDOM.createRoot(document.getElementById("root")).render(
+
+
+
+);
diff --git a/src/styles.css b/src/styles.css
new file mode 100644
index 0000000..4f008e0
--- /dev/null
+++ b/src/styles.css
@@ -0,0 +1,669 @@
+:root {
+ --bg: #121214;
+ --bg-2: #1a1b1f;
+ --panel: rgb(23 25 30 / 0.55);
+ --stone: #c3bcb5;
+ --text: #efebe7;
+ --muted: #bfb6ae;
+ --line: rgb(65 71 84 / 0.4);
+ --accent: #88bb55;
+ --accent-2: #709944;
+ --danger: #ff7d7d;
+ --mc-btn: #737373;
+ --mc-btn-light: #9d9d9d;
+ --mc-btn-dark: #565656;
+ --mc-btn-shadow: #3a3a3a;
+}
+
+* {
+ box-sizing: border-box;
+}
+
+body {
+ margin: 0;
+ min-height: 100vh;
+ font-family: "Minecraft", "Trebuchet MS", sans-serif;
+ color: var(--text);
+ background: #0d0e11;
+ overflow-y: auto;
+ scrollbar-width: none;
+}
+
+body::-webkit-scrollbar {
+ display: none;
+}
+
+.page-shell {
+ min-height: 100vh;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ padding: clamp(10px, 2.5vw, 20px);
+ position: relative;
+ overflow: hidden;
+}
+
+.page-shell::before {
+ content: "";
+ position: absolute;
+ inset: 0;
+ background-image: var(--legacy-bg-image);
+ background-size: 480px;
+ background-repeat: repeat;
+ background-position: center;
+ opacity: 0.035;
+ pointer-events: none;
+ image-rendering: pixelated;
+ mix-blend-mode: luminosity;
+}
+
+/* Steve & Alex top-right */
+.top-link {
+ position: fixed;
+ top: 12px;
+ right: 16px;
+ z-index: 3;
+ background: none;
+ border: none;
+ padding: 0;
+ line-height: 0;
+}
+
+.top-link:hover {
+ filter: brightness(1.18);
+}
+
+.top-link-image {
+ display: block;
+ width: clamp(64px, 8vw, 110px);
+ height: auto;
+ image-rendering: pixelated;
+}
+
+/* Main content panel */
+.content-panel {
+ position: relative;
+ z-index: 1;
+ width: min(920px, 100%);
+ margin-top: clamp(10px, 3vh, 32px);
+ border: 2px solid rgb(80 88 104 / 0.3);
+ background: rgb(14 16 20 / 0.6);
+ border-radius: 4px;
+ padding: 20px clamp(14px, 3.5vw, 32px) 24px;
+ box-shadow:
+ inset 0 1px 0 rgb(255 255 255 / 0.04),
+ 0 20px 50px rgb(0 0 0 / 0.4);
+ backdrop-filter: blur(10px);
+ -webkit-backdrop-filter: blur(10px);
+ transition: opacity 320ms ease;
+}
+
+.content-panel.is-waiting {
+ opacity: 0;
+}
+
+/* Hero / Logo */
+.hero {
+ text-align: center;
+}
+
+.hero-logo {
+ width: min(100%, 560px);
+ height: auto;
+ margin: 0 auto;
+ filter: drop-shadow(0 4px 0 rgb(0 0 0 / 0.38));
+}
+
+.subtitle {
+ margin: 6px 0 0;
+ text-transform: uppercase;
+ letter-spacing: 0.25em;
+ font-size: 0.64rem;
+ color: var(--muted);
+}
+
+.seo-heading {
+ margin: 8px 0 0;
+ font-size: clamp(0.88rem, 1.5vw, 1.08rem);
+ line-height: 1.2;
+}
+
+.seo-intro {
+ margin: 6px auto 0;
+ max-width: 60ch;
+ color: var(--muted);
+ font-size: 0.78rem;
+ line-height: 1.5;
+}
+
+.discord-link {
+ display: inline-block;
+ margin: 8px auto 0;
+ padding: 5px 14px;
+ font-family: inherit;
+ font-size: 0.74rem;
+ font-weight: 700;
+ color: #7289da;
+ text-decoration: none;
+ border: 2px solid rgb(114 137 218 / 0.25);
+ border-radius: 2px;
+ background: rgb(114 137 218 / 0.08);
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.4);
+ box-shadow:
+ inset 0 1px 0 rgb(255 255 255 / 0.04),
+ inset 0 -2px 0 rgb(0 0 0 / 0.15);
+ transition: background 140ms ease, border-color 140ms ease, color 140ms ease;
+}
+
+.discord-link:hover {
+ background: rgb(114 137 218 / 0.18);
+ border-color: rgb(114 137 218 / 0.5);
+ color: #fff;
+}
+
+/* Search */
+.search-row {
+ margin: 16px auto 12px;
+ width: min(700px, 100%);
+ display: grid;
+ gap: 6px;
+}
+
+.search-wrap {
+ position: relative;
+}
+
+.search-label {
+ font-weight: 700;
+ font-size: 0.78rem;
+ color: var(--stone);
+ text-transform: uppercase;
+ letter-spacing: 0.06em;
+}
+
+input[type="search"] {
+ width: 100%;
+ border: 2px solid #3e4452;
+ border-radius: 2px;
+ padding: 9px 80px 9px 14px;
+ font-size: 0.84rem;
+ font-family: inherit;
+ color: var(--text);
+ background: rgb(0 0 0 / 0.5);
+ outline: none;
+ box-shadow:
+ inset 0 2px 0 rgb(0 0 0 / 0.3),
+ inset 0 -1px 0 rgb(255 255 255 / 0.04);
+ transition: border-color 160ms ease, box-shadow 160ms ease;
+}
+
+.clear-search {
+ position: absolute;
+ top: 50%;
+ right: 8px;
+ transform: translateY(-50%);
+ border: 2px solid #4f5663;
+ background: var(--mc-btn-dark);
+ color: var(--text);
+ border-radius: 2px;
+ font-size: 0.72rem;
+ font-weight: 700;
+ font-family: inherit;
+ padding: 6px 10px;
+ cursor: pointer;
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.5);
+ box-shadow:
+ inset 0 -2px 0 rgb(0 0 0 / 0.25),
+ inset 0 1px 0 rgb(255 255 255 / 0.08);
+}
+
+.clear-search:hover {
+ background: var(--mc-btn);
+ border-color: var(--accent);
+ color: var(--accent);
+}
+
+input[type="search"]:focus {
+ border-color: var(--accent);
+ box-shadow:
+ inset 0 2px 0 rgb(0 0 0 / 0.3),
+ 0 0 0 2px rgb(136 187 85 / 0.2);
+}
+
+/* Repo list */
+.repo-count {
+ margin: 0 0 6px;
+ color: var(--muted);
+ font-size: 0.74rem;
+ text-transform: uppercase;
+ letter-spacing: 0.05em;
+}
+
+.repo-list {
+ list-style: none;
+ margin: 0;
+ padding: 0;
+ display: flex;
+ flex-direction: column;
+ gap: 4px;
+}
+
+.repo-item {
+ padding: 0;
+}
+
+/* Minecraft-style button cards */
+.repo-link-row {
+ display: grid;
+ grid-template-columns: 48px 1fr;
+ gap: 12px;
+ align-items: center;
+ padding: 9px 14px;
+ color: inherit;
+ text-decoration: none;
+ background: rgb(50 50 50 / 0.55);
+ border: 2px solid rgb(80 80 80 / 0.45);
+ border-radius: 2px;
+ box-shadow:
+ inset 0 1px 0 rgb(255 255 255 / 0.06),
+ inset 0 -2px 0 rgb(0 0 0 / 0.2),
+ 0 2px 6px rgb(0 0 0 / 0.25);
+ transition: background 120ms ease, border-color 120ms ease, transform 80ms ease;
+}
+
+.repo-link-row:hover {
+ background: rgb(70 70 70 / 0.6);
+ border-color: rgb(136 187 85 / 0.5);
+ transform: translateY(-1px);
+ box-shadow:
+ inset 0 1px 0 rgb(255 255 255 / 0.08),
+ inset 0 -2px 0 rgb(0 0 0 / 0.25),
+ 0 4px 12px rgb(0 0 0 / 0.35);
+}
+
+.repo-link-row:active {
+ transform: translateY(1px);
+ box-shadow:
+ inset 0 2px 0 rgb(0 0 0 / 0.3),
+ 0 1px 2px rgb(0 0 0 / 0.2);
+}
+
+.repo-priority {
+ text-align: center;
+ font-weight: 800;
+ color: var(--accent);
+ font-size: 0.78rem;
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.6);
+}
+
+.repo-link {
+ color: var(--text);
+ font-weight: 600;
+ font-size: 0.82rem;
+ line-height: 1.35;
+ word-break: break-word;
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.4);
+}
+
+.repo-link-row:hover .repo-link {
+ color: #fff;
+}
+
+/* Pagination */
+.pagination {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: 8px;
+ margin: 10px 0 4px;
+}
+
+.page-btn {
+ font-family: "Minecraft", "Trebuchet MS", sans-serif;
+ font-size: 0.78rem;
+ color: var(--text);
+ background: var(--mc-btn);
+ border: 2px solid;
+ border-color: var(--mc-btn-light) var(--mc-btn-dark) var(--mc-btn-dark) var(--mc-btn-light);
+ border-radius: 2px;
+ padding: 5px 14px;
+ cursor: pointer;
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.5);
+ box-shadow: 0 2px 0 var(--mc-btn-shadow);
+ transition: background 100ms ease, transform 80ms ease;
+}
+
+.page-btn:hover:not(:disabled) {
+ background: var(--mc-btn-light);
+}
+
+.page-btn:active:not(:disabled) {
+ transform: translateY(1px);
+ border-color: var(--mc-btn-dark) var(--mc-btn-light) var(--mc-btn-light) var(--mc-btn-dark);
+ box-shadow: none;
+}
+
+.page-btn:disabled {
+ opacity: 0.35;
+ cursor: not-allowed;
+}
+
+.page-info {
+ color: var(--muted);
+ font-size: 0.76rem;
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.5);
+}
+
+/* Technoblade memorial */
+.techno-memorial {
+ position: relative;
+ z-index: 1;
+ width: min(1000px, 100%);
+ margin: 28px 0 32px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ gap: clamp(18px, 3.5vw, 44px);
+ text-decoration: none;
+ color: inherit;
+ cursor: pointer;
+}
+
+.techno-pig {
+ width: clamp(100px, 16vw, 200px);
+ height: auto;
+ image-rendering: pixelated;
+ filter: drop-shadow(0 5px 16px rgb(0 0 0 / 0.55));
+ transition: transform 220ms ease, filter 220ms ease;
+ flex-shrink: 0;
+}
+
+.techno-memorial:hover .techno-pig {
+ transform: scale(1.06);
+ filter: drop-shadow(0 8px 28px rgb(212 160 160 / 0.45));
+}
+
+.techno-text {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+}
+
+.techno-quote {
+ margin: 0;
+ font-size: clamp(1.2rem, 2.6vw, 2.2rem);
+ color: var(--text);
+ line-height: 1.15;
+ text-shadow: 2px 2px 0 rgb(0 0 0 / 0.5);
+ transition: color 180ms ease;
+}
+
+.techno-memorial:hover .techno-quote {
+ color: #d4a0a0;
+}
+
+.techno-attr {
+ margin: 0;
+ font-size: clamp(0.88rem, 1.4vw, 1.1rem);
+ color: var(--muted);
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.4);
+}
+
+.techno-note {
+ margin: 6px 0 0;
+ font-size: clamp(0.72rem, 1.1vw, 0.88rem);
+ color: rgb(191 182 174 / 0.65);
+ font-style: italic;
+}
+
+/* Status / Error */
+.status {
+ margin: 10px 0 0;
+ color: var(--muted);
+ font-size: 0.8rem;
+}
+
+.status.error {
+ color: var(--danger);
+}
+
+/* Loader */
+.loader-screen {
+ position: fixed;
+ inset: 0;
+ z-index: 10;
+ display: grid;
+ place-items: center;
+ align-content: center;
+ gap: 12px;
+ background: linear-gradient(180deg, #0a0b0d, #111318);
+ opacity: 1;
+ transition: opacity 420ms ease;
+}
+
+.loader-screen.is-fading-out {
+ opacity: 0;
+ pointer-events: none;
+}
+
+.loader-art {
+ width: clamp(76px, 12vw, 136px);
+ height: auto;
+ image-rendering: pixelated;
+}
+
+.loader-art.is-gear {
+ animation: loader-spin 1.7s linear infinite;
+}
+
+.loader-label {
+ margin: 0;
+ color: var(--muted);
+ font-size: 0.78rem;
+ letter-spacing: 0.08em;
+ text-transform: uppercase;
+}
+
+.loader-disclaimer {
+ margin: 16px 0 0;
+ color: rgb(191 182 174 / 0.35);
+ font-size: 0.52rem;
+ text-align: center;
+ max-width: 340px;
+ line-height: 1.4;
+}
+
+.disclaimer {
+ position: relative;
+ z-index: 1;
+ margin: 8px 0 16px;
+ color: rgb(191 182 174 / 0.3);
+ font-size: 0.54rem;
+ text-align: center;
+ max-width: 480px;
+ line-height: 1.4;
+}
+
+@keyframes loader-spin {
+ to {
+ transform: rotate(360deg);
+ }
+}
+
+/* Buy Me a Coffee */
+.bmc-link {
+ position: fixed;
+ bottom: 14px;
+ right: 16px;
+ z-index: 5;
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 8px 14px;
+ border-radius: 2px;
+ background: rgb(255 221 0 / 0.1);
+ border: 2px solid rgb(255 221 0 / 0.2);
+ color: #ffdd00;
+ font-size: 0.76rem;
+ font-weight: 700;
+ font-family: inherit;
+ text-decoration: none;
+ letter-spacing: 0.03em;
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.5);
+ box-shadow:
+ inset 0 1px 0 rgb(255 255 255 / 0.05),
+ inset 0 -2px 0 rgb(0 0 0 / 0.15);
+ transition: background 180ms ease, border-color 180ms ease;
+}
+
+.bmc-link:hover {
+ background: rgb(255 221 0 / 0.2);
+ border-color: rgb(255 221 0 / 0.45);
+}
+
+.bmc-icon {
+ font-size: 1.1rem;
+}
+
+/* Submit Project Button */
+.submit-project-wrap {
+ margin: 14px 0 4px;
+ display: flex;
+ justify-content: center;
+}
+
+.submit-project-btn {
+ position: relative;
+ display: inline-block;
+ padding: 9px 20px;
+ background: rgb(50 50 50 / 0.55);
+ border: 2px solid rgb(80 80 80 / 0.45);
+ border-radius: 2px;
+ color: var(--accent);
+ font-family: inherit;
+ font-size: 0.82rem;
+ font-weight: 700;
+ text-decoration: none;
+ text-shadow: 1px 1px 0 rgb(0 0 0 / 0.5);
+ cursor: pointer;
+ box-shadow:
+ inset 0 1px 0 rgb(255 255 255 / 0.06),
+ inset 0 -2px 0 rgb(0 0 0 / 0.2),
+ 0 2px 6px rgb(0 0 0 / 0.25);
+ transition: background 120ms ease, border-color 120ms ease;
+}
+
+.submit-project-btn:hover {
+ background: rgb(70 70 70 / 0.6);
+ border-color: rgb(136 187 85 / 0.5);
+ color: #fff;
+}
+
+.submit-project-btn:active {
+ transform: translateY(1px);
+ box-shadow:
+ inset 0 2px 0 rgb(0 0 0 / 0.3),
+ 0 1px 2px rgb(0 0 0 / 0.2);
+}
+
+/* Minecraft item tooltip */
+.mc-tooltip {
+ position: absolute;
+ bottom: calc(100% + 10px);
+ left: 50%;
+ transform: translateX(-50%);
+ min-width: 220px;
+ padding: 6px 8px;
+ background: #100010;
+ border: 2px solid #28007a;
+ border-image: linear-gradient(180deg, #5000d0 0%, #28007a 100%) 1;
+ pointer-events: none;
+ opacity: 0;
+ transition: opacity 150ms ease;
+ z-index: 10;
+ image-rendering: pixelated;
+}
+
+.mc-tooltip::before {
+ content: "";
+ position: absolute;
+ inset: 1px;
+ border: 1px solid rgb(80 0 208 / 0.25);
+ pointer-events: none;
+}
+
+.submit-project-btn:hover .mc-tooltip {
+ opacity: 1;
+}
+
+.mc-tooltip-title {
+ margin: 0 0 4px;
+ font-size: 0.82rem;
+ font-weight: 700;
+ color: #fff;
+ text-shadow: 1px 1px 0 #000;
+}
+
+.mc-tooltip-desc {
+ margin: 0;
+ font-size: 0.7rem;
+ color: #aaa;
+ line-height: 1.4;
+ text-shadow: 1px 1px 0 #000;
+}
+
+.mc-tooltip-hint {
+ margin: 6px 0 0;
+ font-size: 0.64rem;
+ color: #5f5;
+ font-style: italic;
+ text-shadow: 1px 1px 0 #000;
+}
+
+/* Mobile */
+@media (max-width: 560px) {
+ .top-link {
+ top: 8px;
+ right: 8px;
+ }
+
+ .top-link-image {
+ width: 46px;
+ }
+
+ .content-panel {
+ border-radius: 2px;
+ padding-top: 18px;
+ margin-top: 56px;
+ }
+
+ .repo-link-row {
+ grid-template-columns: 42px 1fr;
+ gap: 10px;
+ padding: 10px 12px;
+ }
+
+ .techno-memorial {
+ flex-direction: column;
+ text-align: center;
+ }
+
+ .techno-pig {
+ width: 120px;
+ }
+
+ .techno-quote {
+ font-size: 1.3rem;
+ }
+
+ .top-link-image {
+ width: 60px;
+ }
+
+ .bmc-link {
+ bottom: 8px;
+ right: 8px;
+ font-size: 0.68rem;
+ padding: 6px 10px;
+ }
+}
diff --git a/vite.config.js b/vite.config.js
new file mode 100644
index 0000000..db1b19e
--- /dev/null
+++ b/vite.config.js
@@ -0,0 +1,6 @@
+import { defineConfig } from "vite";
+import react from "@vitejs/plugin-react";
+
+export default defineConfig({
+ plugins: [react()]
+});