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 @@ +
+ +Minecraft Legacy Edition + +
+ +### Source code for [minecraftlegacy.com](https://minecraftlegacy.com) + +[![Website](https://img.shields.io/badge/minecraftlegacy.com-222?style=for-the-badge&logo=firefox&logoColor=88bb55)](https://minecraftlegacy.com) +[![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=fff)](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 ( +
+ + Steve and Alex + + + {showLoader && ( +
+ {isCodLoadingScreen +

Loading Legacy World...

+

Not affiliated with Mojang AB or Microsoft. "Minecraft" is a trademark of Mojang Synergies AB.

+
+ )} + +
+
+ + + + Minecraft Legacy logo + +

Minecraft Legacy Repository Index

+

Legacy Repository Index

+

+ Search Minecraft Legacy repositories, source mirrors, and Discord bot resources sorted by + priority. +

+ + Join the Discord + +
+ +
+ +
+ { setQuery(event.target.value); setPage(1); }} + placeholder="Search by name, URL, or priority (p1, p2...)" + autoComplete="off" + /> + {query && ( + + )} +
+
+ + {loading &&

Loading repo list...

} + {error &&

{error}

} + + {!loading && !error && ( + <> +

Showing {filteredRepos.length} repos - Page {currentPage} of {totalPages}

+ + + {totalPages > 1 && ( +
+ + {currentPage} / {totalPages} + +
+ )} + + {filteredRepos.length === 0 && ( +

No repos matched your search.

+ )} + +
+ + + Submit a Project +
+

Submit a Project

+

Know of a Legacy Edition project?

+

Open a PR or issue to get it listed!

+

Click to visit the repo

+
+
+
+ + + )} +
+ + + Technoblade +
+

"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()] +});