From 5f2426c4016a7025ec88b1a153372fdd4c1dc680 Mon Sep 17 00:00:00 2001 From: Rodolfo Martinez Date: Thu, 5 Feb 2026 19:12:58 -0500 Subject: [PATCH] added more maple apps --- native/wordpress/maple-fonts-wp.zip | Bin 0 -> 133666 bytes web/mapleblocks-frontend-prototype/README.md | 12 + .../eslint.config.js | 33 + web/mapleblocks-frontend-prototype/index.html | 13 + .../package-lock.json | 4135 +++++++++++++++++ .../package.json | 31 + .../postcss.config.js | 6 + .../public/vite.svg | 1 + .../src/App.css | 42 + .../src/App.jsx | 381 ++ .../src/assets/react.svg | 1 + .../src/components/GameBoard.jsx | 1096 +++++ .../src/components/ScoresScreen.jsx | 215 + .../src/components/WelcomeScreen.jsx | 359 ++ .../src/index.css | 304 ++ .../src/main.jsx | 10 + .../src/utils/blocksGame.js | 471 ++ .../src/utils/blocksLogic.js | 32 + .../src/utils/blocksPieces.js | 387 ++ .../src/utils/blocksScoring.js | 242 + .../src/utils/gameinfo.js | 255 + .../src/utils/mobile.jsx | 334 ++ .../src/utils/storage.js | 261 ++ .../tailwind.config.js | 83 + .../vite.config.js | 9 + web/mapleqr-frontend-prototype/index.html | 13 + .../package-lock.json | 2912 ++++++++++++ web/mapleqr-frontend-prototype/package.json | 23 + .../postcss.config.js | 6 + web/mapleqr-frontend-prototype/src/App.jsx | 20 + .../src/components/Archive.zip | Bin 0 -> 5820 bytes .../src/components/StepColorSettings.jsx | 160 + .../src/components/StepInputDetails.jsx | 128 + .../src/components/StepLogoSettings.jsx | 113 + .../src/components/StepResult.jsx | 52 + .../src/components/StepResult.jsx.bak | 237 + .../src/components/StepResult.jsx.bak.gpt | 127 + .../src/components/StepSizeOptions.jsx | 39 + .../src/components/StepStyleOptions.jsx | 127 + .../src/components/StepTypeSelect.jsx | 47 + web/mapleqr-frontend-prototype/src/index.css | 12 + web/mapleqr-frontend-prototype/src/main.jsx | 11 + .../src/pages/WizardPage.jsx | 71 + .../src/utils/qrCode.js | 264 ++ .../src/utils/storage.js | 26 + .../tailwind.config.js | 11 + web/maplesudoku-frontend-prototype/README.md | 12 + .../eslint.config.js | 33 + web/maplesudoku-frontend-prototype/index.html | 13 + .../package-lock.json | 3597 ++++++++++++++ .../package.json | 32 + .../postcss.config.js | 6 + .../public/vite.svg | 1 + .../src/App.css | 42 + .../src/App.jsx | 21 + .../src/Untitled | 11 + .../src/assets/react.svg | 1 + .../src/components/SudokuBoard.jsx | 795 ++++ .../src/components/SudokuWelcome.jsx | 119 + .../src/index.css | 65 + .../src/main.jsx | 10 + .../src/utils/SudokuGenerator.js | 295 ++ .../src/utils/hints.js | 201 + .../tailwind.config.js | 4 + .../vite.config.js | 7 + .../index.html | 13 + .../package-lock.json | 3052 ++++++++++++ .../package.json | 23 + .../postcss.config.js | 6 + .../public/snake-icon-svg.svg | 27 + .../src/App.jsx | 25 + .../src/components/GameBoard.jsx | 480 ++ .../src/components/GameOverScreen.jsx | 124 + .../src/components/HighScores.jsx | 121 + .../src/components/Settings.jsx | 121 + .../src/components/WelcomeScreen.jsx | 122 + .../src/index.css | 73 + .../src/index.js | 11 + .../src/index.jsx | 10 + .../src/utils/storage.js | 158 + .../tailwind.config.js | 16 + .../vite.config.js | 16 + 82 files changed, 22775 insertions(+) create mode 100644 native/wordpress/maple-fonts-wp.zip create mode 100644 web/mapleblocks-frontend-prototype/README.md create mode 100644 web/mapleblocks-frontend-prototype/eslint.config.js create mode 100644 web/mapleblocks-frontend-prototype/index.html create mode 100644 web/mapleblocks-frontend-prototype/package-lock.json create mode 100644 web/mapleblocks-frontend-prototype/package.json create mode 100644 web/mapleblocks-frontend-prototype/postcss.config.js create mode 100644 web/mapleblocks-frontend-prototype/public/vite.svg create mode 100644 web/mapleblocks-frontend-prototype/src/App.css create mode 100644 web/mapleblocks-frontend-prototype/src/App.jsx create mode 100644 web/mapleblocks-frontend-prototype/src/assets/react.svg create mode 100644 web/mapleblocks-frontend-prototype/src/components/GameBoard.jsx create mode 100644 web/mapleblocks-frontend-prototype/src/components/ScoresScreen.jsx create mode 100644 web/mapleblocks-frontend-prototype/src/components/WelcomeScreen.jsx create mode 100644 web/mapleblocks-frontend-prototype/src/index.css create mode 100644 web/mapleblocks-frontend-prototype/src/main.jsx create mode 100644 web/mapleblocks-frontend-prototype/src/utils/blocksGame.js create mode 100644 web/mapleblocks-frontend-prototype/src/utils/blocksLogic.js create mode 100644 web/mapleblocks-frontend-prototype/src/utils/blocksPieces.js create mode 100644 web/mapleblocks-frontend-prototype/src/utils/blocksScoring.js create mode 100644 web/mapleblocks-frontend-prototype/src/utils/gameinfo.js create mode 100644 web/mapleblocks-frontend-prototype/src/utils/mobile.jsx create mode 100644 web/mapleblocks-frontend-prototype/src/utils/storage.js create mode 100644 web/mapleblocks-frontend-prototype/tailwind.config.js create mode 100644 web/mapleblocks-frontend-prototype/vite.config.js create mode 100644 web/mapleqr-frontend-prototype/index.html create mode 100644 web/mapleqr-frontend-prototype/package-lock.json create mode 100644 web/mapleqr-frontend-prototype/package.json create mode 100644 web/mapleqr-frontend-prototype/postcss.config.js create mode 100644 web/mapleqr-frontend-prototype/src/App.jsx create mode 100644 web/mapleqr-frontend-prototype/src/components/Archive.zip create mode 100644 web/mapleqr-frontend-prototype/src/components/StepColorSettings.jsx create mode 100644 web/mapleqr-frontend-prototype/src/components/StepInputDetails.jsx create mode 100644 web/mapleqr-frontend-prototype/src/components/StepLogoSettings.jsx create mode 100644 web/mapleqr-frontend-prototype/src/components/StepResult.jsx create mode 100644 web/mapleqr-frontend-prototype/src/components/StepResult.jsx.bak create mode 100644 web/mapleqr-frontend-prototype/src/components/StepResult.jsx.bak.gpt create mode 100644 web/mapleqr-frontend-prototype/src/components/StepSizeOptions.jsx create mode 100644 web/mapleqr-frontend-prototype/src/components/StepStyleOptions.jsx create mode 100644 web/mapleqr-frontend-prototype/src/components/StepTypeSelect.jsx create mode 100644 web/mapleqr-frontend-prototype/src/index.css create mode 100644 web/mapleqr-frontend-prototype/src/main.jsx create mode 100644 web/mapleqr-frontend-prototype/src/pages/WizardPage.jsx create mode 100644 web/mapleqr-frontend-prototype/src/utils/qrCode.js create mode 100644 web/mapleqr-frontend-prototype/src/utils/storage.js create mode 100644 web/mapleqr-frontend-prototype/tailwind.config.js create mode 100644 web/maplesudoku-frontend-prototype/README.md create mode 100644 web/maplesudoku-frontend-prototype/eslint.config.js create mode 100644 web/maplesudoku-frontend-prototype/index.html create mode 100644 web/maplesudoku-frontend-prototype/package-lock.json create mode 100644 web/maplesudoku-frontend-prototype/package.json create mode 100644 web/maplesudoku-frontend-prototype/postcss.config.js create mode 100644 web/maplesudoku-frontend-prototype/public/vite.svg create mode 100644 web/maplesudoku-frontend-prototype/src/App.css create mode 100644 web/maplesudoku-frontend-prototype/src/App.jsx create mode 100644 web/maplesudoku-frontend-prototype/src/Untitled create mode 100644 web/maplesudoku-frontend-prototype/src/assets/react.svg create mode 100644 web/maplesudoku-frontend-prototype/src/components/SudokuBoard.jsx create mode 100644 web/maplesudoku-frontend-prototype/src/components/SudokuWelcome.jsx create mode 100644 web/maplesudoku-frontend-prototype/src/index.css create mode 100644 web/maplesudoku-frontend-prototype/src/main.jsx create mode 100644 web/maplesudoku-frontend-prototype/src/utils/SudokuGenerator.js create mode 100644 web/maplesudoku-frontend-prototype/src/utils/hints.js create mode 100644 web/maplesudoku-frontend-prototype/tailwind.config.js create mode 100644 web/maplesudoku-frontend-prototype/vite.config.js create mode 100644 web/sashisnakegame-frontend-prototype/index.html create mode 100644 web/sashisnakegame-frontend-prototype/package-lock.json create mode 100644 web/sashisnakegame-frontend-prototype/package.json create mode 100644 web/sashisnakegame-frontend-prototype/postcss.config.js create mode 100644 web/sashisnakegame-frontend-prototype/public/snake-icon-svg.svg create mode 100644 web/sashisnakegame-frontend-prototype/src/App.jsx create mode 100644 web/sashisnakegame-frontend-prototype/src/components/GameBoard.jsx create mode 100644 web/sashisnakegame-frontend-prototype/src/components/GameOverScreen.jsx create mode 100644 web/sashisnakegame-frontend-prototype/src/components/HighScores.jsx create mode 100644 web/sashisnakegame-frontend-prototype/src/components/Settings.jsx create mode 100644 web/sashisnakegame-frontend-prototype/src/components/WelcomeScreen.jsx create mode 100644 web/sashisnakegame-frontend-prototype/src/index.css create mode 100644 web/sashisnakegame-frontend-prototype/src/index.js create mode 100644 web/sashisnakegame-frontend-prototype/src/index.jsx create mode 100644 web/sashisnakegame-frontend-prototype/src/utils/storage.js create mode 100644 web/sashisnakegame-frontend-prototype/tailwind.config.js create mode 100644 web/sashisnakegame-frontend-prototype/vite.config.js diff --git a/native/wordpress/maple-fonts-wp.zip b/native/wordpress/maple-fonts-wp.zip new file mode 100644 index 0000000000000000000000000000000000000000..3f1422a7e0952825f53a090d3e017186a3541db7 GIT binary patch literal 133666 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 z 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∋T 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 literal 0 HcmV?d00001 diff --git a/web/mapleblocks-frontend-prototype/README.md b/web/mapleblocks-frontend-prototype/README.md new file mode 100644 index 0000000..7059a96 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/README.md @@ -0,0 +1,12 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/web/mapleblocks-frontend-prototype/eslint.config.js b/web/mapleblocks-frontend-prototype/eslint.config.js new file mode 100644 index 0000000..ec2b712 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/eslint.config.js @@ -0,0 +1,33 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' + +export default [ + { ignores: ['dist'] }, + { + files: ['**/*.{js,jsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...js.configs.recommended.rules, + ...reactHooks.configs.recommended.rules, + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +] diff --git a/web/mapleblocks-frontend-prototype/index.html b/web/mapleblocks-frontend-prototype/index.html new file mode 100644 index 0000000..0c589ec --- /dev/null +++ b/web/mapleblocks-frontend-prototype/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + React + + +

+ + + diff --git a/web/mapleblocks-frontend-prototype/package-lock.json b/web/mapleblocks-frontend-prototype/package-lock.json new file mode 100644 index 0000000..3b775bd --- /dev/null +++ b/web/mapleblocks-frontend-prototype/package-lock.json @@ -0,0 +1,4135 @@ +{ + "name": "mapleblocks", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mapleblocks", + "version": "0.0.0", + "dependencies": { + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.6.0" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.21", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "vite": "^6.3.5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", + "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", + "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/helper-compilation-targets": "^7.27.1", + "@babel/helper-module-transforms": "^7.27.1", + "@babel/helpers": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1", + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", + "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.27.1", + "@babel/types": "^7.27.1", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@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-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", + "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "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.27.1", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", + "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", + "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.27.1" + }, + "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.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", + "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.27.1", + "@babel/parser": "^7.27.1", + "@babel/template": "^7.27.1", + "@babel/types": "^7.27.1", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/types": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", + "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", + "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", + "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", + "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", + "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", + "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", + "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", + "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", + "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", + "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", + "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", + "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", + "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", + "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", + "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", + "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", + "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", + "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", + "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", + "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", + "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", + "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", + "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", + "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", + "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", + "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", + "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.20.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", + "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", + "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", + "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", + "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", + "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.14.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.9", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.9.tgz", + "integrity": "sha512-e9MeMtVWo186sgvFFJOPGy7/d2j2mZhLJIdVW0C/xDluuOvymEATqz6zKsP0ZmXGzQtqlyjz5sC1sYQUoJG98w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.41.0.tgz", + "integrity": "sha512-KxN+zCjOYHGwCl4UCtSfZ6jrq/qi88JDUtiEFk8LELEHq2Egfc/FgW+jItZiOLRuQfb/3xJSgFuNPC9jzggX+A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.41.0.tgz", + "integrity": "sha512-yDvqx3lWlcugozax3DItKJI5j05B0d4Kvnjx+5mwiUpWramVvmAByYigMplaoAQ3pvdprGCTCE03eduqE/8mPQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.41.0.tgz", + "integrity": "sha512-2KOU574vD3gzcPSjxO0eyR5iWlnxxtmW1F5CkNOHmMlueKNCQkxR6+ekgWyVnz6zaZihpUNkGxjsYrkTJKhkaw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.41.0.tgz", + "integrity": "sha512-gE5ACNSxHcEZyP2BA9TuTakfZvULEW4YAOtxl/A/YDbIir/wPKukde0BNPlnBiP88ecaN4BJI2TtAd+HKuZPQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.41.0.tgz", + "integrity": "sha512-GSxU6r5HnWij7FoSo7cZg3l5GPg4HFLkzsFFh0N/b16q5buW1NAWuCJ+HMtIdUEi6XF0qH+hN0TEd78laRp7Dg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.41.0.tgz", + "integrity": "sha512-KGiGKGDg8qLRyOWmk6IeiHJzsN/OYxO6nSbT0Vj4MwjS2XQy/5emsmtoqLAabqrohbgLWJ5GV3s/ljdrIr8Qjg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.41.0.tgz", + "integrity": "sha512-46OzWeqEVQyX3N2/QdiU/CMXYDH/lSHpgfBkuhl3igpZiaB3ZIfSjKuOnybFVBQzjsLwkus2mjaESy8H41SzvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.41.0.tgz", + "integrity": "sha512-lfgW3KtQP4YauqdPpcUZHPcqQXmTmH4nYU0cplNeW583CMkAGjtImw4PKli09NFi2iQgChk4e9erkwlfYem6Lg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.41.0.tgz", + "integrity": "sha512-nn8mEyzMbdEJzT7cwxgObuwviMx6kPRxzYiOl6o/o+ChQq23gfdlZcUNnt89lPhhz3BYsZ72rp0rxNqBSfqlqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.41.0.tgz", + "integrity": "sha512-l+QK99je2zUKGd31Gh+45c4pGDAqZSuWQiuRFCdHYC2CSiO47qUWsCcenrI6p22hvHZrDje9QjwSMAFL3iwXwQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.41.0.tgz", + "integrity": "sha512-WbnJaxPv1gPIm6S8O/Wg+wfE/OzGSXlBMbOe4ie+zMyykMOeqmgD1BhPxZQuDqwUN+0T/xOFtL2RUWBspnZj3w==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.41.0.tgz", + "integrity": "sha512-eRDWR5t67/b2g8Q/S8XPi0YdbKcCs4WQ8vklNnUYLaSWF+Cbv2axZsp4jni6/j7eKvMLYCYdcsv8dcU+a6QNFg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.41.0.tgz", + "integrity": "sha512-TWrZb6GF5jsEKG7T1IHwlLMDRy2f3DPqYldmIhnA2DVqvvhY2Ai184vZGgahRrg8k9UBWoSlHv+suRfTN7Ua4A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.41.0.tgz", + "integrity": "sha512-ieQljaZKuJpmWvd8gW87ZmSFwid6AxMDk5bhONJ57U8zT77zpZ/TPKkU9HpnnFrM4zsgr4kiGuzbIbZTGi7u9A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.41.0.tgz", + "integrity": "sha512-/L3pW48SxrWAlVsKCN0dGLB2bi8Nv8pr5S5ocSM+S0XCn5RCVCXqi8GVtHFsOBBCSeR+u9brV2zno5+mg3S4Aw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.41.0.tgz", + "integrity": "sha512-XMLeKjyH8NsEDCRptf6LO8lJk23o9wvB+dJwcXMaH6ZQbbkHu2dbGIUindbMtRN6ux1xKi16iXWu6q9mu7gDhQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.41.0.tgz", + "integrity": "sha512-m/P7LycHZTvSQeXhFmgmdqEiTqSV80zn6xHaQ1JSqwCtD1YGtwEK515Qmy9DcB2HK4dOUVypQxvhVSy06cJPEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.41.0.tgz", + "integrity": "sha512-4yodtcOrFHpbomJGVEqZ8fzD4kfBeCbpsUy5Pqk4RluXOdsWdjLnjhiKy2w3qzcASWd04fp52Xz7JKarVJ5BTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.41.0.tgz", + "integrity": "sha512-tmazCrAsKzdkXssEc65zIE1oC6xPHwfy9d5Ta25SRCDOZS+I6RypVVShWALNuU9bxIfGA0aqrmzlzoM5wO5SPQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.41.0.tgz", + "integrity": "sha512-h1J+Yzjo/X+0EAvR2kIXJDuTuyT7drc+t2ALY0nIcGPbTatNOf0VWdhEA2Z4AAjv6X1NJV7SYo5oCTYRJhSlVA==", + "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.20.7", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", + "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.1.5", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.5.tgz", + "integrity": "sha512-piErsCVVbpMMT2r7wbawdZsq4xMvIAhQuac2gedQHysu1TZYEigE6pnFfgZT+/jQnrRuF5r+SHzuehFjfRjr4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz", + "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.5.0.tgz", + "integrity": "sha512-JuLWaEqypaJmOJPLWwO335Ig6jSgC1FTONCWAxnqcQthLTK/Yc9aH6hr9z/87xciejbQcnP3GnA1FWUSWeXaeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/plugin-transform-react-jsx-self": "^7.25.9", + "@babel/plugin-transform-react-jsx-source": "^7.25.9", + "@rolldown/pluginutils": "1.0.0-beta.9", + "@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" + } + }, + "node_modules/acorn": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "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": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "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/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", + "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.157", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.157.tgz", + "integrity": "sha512-/0ybgsQd1muo8QlnuTpKwtl0oX5YMlUGbm8xyqgDU00motRkKFFbUJySAQBWcY79rVqNLWIWa87BGVGClwAB2w==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esbuild": { + "version": "0.25.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", + "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.4", + "@esbuild/android-arm": "0.25.4", + "@esbuild/android-arm64": "0.25.4", + "@esbuild/android-x64": "0.25.4", + "@esbuild/darwin-arm64": "0.25.4", + "@esbuild/darwin-x64": "0.25.4", + "@esbuild/freebsd-arm64": "0.25.4", + "@esbuild/freebsd-x64": "0.25.4", + "@esbuild/linux-arm": "0.25.4", + "@esbuild/linux-arm64": "0.25.4", + "@esbuild/linux-ia32": "0.25.4", + "@esbuild/linux-loong64": "0.25.4", + "@esbuild/linux-mips64el": "0.25.4", + "@esbuild/linux-ppc64": "0.25.4", + "@esbuild/linux-riscv64": "0.25.4", + "@esbuild/linux-s390x": "0.25.4", + "@esbuild/linux-x64": "0.25.4", + "@esbuild/netbsd-arm64": "0.25.4", + "@esbuild/netbsd-x64": "0.25.4", + "@esbuild/openbsd-arm64": "0.25.4", + "@esbuild/openbsd-x64": "0.25.4", + "@esbuild/sunos-x64": "0.25.4", + "@esbuild/win32-arm64": "0.25.4", + "@esbuild/win32-ia32": "0.25.4", + "@esbuild/win32-x64": "0.25.4" + } + }, + "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/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.27.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", + "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.20.0", + "@eslint/config-helpers": "^0.2.1", + "@eslint/core": "^0.14.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.27.0", + "@eslint/plugin-kit": "^0.3.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.3.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", + "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", + "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/globals": { + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", + "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "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/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "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/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "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/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/react": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", + "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", + "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.0" + } + }, + "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/react-router": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz", + "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz", + "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==", + "license": "MIT", + "dependencies": { + "react-router": "7.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.41.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.41.0.tgz", + "integrity": "sha512-HqMFpUbWlf/tvcxBFNKnJyzc7Lk+XO3FGc3pbNBLqEbOz0gPLRgcrlS3UF4MfUrVlstOaP/q0kM6GVvi+LrLRg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.41.0", + "@rollup/rollup-android-arm64": "4.41.0", + "@rollup/rollup-darwin-arm64": "4.41.0", + "@rollup/rollup-darwin-x64": "4.41.0", + "@rollup/rollup-freebsd-arm64": "4.41.0", + "@rollup/rollup-freebsd-x64": "4.41.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.41.0", + "@rollup/rollup-linux-arm-musleabihf": "4.41.0", + "@rollup/rollup-linux-arm64-gnu": "4.41.0", + "@rollup/rollup-linux-arm64-musl": "4.41.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.41.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-gnu": "4.41.0", + "@rollup/rollup-linux-riscv64-musl": "4.41.0", + "@rollup/rollup-linux-s390x-gnu": "4.41.0", + "@rollup/rollup-linux-x64-gnu": "4.41.0", + "@rollup/rollup-linux-x64-musl": "4.41.0", + "@rollup/rollup-win32-arm64-msvc": "4.41.0", + "@rollup/rollup-win32-ia32-msvc": "4.41.0", + "@rollup/rollup-win32-x64-msvc": "4.41.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "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/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", + "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.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 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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" + }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/web/mapleblocks-frontend-prototype/package.json b/web/mapleblocks-frontend-prototype/package.json new file mode 100644 index 0000000..0a41226 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/package.json @@ -0,0 +1,31 @@ +{ + "name": "mapleblocks", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-router-dom": "^7.6.0" + }, + "devDependencies": { + "@eslint/js": "^9.25.0", + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "autoprefixer": "^10.4.21", + "eslint": "^9.25.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.19", + "globals": "^16.0.0", + "postcss": "^8.5.3", + "tailwindcss": "^3.4.17", + "vite": "^6.3.5" + } +} diff --git a/web/mapleblocks-frontend-prototype/postcss.config.js b/web/mapleblocks-frontend-prototype/postcss.config.js new file mode 100644 index 0000000..2aa7205 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/web/mapleblocks-frontend-prototype/public/vite.svg b/web/mapleblocks-frontend-prototype/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/web/mapleblocks-frontend-prototype/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/App.css b/web/mapleblocks-frontend-prototype/src/App.css new file mode 100644 index 0000000..b9d355d --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/web/mapleblocks-frontend-prototype/src/App.jsx b/web/mapleblocks-frontend-prototype/src/App.jsx new file mode 100644 index 0000000..364db1c --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/App.jsx @@ -0,0 +1,381 @@ +import React, { useState, useEffect } from "react"; +import { + BrowserRouter, + Routes, + Route, + Navigate, + useNavigate, +} from "react-router-dom"; + +// Import your components (adjust paths as needed) +import WelcomeScreen from "./components/WelcomeScreen"; +import ScoresScreen from "./components/ScoresScreen"; +import GameBoard from "./components/GameBoard"; + +// Import storage utility (adjust path as needed) +// import storage from './utils/storage.js'; + +// Mock storage for demo (replace with actual import) +const mockStorage = { + settings: { + getStartingLevel: () => + parseInt(localStorage.getItem("mapleBlocks_startingLevel") || "0"), + getGameSpeed: () => + localStorage.getItem("mapleBlocks_gameSpeed") || "Normal", + saveStartingLevel: (level) => + localStorage.setItem("mapleBlocks_startingLevel", level.toString()), + saveGameSpeed: (speed) => + localStorage.setItem("mapleBlocks_gameSpeed", speed), + }, + highScores: { + getTopScores: (limit = 10) => { + try { + const scores = JSON.parse( + localStorage.getItem("mapleBlocks_highScores") || "[]", + ); + return scores.slice(0, limit); + } catch { + return []; + } + }, + addHighScore: (score, level, gameSpeed, playerName = "Anonymous") => { + try { + const scores = JSON.parse( + localStorage.getItem("mapleBlocks_highScores") || "[]", + ); + + const newScore = { + score: parseInt(score), + level: parseInt(level), + gameSpeed, + playerName, + date: new Date().toISOString(), + timestamp: Date.now(), + }; + + scores.push(newScore); + scores.sort((a, b) => b.score - a.score); + const topScores = scores.slice(0, 50); + + localStorage.setItem( + "mapleBlocks_highScores", + JSON.stringify(topScores), + ); + return topScores; + } catch (error) { + console.error("Failed to save high score:", error); + return []; + } + }, + isHighScore: (score) => { + try { + const scores = JSON.parse( + localStorage.getItem("mapleBlocks_highScores") || "[]", + ); + if (scores.length < 50) return true; + return score > scores[scores.length - 1].score; + } catch { + return true; + } + }, + }, +}; + +// Game Over Screen Component +const GameOverScreen = ({ + gameResult, + onPlayAgain, + onMainMenu, + onViewScores, +}) => { + const [playerName, setPlayerName] = useState(""); + const [isHighScore, setIsHighScore] = useState(false); + const [scoreSaved, setScoreSaved] = useState(false); + + useEffect(() => { + const highScore = mockStorage.highScores.isHighScore(gameResult.score); + setIsHighScore(highScore); + }, [gameResult.score]); + + const handleSaveScore = () => { + if (playerName.trim()) { + mockStorage.highScores.addHighScore( + gameResult.score, + gameResult.level, + gameResult.gameSpeed || "Normal", + playerName.trim(), + ); + setScoreSaved(true); + } + }; + + const formatTime = (milliseconds) => { + const totalSeconds = Math.floor(milliseconds / 1000); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes}:${seconds.toString().padStart(2, "0")}`; + }; + + return ( +
+
+ {/* Game Over Title */} +
+

Game Over

+

Thanks for playing Maple Blocks!

+
+ + {/* Final Stats */} +
+
+

Final Score

+

+ {gameResult.score.toLocaleString()} +

+
+ +
+
+

Lines

+

{gameResult.lines}

+
+ +
+

Level

+

+ {Math.floor(gameResult.lines / 10)} +

+
+
+ + {gameResult.gameTime && ( +
+

Game Time

+

+ {formatTime(gameResult.gameTime)} +

+
+ )} +
+ + {/* High Score Input */} + {isHighScore && !scoreSaved && ( +
+

🎉 New High Score! 🎉

+ setPlayerName(e.target.value.slice(0, 20))} + className="w-full bg-white text-gray-800 px-3 py-2 rounded mb-3 text-center font-semibold" + maxLength={20} + /> + +
+ )} + + {scoreSaved && ( +
+

✅ Score Saved!

+
+ )} + + {/* Action Buttons */} +
+ + + + + +
+
+
+ ); +}; + +// Main App Router Component +const AppRouter = () => { + const navigate = useNavigate(); + const [gameResult, setGameResult] = useState(null); + + // Handle starting a new game from welcome screen + const handleStartGame = (settings) => { + // Save settings to storage + if (settings) { + mockStorage.settings.saveStartingLevel(settings.level); + mockStorage.settings.saveGameSpeed(settings.speed); + } + + navigate("/game"); + }; + + // Handle viewing scores from welcome screen + const handleViewScores = () => { + navigate("/scores"); + }; + + // Handle game over + const handleGameOver = (result) => { + setGameResult(result); + navigate("/game-over"); + }; + + // Handle quitting game + const handleQuitGame = () => { + navigate("/"); + }; + + // Handle going back from scores + const handleBackFromScores = () => { + navigate("/"); + }; + + // Handle play again from game over + const handlePlayAgain = () => { + setGameResult(null); + navigate("/game"); + }; + + // Handle main menu from game over + const handleMainMenu = () => { + setGameResult(null); + navigate("/"); + }; + + // Handle view scores from game over + const handleViewScoresFromGameOver = () => { + navigate("/scores"); + }; + + return ( + + {/* Welcome Screen - Main Menu */} + + } + /> + + {/* Scores Screen */} + } + /> + + {/* Game Board */} + + } + /> + + {/* Game Over Screen */} + + ) : ( + + ) + } + /> + + {/* Redirect any unknown routes to home */} + } /> + + ); +}; + +// Error Boundary Component +class ErrorBoundary extends React.Component { + constructor(props) { + super(props); + this.state = { hasError: false }; + } + + static getDerivedStateFromError(error) { + return { hasError: true }; + } + + componentDidCatch(error, errorInfo) { + console.error("Maple Blocks Error:", error, errorInfo); + } + + render() { + if (this.state.hasError) { + return ( +
+
+

+ Oops! Something went wrong +

+

+ Maple Blocks encountered an error. Please refresh the page to try + again. +

+ +
+
+ ); + } + + return this.props.children; + } +} + +// Main App Component +function App() { + return ( + + +
+ +
+
+
+ ); +} + +export default App; diff --git a/web/mapleblocks-frontend-prototype/src/assets/react.svg b/web/mapleblocks-frontend-prototype/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/components/GameBoard.jsx b/web/mapleblocks-frontend-prototype/src/components/GameBoard.jsx new file mode 100644 index 0000000..a3d6097 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/components/GameBoard.jsx @@ -0,0 +1,1096 @@ +import React, { useState, useEffect, useCallback, useRef } from "react"; +import { getInstructionsForModal } from "../utils/gameinfo.js"; +import { MobileLayout, useMobileDetection } from "../utils/mobile.jsx"; + +// Game constants +const BOARD_WIDTH = 10; +const BOARD_HEIGHT = 20; +const GAME_STATES = { + PLAYING: "playing", + PAUSED: "paused", + GAME_OVER: "game_over", +}; + +// Piece definitions +const PIECES = { + I: { shape: [[1, 1, 1, 1]], color: "#00f5ff", name: "Line" }, + O: { + shape: [ + [1, 1], + [1, 1], + ], + color: "#ffff00", + name: "Square", + }, + T: { + shape: [ + [0, 1, 0], + [1, 1, 1], + ], + color: "#a000f0", + name: "T-Shape", + }, + S: { + shape: [ + [0, 1, 1], + [1, 1, 0], + ], + color: "#00f000", + name: "S-Shape", + }, + Z: { + shape: [ + [1, 1, 0], + [0, 1, 1], + ], + color: "#f00000", + name: "Z-Shape", + }, + J: { + shape: [ + [1, 0, 0], + [1, 1, 1], + ], + color: "#0000f0", + name: "J-Shape", + }, + L: { + shape: [ + [0, 0, 1], + [1, 1, 1], + ], + color: "#f0a000", + name: "L-Shape", + }, +}; + +const PIECE_TYPES = Object.keys(PIECES); + +// Utility functions +const createEmptyBoard = () => + Array(BOARD_HEIGHT) + .fill() + .map(() => Array(BOARD_WIDTH).fill(0)); + +const generateRandomPiece = () => { + const type = PIECE_TYPES[Math.floor(Math.random() * PIECE_TYPES.length)]; + const piece = PIECES[type]; + return { + type, + shape: piece.shape.map((row) => [...row]), + color: piece.color, + name: piece.name, + x: Math.floor(BOARD_WIDTH / 2) - 1, + y: 0, + rotation: 0, + }; +}; + +const isValidPosition = (piece, board, x, y) => { + if (!piece?.shape) return false; + for (let row = 0; row < piece.shape.length; row++) { + for (let col = 0; col < piece.shape[row].length; col++) { + if (piece.shape[row][col]) { + const newX = x + col; + const newY = y + row; + if (newX < 0 || newX >= BOARD_WIDTH || newY >= BOARD_HEIGHT) + return false; + if (newY >= 0 && board[newY][newX]) return false; + } + } + } + return true; +}; + +const placePiece = (piece, board) => { + const newBoard = board.map((row) => [...row]); + if (piece?.shape) { + piece.shape.forEach((row, rowIndex) => { + row.forEach((cell, colIndex) => { + if (cell) { + const x = piece.x + colIndex; + const y = piece.y + rowIndex; + if (y >= 0) newBoard[y][x] = piece.color; + } + }); + }); + } + return newBoard; +}; + +const clearLines = (board) => { + const newBoard = []; + let linesCleared = 0; + for (let row = 0; row < BOARD_HEIGHT; row++) { + if (board[row].every((cell) => cell !== 0)) { + linesCleared++; + } else { + newBoard.push([...board[row]]); + } + } + while (newBoard.length < BOARD_HEIGHT) { + newBoard.unshift(Array(BOARD_WIDTH).fill(0)); + } + return { board: newBoard, linesCleared }; +}; + +const calculateScore = (linesCleared, level) => { + const lineScores = [0, 40, 100, 300, 1200]; + return lineScores[linesCleared] * (level + 1); +}; + +const getDropSpeed = (gameSpeed, level) => { + const baseSpeed = { Slow: 1000, Normal: 800, Fast: 600 }[gameSpeed] || 800; + return Math.max(100, baseSpeed - level * 50); +}; + +const formatGameTime = (milliseconds) => { + const totalSeconds = Math.floor(milliseconds / 1000); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes}:${seconds.toString().padStart(2, "0")}`; +}; + +const createStartingBoard = (difficulty) => { + const board = createEmptyBoard(); + if (difficulty > 0) { + for (let i = 0; i < difficulty; i++) { + const row = BOARD_HEIGHT - 1 - i; + if (row >= 0) { + for (let col = 0; col < BOARD_WIDTH; col++) { + if (Math.random() > 0.15) { + board[row][col] = "#666666"; + } + } + } + } + } + return board; +}; + +const GameBoard = ({ + startingLevel = 0, + gameSpeed = "Normal", + onGameOver, + onQuit, +}) => { + // Game state + const [gameState, setGameState] = useState(() => ({ + board: createStartingBoard(startingLevel), + score: 0, + lines: 0, + level: 0, + difficulty: startingLevel, + gameSpeed, + isPaused: false, + gameOver: false, + gameStarted: false, + startTime: Date.now(), + totalPausedDuration: 0, + linesCleared: { single: 0, double: 0, triple: 0, quad: 0 }, + consecutiveQuads: 0, + comboCount: 0, + })); + + const [currentPiece, setCurrentPiece] = useState(null); + const [nextPiece, setNextPiece] = useState(null); + const [lastClearType, setLastClearType] = useState(""); + const [showClearAnimation, setShowClearAnimation] = useState(false); + const [showInstructions, setShowInstructions] = useState(false); + const [showQuitConfirm, setShowQuitConfirm] = useState(false); + const [showMobileMenu, setShowMobileMenu] = useState(false); + + // Detect mobile device + const isMobile = useMobileDetection(); + + // Refs for game loop + const gameLoopRef = useRef(null); + const lastTimeRef = useRef(0); + + // Initialize game pieces + useEffect(() => { + const first = generateRandomPiece(); + const next = generateRandomPiece(); + setCurrentPiece(first); + setNextPiece(next); + setGameState((prev) => ({ ...prev, gameStarted: true })); + }, []); + + // Drop speed calculation + const getCurrentDropSpeed = useCallback(() => { + return getDropSpeed(gameState.gameSpeed, gameState.level); + }, [gameState.gameSpeed, gameState.level]); + + // Move piece function + const movePiece = useCallback( + (direction) => { + if (!currentPiece || gameState.isPaused || gameState.gameOver) return; + + const newX = currentPiece.x + direction; + if ( + isValidPosition(currentPiece, gameState.board, newX, currentPiece.y) + ) { + setCurrentPiece((prev) => ({ ...prev, x: newX })); + } + }, + [currentPiece, gameState.isPaused, gameState.gameOver, gameState.board], + ); + + // Rotate piece function + const rotatePiece = useCallback(() => { + if (!currentPiece || gameState.isPaused || gameState.gameOver) return; + + // O-piece doesn't need rotation + if (currentPiece.type === "O") return; + + // Simple clockwise rotation + const rotated = currentPiece.shape[0].map((_, index) => + currentPiece.shape.map((row) => row[index]).reverse(), + ); + + const rotatedPiece = { ...currentPiece, shape: rotated }; + + if ( + isValidPosition( + rotatedPiece, + gameState.board, + currentPiece.x, + currentPiece.y, + ) + ) { + setCurrentPiece(rotatedPiece); + } + }, [currentPiece, gameState.isPaused, gameState.gameOver, gameState.board]); + + // Drop piece function + const dropPiece = useCallback(() => { + if (!currentPiece || gameState.isPaused || gameState.gameOver) return; + + const newY = currentPiece.y + 1; + if (isValidPosition(currentPiece, gameState.board, currentPiece.x, newY)) { + setCurrentPiece((prev) => ({ ...prev, y: newY })); + } else { + // Place piece and handle line clearing + const newBoard = placePiece(currentPiece, gameState.board); + const { board: clearedBoard, linesCleared } = clearLines(newBoard); + + // Update game state + setGameState((prev) => { + const newLines = prev.lines + linesCleared; + const newLevel = Math.floor(newLines / 10); + const newScore = + prev.score + + (linesCleared > 0 ? calculateScore(linesCleared, newLevel) : 0); + + // Update line clear statistics + const clearTypes = { 1: "single", 2: "double", 3: "triple", 4: "quad" }; + const clearType = clearTypes[linesCleared]; + const updatedLineClears = clearType + ? { + ...prev.linesCleared, + [clearType]: prev.linesCleared[clearType] + 1, + } + : prev.linesCleared; + + return { + ...prev, + board: clearedBoard, + score: newScore, + lines: newLines, + level: newLevel, + linesCleared: updatedLineClears, + }; + }); + + // Show clear animation if lines were cleared + if (linesCleared > 0) { + const clearTypes = { + 1: "Single", + 2: "Double", + 3: "Triple", + 4: "Maple Blocks!", + }; + setLastClearType(clearTypes[linesCleared]); + setShowClearAnimation(true); + setTimeout(() => setShowClearAnimation(false), 1500); + } + + // Check game over + if (!isValidPosition(nextPiece, clearedBoard, nextPiece.x, nextPiece.y)) { + setGameState((prev) => ({ ...prev, gameOver: true })); + if (onGameOver) { + onGameOver({ + score: gameState.score, + lines: gameState.lines + linesCleared, + level: gameState.difficulty, + gameTime: Date.now() - gameState.startTime, + }); + } + return; + } + + // Spawn new pieces + setCurrentPiece(nextPiece); + setNextPiece(generateRandomPiece()); + } + }, [currentPiece, gameState, nextPiece, onGameOver]); + + // Game loop + useEffect(() => { + if (!gameState.gameStarted || gameState.isPaused || gameState.gameOver) + return; + + const gameLoop = (currentTime) => { + if (currentTime - lastTimeRef.current >= getCurrentDropSpeed()) { + dropPiece(); + lastTimeRef.current = currentTime; + } + gameLoopRef.current = requestAnimationFrame(gameLoop); + }; + + gameLoopRef.current = requestAnimationFrame(gameLoop); + + return () => { + if (gameLoopRef.current) { + cancelAnimationFrame(gameLoopRef.current); + } + }; + }, [ + gameState.gameStarted, + gameState.isPaused, + gameState.gameOver, + getCurrentDropSpeed, + dropPiece, + ]); + + // Keyboard controls + useEffect(() => { + const handleKeyPress = (e) => { + if (gameState.gameOver) return; + + switch (e.key) { + case "ArrowLeft": + e.preventDefault(); + movePiece(-1); + break; + case "ArrowRight": + e.preventDefault(); + movePiece(1); + break; + case "ArrowDown": + e.preventDefault(); + dropPiece(); + break; + case " ": + e.preventDefault(); + rotatePiece(); + break; + case "p": + case "P": + e.preventDefault(); + togglePause(); + break; + } + }; + + window.addEventListener("keydown", handleKeyPress); + return () => window.removeEventListener("keydown", handleKeyPress); + }, [movePiece, dropPiece, rotatePiece, gameState.gameOver]); + + // Pause/resume functions + const togglePause = () => { + setGameState((prev) => ({ ...prev, isPaused: !prev.isPaused })); + }; + + // Instructions modal functions + const handleShowInstructions = () => { + setShowInstructions(true); + }; + + const handleCloseInstructions = () => { + setShowInstructions(false); + }; + + // Quit confirmation functions + const handleQuitClick = () => { + setShowQuitConfirm(true); + }; + + const handleConfirmQuit = () => { + setShowQuitConfirm(false); + if (onQuit) { + onQuit(); + } + }; + + const handleCancelQuit = () => { + setShowQuitConfirm(false); + }; + + // Mobile menu functions + const handleMobileMenuToggle = () => { + // Pause game when opening menu on mobile + if (!showMobileMenu && !gameState.isPaused && !gameState.gameOver) { + setGameState((prev) => ({ ...prev, isPaused: true })); + } + setShowMobileMenu(!showMobileMenu); + }; + + // Render board with current piece + const renderBoard = () => { + const displayBoard = gameState.board.map((row) => [...row]); + + // Add current piece to display + if (currentPiece) { + currentPiece.shape.forEach((row, rowIndex) => { + row.forEach((cell, colIndex) => { + if (cell) { + const x = currentPiece.x + colIndex; + const y = currentPiece.y + rowIndex; + if (y >= 0 && y < BOARD_HEIGHT && x >= 0 && x < BOARD_WIDTH) { + displayBoard[y][x] = currentPiece.color; + } + } + }); + }); + } + + return displayBoard; + }; + + // Render next piece preview + const renderNextPiece = () => { + if (!nextPiece) return null; + + return ( +
+
+

+ 🔮Next: +

+
+ {/* Render the actual piece shape without extra spacing */} +
+ {nextPiece.shape.map((row, rowIndex) => + row.map((cell, colIndex) => ( +
+ )), + )} +
+
+
+
+ ); + }; + + // Get current game time + const getCurrentGameTime = () => { + const elapsed = Date.now() - gameState.startTime; + return formatGameTime(elapsed); + }; + + // Calculate progress to next level + const getLevelProgress = () => { + const remainder = gameState.lines % 10; + return (remainder / 10) * 100; + }; + + const displayBoard = renderBoard(); + + // Mobile layout + if (isMobile) { + return ( + + {/* Mobile Game Board */} +
+
+
+ {displayBoard.map((row, rowIndex) => + row.map((cell, colIndex) => ( +
+ )), + )} +
+ + {/* Clear Animation */} + {showClearAnimation && ( +
+
+
+ {lastClearType} +
+
+ {lastClearType === "Maple Blocks!" + ? "🍁 Amazing! 🍁" + : "Great job!"} +
+
+
+ )} + + {/* Pause Overlay */} + {gameState.isPaused && !gameState.gameOver && ( +
+
+
+ ⏸️ PAUSED +
+
+ Press P or tap pause to resume +
+
+
+ )} +
+ + {/* Game Status - Only Game Over */} + {gameState.gameOver && ( +
+ 💀 GAME OVER +
+ )} + + {/* Mobile Controls */} +
+ + + +
+
+ + {/* Instructions Modal */} + {showInstructions && ( + + )} + + {/* Quit Confirmation Modal */} + {showQuitConfirm && ( + + )} + + ); + } + + // Desktop layout + return ( +
+
+ {/* Left Panel - Stats */} +
+
+

+ 📊 + Game Stats +

+ +
+
+

Score

+

+ {gameState.score.toLocaleString()} +

+
+ +
+

Lines

+

+ {gameState.lines} +

+
+ +
+

Level

+

+ {gameState.level} +

+
+ +
+

Difficulty

+

+ {gameState.difficulty} +

+
+ +
+

Time

+

+ {getCurrentGameTime()} +

+
+
+
+ + {/* Next Piece */} + {renderNextPiece()} +
+ + {/* Center - Game Board */} +
+
+
+ {displayBoard.map((row, rowIndex) => + row.map((cell, colIndex) => ( +
+ )), + )} +
+ + {/* Clear Animation */} + {showClearAnimation && ( +
+
+
+ {lastClearType} +
+
+ {lastClearType === "Maple Blocks!" + ? "🍁 Amazing! 🍁" + : "Great job!"} +
+
+
+ )} + + {/* Pause Overlay */} + {gameState.isPaused && !gameState.gameOver && ( +
+
+
+ ⏸️ PAUSED +
+
+ Press P or tap pause to resume +
+
+
+ )} +
+ + {/* Game Status - Only Game Over */} + {gameState.gameOver && ( +
+ 💀 GAME OVER +
+ )} + + {/* Mobile Controls */} +
+ + + +
+
+ + {/* Right Panel - Controls */} +
+
+

+ 🎮 + Controls +

+ +
+ + + +
+
+ + {/* Line Clear Stats */} +
+

+ 🎯Clear Stats +

+
+
+ Singles: + + {gameState.linesCleared.single} + +
+
+ Doubles: + + {gameState.linesCleared.double} + +
+
+ Triples: + + {gameState.linesCleared.triple} + +
+
+ Maple Blocks: + + {gameState.linesCleared.quad} + +
+
+
+ +
+

🎯 Progress

+
+

Next level: {10 - (gameState.lines % 10)} lines

+
+
+
+

+ Speed: {gameState.gameSpeed} • Drop: {getCurrentDropSpeed()}ms +

+
+ + {/* Instructions Link */} +
+ +
+
+
+ + {/* Instructions Modal */} + {showInstructions && ( + + )} + + {/* Quit Confirmation Modal */} + {showQuitConfirm && ( + + )} +
+
+ ); +}; + +// Instructions Modal Component +const InstructionsModal = ({ onClose, instructions }) => { + return ( +
+
+ {/* Modal Header */} +
+

+ 📖 + {instructions.title} +

+ +
+ + {/* Modal Content */} +
+ {instructions.sections.map((section, sectionIndex) => ( +
+

+ 🎮 + {section.title} +

+ +
+ {section.items.map((item, itemIndex) => ( +
+ {item.icon} +
+
+ + {item.key} + + + {item.description} + +
+
+
+ ))} +
+
+ ))} + + {/* Tips Section */} +
+

+ 💡 + Pro Tips +

+
+

• Look at the next piece preview to plan your moves

+

• Try to keep your stack relatively flat

+

+ • Save a column for I-pieces (line pieces) to clear multiple + lines +

+

• Go for "Maple Blocks!" (4 lines) for maximum points!

+
+
+
+ + {/* Modal Footer */} +
+
+

+ 🍁 Master these techniques to become a Maple Blocks champion! +

+ +
+
+
+
+ ); +}; + +// Quit Confirmation Modal Component +const QuitConfirmModal = ({ onConfirm, onCancel, gameState }) => { + return ( +
+
+ {/* Modal Header */} +
+

+ ⚠️ + Quit Game? +

+
+ + {/* Modal Content */} +
+

+ Are you sure you want to quit your current game? Your progress will + be lost. +

+ + {/* Current Game Stats */} +
+

Current Game:

+
+
+ Score: + + {gameState.score.toLocaleString()} + +
+
+ Lines: + + {gameState.lines} + +
+
+ Level: + + {gameState.level} + +
+
+ Time: + + {(() => { + const elapsed = Date.now() - gameState.startTime; + const totalSeconds = Math.floor(elapsed / 1000); + const minutes = Math.floor(totalSeconds / 60); + const seconds = totalSeconds % 60; + return `${minutes}:${seconds.toString().padStart(2, "0")}`; + })()} + +
+
+
+
+ + {/* Modal Footer */} +
+ + +
+
+
+ ); +}; + +export default GameBoard; diff --git a/web/mapleblocks-frontend-prototype/src/components/ScoresScreen.jsx b/web/mapleblocks-frontend-prototype/src/components/ScoresScreen.jsx new file mode 100644 index 0000000..20142ec --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/components/ScoresScreen.jsx @@ -0,0 +1,215 @@ +import React, { useState, useEffect } from 'react'; + +const ScoresScreen = ({ onBack }) => { + const [scores, setScores] = useState([]); + + + // Mock storage functions - replace with actual imports when integrated + const mockHighScores = [ + { score: 125000, level: 5, gameSpeed: 'Fast', playerName: 'ProPlayer', date: '2024-05-20T10:30:00Z' }, + { score: 98500, level: 3, gameSpeed: 'Normal', playerName: 'BlockMaster', date: '2024-05-19T15:45:00Z' }, + { score: 87200, level: 2, gameSpeed: 'Normal', playerName: 'TetrisKing', date: '2024-05-18T20:15:00Z' }, + { score: 76800, level: 4, gameSpeed: 'Slow', playerName: 'PuzzleQueen', date: '2024-05-17T12:00:00Z' }, + { score: 65400, level: 1, gameSpeed: 'Fast', playerName: 'SpeedRunner', date: '2024-05-16T18:30:00Z' }, + { score: 54200, level: 0, gameSpeed: 'Normal', playerName: 'Beginner', date: '2024-05-15T14:20:00Z' }, + { score: 43100, level: 2, gameSpeed: 'Slow', playerName: 'Careful', date: '2024-05-14T16:45:00Z' }, + { score: 32800, level: 1, gameSpeed: 'Normal', playerName: 'Learning', date: '2024-05-13T11:15:00Z' } + ]; + + useEffect(() => { + // In real implementation, replace with: storage.highScores.getHighScores() + setScores(mockHighScores); + }, []); + + const getTopScores = () => { + return scores.slice(0, 3); // Show only top 3 + }; + + const formatDate = (dateString) => { + const date = new Date(dateString); + return date.toLocaleDateString('en-US', { + month: 'short', + day: 'numeric', + year: 'numeric' + }); + }; + + const getRankIcon = (index) => { + switch(index) { + case 0: return '👑'; // Crown for 1st place + case 1: return '🥈'; // Silver medal for 2nd + case 2: return '🥉'; // Bronze medal for 3rd + default: return '🏆'; // This won't be used since we only show top 3 + } + }; + + const getSpeedIcon = (speed) => { + switch(speed) { + case 'Slow': return '🐌'; + case 'Normal': return '🚀'; + case 'Fast': return '⚡'; + default: return '🎯'; + } + }; + + const getLevelIcon = (level) => { + if (level === 0) return '🌱'; + if (level <= 2) return '🎯'; + if (level <= 5) return '🔥'; + if (level <= 8) return '💎'; + return '🌟'; + }; + + const clearAllScores = () => { + if (window.confirm('Are you sure you want to clear all high scores? This cannot be undone.')) { + setScores([]); + // In real implementation: storage.highScores.clearHighScores() + } + }; + + const topScores = getTopScores(); + + return ( +
+
+ + {/* Header */} +
+
+
+ 🏆 +

High Scores

+ 🏆 +
+ +
+
+ + {/* Statistics Cards */} +
+
+
+
+

Personal Best

+

+ {scores.length > 0 ? scores[0].score.toLocaleString() : '0'} +

+
+ 👑 +
+
+ +
+
+
+

Total Games

+

{scores.length}

+
+ 🎮 +
+
+ +
+
+
+

Average Score

+

+ {scores.length > 0 + ? Math.round(scores.reduce((sum, s) => sum + s.score, 0) / scores.length).toLocaleString() + : '0' + } +

+
+ 📊 +
+
+
+ + {/* Scores List */} +
+ {topScores.length > 0 ? ( +
+ {topScores.map((score, index) => ( +
+
+
+
+ {getRankIcon(index)} + + #{index + 1} + +
+ +
+

+ {score.playerName} +

+
+ + {getLevelIcon(score.level)} + Level {score.level} + + + {getSpeedIcon(score.gameSpeed)} + {score.gameSpeed} + + + 📅 + {formatDate(score.date)} + +
+
+
+ +
+

+ {score.score.toLocaleString()} +

+

points

+
+
+
+ ))} +
+ ) : ( +
+ 🎯 +

No scores yet!

+

Play some games to see your high scores here.

+
+ )} +
+ + {/* Footer Info */} +
+

+ 🌟 Showing top {topScores.length} scores • Play Maple Blocks to add your score! 🌟 +

+
+ +
+
+ ); +}; + +export default ScoresScreen; \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/components/WelcomeScreen.jsx b/web/mapleblocks-frontend-prototype/src/components/WelcomeScreen.jsx new file mode 100644 index 0000000..5de95b8 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/components/WelcomeScreen.jsx @@ -0,0 +1,359 @@ +import React, { useState, useEffect } from "react"; +import { getInstructionsForModal } from "../utils/gameinfo.js"; + +const WelcomeScreen = ({ onStartGame, onViewScores }) => { + const [selectedLevel, setSelectedLevel] = useState(0); + const [selectedSpeed, setSelectedSpeed] = useState("Normal"); + const [highScores, setHighScores] = useState([]); + const [showInstructions, setShowInstructions] = useState(false); + + // Mock storage functions for demo - replace with actual storage imports + const mockStorage = { + settings: { + getStartingLevel: () => + parseInt(localStorage.getItem("mapleBlocks_startingLevel") || "0"), + getGameSpeed: () => + localStorage.getItem("mapleBlocks_gameSpeed") || "Normal", + saveStartingLevel: (level) => + localStorage.setItem("mapleBlocks_startingLevel", level.toString()), + saveGameSpeed: (speed) => + localStorage.setItem("mapleBlocks_gameSpeed", speed), + }, + highScores: { + getTopScores: (limit = 3) => { + try { + const scores = JSON.parse( + localStorage.getItem("mapleBlocks_highScores") || "[]", + ); + return scores.slice(0, limit); + } catch { + return []; + } + }, + }, + }; + + // Load saved settings and high scores on component mount + useEffect(() => { + // Load saved settings + const savedLevel = mockStorage.settings.getStartingLevel(); + const savedSpeed = mockStorage.settings.getGameSpeed(); + + setSelectedLevel(savedLevel); + setSelectedSpeed(savedSpeed); + + // Load high scores + const topScores = mockStorage.highScores.getTopScores(3); + setHighScores(topScores); + }, []); + + // Save settings whenever they change + useEffect(() => { + mockStorage.settings.saveStartingLevel(selectedLevel); + }, [selectedLevel]); + + useEffect(() => { + mockStorage.settings.saveGameSpeed(selectedSpeed); + }, [selectedSpeed]); + + const speedOptions = ["Slow", "Normal", "Fast"]; + const levelOptions = Array.from({ length: 11 }, (_, i) => i); + + const handleStartGame = () => { + // Save current settings before starting game + mockStorage.settings.saveStartingLevel(selectedLevel); + mockStorage.settings.saveGameSpeed(selectedSpeed); + + // Call parent function with settings (for routing) + if (onStartGame) { + onStartGame({ level: selectedLevel, speed: selectedSpeed }); + } + }; + + const handleViewScores = () => { + // Call parent function (for routing) + if (onViewScores) { + onViewScores(); + } + }; + + const handleShowInstructions = () => { + setShowInstructions(true); + }; + + const handleCloseInstructions = () => { + setShowInstructions(false); + }; + + const getPersonalBest = () => { + return highScores.length > 0 ? highScores[0].score : 0; + }; + + const getTotalGames = () => { + try { + const allScores = JSON.parse( + localStorage.getItem("mapleBlocks_highScores") || "[]", + ); + return allScores.length; + } catch { + return 0; + } + }; + + return ( +
+
+ {/* Game Title */} +
+

+ MAPLE BLOCKS +

+

Classic Block Puzzle Game

+
+ + {/* Quick Stats */} + {(getPersonalBest() > 0 || getTotalGames() > 0) && ( +
+
+

+ Personal Best +

+

+ {getPersonalBest().toLocaleString()} +

+
+
+

Games Played

+

{getTotalGames()}

+
+
+ )} + + {/* Single Top Score */} + {highScores.length > 0 && ( +
+

+ 🏆 + Current Champion +

+
+
+ 👑 +
+

+ {highScores[0].playerName} +

+

+ Level {highScores[0].level} • {highScores[0].gameSpeed} +

+
+
+
+

+ {highScores[0].score.toLocaleString()} +

+

points

+
+
+
+ )} + + {/* Game Settings */} +
+ {/* Level Selection */} +
+ + +
+ + {/* Speed Selection */} +
+ +
+ {speedOptions.map((speed) => ( + + ))} +
+
+
+ + {/* Action Buttons */} +
+ + + +
+ + {/* Settings Info */} +
+

+ Current Settings: Level {selectedLevel} •{" "} + {selectedSpeed} Speed +

+
+ + {/* Instructions Link */} +
+ +
+ + {/* Instructions Modal */} + {showInstructions && ( + + )} +
+
+ ); +}; + +// Instructions Modal Component +const InstructionsModal = ({ onClose, instructions }) => { + return ( +
+
+ {/* Modal Header */} +
+

+ 📖 + {instructions.title} +

+ +
+ + {/* Modal Content */} +
+ {instructions.sections.map((section, sectionIndex) => ( +
+

+ 🎮 + {section.title} +

+ +
+ {section.items.map((item, itemIndex) => ( +
+ {item.icon} +
+
+ + {item.key} + + + {item.description} + +
+
+
+ ))} +
+
+ ))} + + {/* Tips Section */} +
+

+ 💡 + Pro Tips +

+
+

• Look at the next piece preview to plan your moves

+

• Try to keep your stack relatively flat

+

+ • Save a column for I-pieces (line pieces) to clear multiple + lines +

+

• Go for "Maple Blocks!" (4 lines) for maximum points!

+
+
+
+ + {/* Modal Footer */} +
+
+

+ 🍁 Master these techniques to become a Maple Blocks champion! +

+ +
+
+
+
+ ); +}; + +export default WelcomeScreen; diff --git a/web/mapleblocks-frontend-prototype/src/index.css b/web/mapleblocks-frontend-prototype/src/index.css new file mode 100644 index 0000000..261ef37 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/index.css @@ -0,0 +1,304 @@ +/* Tailwind CSS directives */ +@tailwind base; +@tailwind components; +@tailwind utilities; + +/* Custom CSS for Maple Blocks */ +:root { + font-family: system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +/* Reset body styles to work with Tailwind */ +body { + margin: 0; + padding: 0; + min-width: 320px; + min-height: 100vh; + /* Remove flex and centering to let components handle their own layout */ +} + +/* Game-specific custom styles */ +.maple-blocks-app { + min-height: 100vh; + width: 100%; +} + +/* Custom animations for game effects */ +@keyframes fadeInUp { + from { + opacity: 0; + transform: translateY(20px); + } + to { + opacity: 1; + transform: translateY(0); + } +} + +@keyframes bounce { + 0%, + 20%, + 53%, + 80%, + 100% { + transform: translate3d(0, 0, 0); + } + 40%, + 43% { + transform: translate3d(0, -10px, 0); + } + 70% { + transform: translate3d(0, -5px, 0); + } + 90% { + transform: translate3d(0, -2px, 0); + } +} + +@keyframes pulse { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } + 100% { + transform: scale(1); + } +} + +@keyframes glow { + 0% { + box-shadow: 0 0 5px rgba(239, 68, 68, 0.5); + } + 50% { + box-shadow: 0 0 20px rgba(239, 68, 68, 0.8); + } + 100% { + box-shadow: 0 0 5px rgba(239, 68, 68, 0.5); + } +} + +/* Custom utility classes for game components */ +.game-board-cell { + transition: all 0.15s ease-in-out; +} + +.game-board-cell:hover { + transform: scale(1.02); +} + +.score-card { + transition: all 0.2s ease-in-out; +} + +.score-card:hover { + transform: translateY(-2px); + box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3); +} + +.game-button { + transition: all 0.2s ease-in-out; + position: relative; + overflow: hidden; +} + +.game-button:hover { + transform: translateY(-1px); +} + +.game-button:active { + transform: translateY(0); +} + +.game-button::before { + content: ""; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient( + 90deg, + transparent, + rgba(255, 255, 255, 0.2), + transparent + ); + transition: left 0.5s; +} + +.game-button:hover::before { + left: 100%; +} + +/* Maple Blocks themed scrollbar */ +::-webkit-scrollbar { + width: 8px; +} + +::-webkit-scrollbar-track { + background: #374151; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb { + background: #ef4444; + border-radius: 4px; +} + +::-webkit-scrollbar-thumb:hover { + background: #dc2626; +} + +/* Focus styles for accessibility */ +.focus-visible { + outline: 2px solid #ef4444; + outline-offset: 2px; +} + +/* Game piece preview styles */ +.piece-preview { + image-rendering: pixelated; + image-rendering: -moz-crisp-edges; + image-rendering: crisp-edges; +} + +/* Level progress bar animation */ +.progress-bar { + transition: width 0.3s ease-in-out; +} + +/* Clear animation styles */ +.clear-animation { + animation: fadeInUp 0.3s ease-out; +} + +.line-clear-glow { + animation: glow 0.5s ease-in-out; +} + +/* Game over screen styles */ +.game-over-entrance { + animation: fadeInUp 0.5s ease-out; +} + +/* High score celebration */ +.high-score-celebration { + animation: bounce 1s infinite; +} + +/* Responsive design helpers */ +@media (max-width: 768px) { + .game-container { + padding: 1rem; + } + + .game-stats { + font-size: 0.875rem; + } + + .game-board { + max-width: 100%; + } +} + +@media (max-width: 640px) { + .game-title { + font-size: 2.5rem; + } + + .game-controls { + flex-direction: column; + gap: 0.5rem; + } +} + +/* Print styles (hide game when printing) */ +@media print { + .maple-blocks-app { + display: none; + } +} + +/* Reduce motion for accessibility */ +@media (prefers-reduced-motion: reduce) { + *, + *::before, + *::after { + animation-duration: 0.01ms !important; + animation-iteration-count: 1 !important; + transition-duration: 0.01ms !important; + } +} + +/* Dark mode support (Tailwind handles most, but custom additions) */ +@media (prefers-color-scheme: dark) { + ::-webkit-scrollbar-track { + background: #1f2937; + } +} + +/* Custom color palette for Maple Blocks theme */ +.maple-red { + color: #ef4444; +} + +.maple-red-bg { + background-color: #ef4444; +} + +.maple-gold { + color: #f59e0b; +} + +.maple-gold-bg { + background-color: #f59e0b; +} + +/* Loading spinner for game initialization */ +.loading-spinner { + animation: spin 1s linear infinite; +} + +@keyframes spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +/* Game piece drop shadow effect */ +.piece-shadow { + filter: drop-shadow(2px 2px 4px rgba(0, 0, 0, 0.3)); +} + +/* Success feedback styles */ +.success-feedback { + animation: pulse 0.6s ease-in-out; +} + +/* Error feedback styles */ +.error-feedback { + animation: shake 0.5s ease-in-out; +} + +@keyframes shake { + 0%, + 100% { + transform: translateX(0); + } + 25% { + transform: translateX(-4px); + } + 75% { + transform: translateX(4px); + } +} diff --git a/web/mapleblocks-frontend-prototype/src/main.jsx b/web/mapleblocks-frontend-prototype/src/main.jsx new file mode 100644 index 0000000..b9a1a6d --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/main.jsx @@ -0,0 +1,10 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' +import './index.css' +import App from './App.jsx' + +createRoot(document.getElementById('root')).render( + + + , +) diff --git a/web/mapleblocks-frontend-prototype/src/utils/blocksGame.js b/web/mapleblocks-frontend-prototype/src/utils/blocksGame.js new file mode 100644 index 0000000..112241c --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/utils/blocksGame.js @@ -0,0 +1,471 @@ +// Maple Blocks Game Management System +// Handles game initialization, state management, and game flow + +// Game configuration constants +export const GAME_CONFIG = { + BOARD_WIDTH: 10, + BOARD_HEIGHT: 20, + LINES_PER_LEVEL: 10, + MIN_DROP_SPEED: 100, // Minimum milliseconds between drops + MAX_DIFFICULTY: 10, // Maximum starting difficulty + PREVIEW_PIECES: 1, // Number of next pieces to show + GHOST_PIECE_ENABLED: true, + HOLD_PIECE_ENABLED: false, // Future feature +}; + +// Game state constants +export const GAME_STATES = { + MENU: "menu", + PLAYING: "playing", + PAUSED: "paused", + GAME_OVER: "game_over", + LOADING: "loading", + RESULTS: "results", +}; + +// Difficulty patterns for starting boards +const DIFFICULTY_PATTERNS = { + 0: [], // Clean board + 1: [{ row: 19, pattern: [1, 1, 1, 0, 1, 1, 1, 1, 1, 1] }], + 2: [ + { row: 19, pattern: [1, 1, 1, 0, 1, 1, 1, 1, 1, 1] }, + { row: 18, pattern: [1, 1, 1, 1, 1, 0, 1, 1, 1, 1] }, + ], + 3: [ + { row: 19, pattern: [1, 1, 1, 0, 1, 1, 1, 1, 1, 1] }, + { row: 18, pattern: [1, 1, 1, 1, 1, 0, 1, 1, 1, 1] }, + { row: 17, pattern: [1, 0, 1, 1, 1, 1, 1, 1, 1, 1] }, + ], + // Patterns continue for difficulties 4-10 +}; + +/** + * Create an empty game board + * @param {number} width - Board width (default from config) + * @param {number} height - Board height (default from config) + * @returns {array} 2D array representing empty board + */ +export const createEmptyBoard = ( + width = GAME_CONFIG.BOARD_WIDTH, + height = GAME_CONFIG.BOARD_HEIGHT, +) => { + return Array(height) + .fill() + .map(() => Array(width).fill(0)); +}; + +/** + * Create a starting board with difficulty-based incomplete lines + * @param {number} difficulty - Starting difficulty level (0-10) + * @param {number} width - Board width + * @param {number} height - Board height + * @returns {array} 2D array with pre-filled incomplete lines + */ +export const createStartingBoard = ( + difficulty = 0, + width = GAME_CONFIG.BOARD_WIDTH, + height = GAME_CONFIG.BOARD_HEIGHT, +) => { + const board = createEmptyBoard(width, height); + + if (difficulty <= 0 || difficulty > GAME_CONFIG.MAX_DIFFICULTY) { + return board; + } + + // Use predefined patterns for consistent gameplay + if (difficulty <= 3 && DIFFICULTY_PATTERNS[difficulty]) { + DIFFICULTY_PATTERNS[difficulty].forEach(({ row, pattern }) => { + if (row >= 0 && row < height) { + board[row] = pattern.map((cell) => (cell ? "#666666" : 0)); + } + }); + } else { + // Generate random incomplete lines for higher difficulties + for (let i = 0; i < difficulty; i++) { + const row = height - 1 - i; + if (row >= 0) { + for (let col = 0; col < width; col++) { + // Create incomplete lines with 1-2 gaps + if (Math.random() > 0.15) { + board[row][col] = "#666666"; + } + } + } + } + } + + return board; +}; + +/** + * Initialize a new game state + * @param {object} settings - Game settings from welcome screen + * @returns {object} Initial game state + */ +export const initializeGame = (settings = {}) => { + const { + startingLevel = 0, + gameSpeed = "Normal", + playerName = "Anonymous", + enableSounds = true, + enableAnimations = true, + } = settings; + + const startTime = Date.now(); + + return { + // Core game state + board: createStartingBoard(startingLevel), + currentPiece: null, + nextPiece: null, + heldPiece: null, + ghostPiece: null, + + // Game progress + score: 0, + lines: 0, + level: 0, + difficulty: startingLevel, + + // Game flow + gameState: GAME_STATES.LOADING, + isPaused: false, + gameOver: false, + gameStarted: false, + + // Timing + startTime, + pausedTime: 0, + totalPausedDuration: 0, + lastDropTime: 0, + + // Settings + gameSpeed, + playerName, + enableSounds, + enableAnimations, + + // Statistics + piecesPlaced: 0, + linesCleared: { single: 0, double: 0, triple: 0, quad: 0 }, + consecutiveQuads: 0, + maxConsecutiveQuads: 0, + + // Combo tracking + lastClearWasQuad: false, + comboCount: 0, + maxCombo: 0, + + // Performance tracking + averageDropTime: 0, + fastestDrop: Infinity, + perfectClears: 0, + }; +}; + +/** + * Calculate current game time (excluding paused time) + * @param {object} gameState - Current game state + * @returns {number} Game time in milliseconds + */ +export const getGameTime = (gameState) => { + const now = Date.now(); + const totalTime = now - gameState.startTime; + return totalTime - gameState.totalPausedDuration; +}; + +/** + * Pause the game and track pause time + * @param {object} gameState - Current game state + * @returns {object} Updated game state + */ +export const pauseGame = (gameState) => { + if (gameState.isPaused || gameState.gameOver) { + return gameState; + } + + return { + ...gameState, + isPaused: true, + gameState: GAME_STATES.PAUSED, + pausedTime: Date.now(), + }; +}; + +/** + * Resume the game and update pause tracking + * @param {object} gameState - Current game state + * @returns {object} Updated game state + */ +export const resumeGame = (gameState) => { + if (!gameState.isPaused || gameState.gameOver) { + return gameState; + } + + const pauseDuration = Date.now() - gameState.pausedTime; + + return { + ...gameState, + isPaused: false, + gameState: GAME_STATES.PLAYING, + pausedTime: 0, + totalPausedDuration: gameState.totalPausedDuration + pauseDuration, + }; +}; + +/** + * End the game and calculate final statistics + * @param {object} gameState - Current game state + * @returns {object} Final game state with complete statistics + */ +export const endGame = (gameState) => { + const finalTime = getGameTime(gameState); + const finalLevel = Math.floor(gameState.lines / GAME_CONFIG.LINES_PER_LEVEL); + + // Calculate performance metrics + const linesPerMinute = + finalTime > 0 ? (gameState.lines / finalTime) * 60000 : 0; + const scorePerMinute = + finalTime > 0 ? (gameState.score / finalTime) * 60000 : 0; + const averageLinesPerLevel = + finalLevel > 0 ? gameState.lines / finalLevel : gameState.lines; + + return { + ...gameState, + gameOver: true, + gameState: GAME_STATES.GAME_OVER, + level: finalLevel, + + // Final statistics + finalTime, + linesPerMinute: Math.round(linesPerMinute), + scorePerMinute: Math.round(scorePerMinute), + averageLinesPerLevel: Math.round(averageLinesPerLevel * 10) / 10, + + // Game summary + gameComplete: true, + endTime: Date.now(), + }; +}; + +/** + * Update game statistics after line clear + * @param {object} gameState - Current game state + * @param {number} linesCleared - Number of lines cleared (1-4) + * @returns {object} Updated game state with new statistics + */ +export const updateGameStats = (gameState, linesCleared) => { + if (linesCleared < 1 || linesCleared > 4) { + return gameState; + } + + const newLines = gameState.lines + linesCleared; + const newLevel = Math.floor(newLines / GAME_CONFIG.LINES_PER_LEVEL); + + // Update line clear statistics + const clearTypes = { 1: "single", 2: "double", 3: "triple", 4: "quad" }; + const clearType = clearTypes[linesCleared]; + + const updatedLineClears = { + ...gameState.linesCleared, + [clearType]: gameState.linesCleared[clearType] + 1, + }; + + // Track consecutive quads + const isQuad = linesCleared === 4; + const consecutiveQuads = + isQuad && gameState.lastClearWasQuad + ? gameState.consecutiveQuads + 1 + : isQuad + ? 1 + : 0; + + // Update combo tracking + const comboCount = gameState.comboCount + 1; + const maxCombo = Math.max(gameState.maxCombo, comboCount); + + return { + ...gameState, + lines: newLines, + level: newLevel, + linesCleared: updatedLineClears, + consecutiveQuads, + maxConsecutiveQuads: Math.max( + gameState.maxConsecutiveQuads, + consecutiveQuads, + ), + lastClearWasQuad: isQuad, + comboCount, + maxCombo, + }; +}; + +/** + * Check if the game board is completely empty (perfect clear) + * @param {array} board - Game board + * @returns {boolean} True if board is empty + */ +export const isPerfectClear = (board) => { + return board.every((row) => row.every((cell) => cell === 0)); +}; + +/** + * Get game progress summary + * @param {object} gameState - Current game state + * @returns {object} Progress summary for UI display + */ +export const getGameProgress = (gameState) => { + const currentTime = getGameTime(gameState); + const linesUntilNextLevel = + GAME_CONFIG.LINES_PER_LEVEL - + (gameState.lines % GAME_CONFIG.LINES_PER_LEVEL); + const levelProgress = + (gameState.lines % GAME_CONFIG.LINES_PER_LEVEL) / + GAME_CONFIG.LINES_PER_LEVEL; + + return { + currentLevel: gameState.level, + linesUntilNextLevel, + levelProgress: Math.round(levelProgress * 100), + totalGameTime: currentTime, + gameTimeFormatted: formatGameTime(currentTime), + linesPerMinute: + currentTime > 0 ? Math.round((gameState.lines / currentTime) * 60000) : 0, + scorePerSecond: + currentTime > 0 ? Math.round((gameState.score / currentTime) * 1000) : 0, + }; +}; + +/** + * Format game time into human readable format + * @param {number} milliseconds - Time in milliseconds + * @returns {string} Formatted time string (MM:SS or HH:MM:SS) + */ +export const formatGameTime = (milliseconds) => { + const totalSeconds = Math.floor(milliseconds / 1000); + const hours = Math.floor(totalSeconds / 3600); + const minutes = Math.floor((totalSeconds % 3600) / 60); + const seconds = totalSeconds % 60; + + if (hours > 0) { + return `${hours}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; + } else { + return `${minutes}:${seconds.toString().padStart(2, "0")}`; + } +}; + +/** + * Validate game settings + * @param {object} settings - Game settings to validate + * @returns {object} Validated and corrected settings + */ +export const validateGameSettings = (settings) => { + const validSpeeds = ["Slow", "Normal", "Fast"]; + + return { + startingLevel: Math.max( + 0, + Math.min(GAME_CONFIG.MAX_DIFFICULTY, settings.startingLevel || 0), + ), + gameSpeed: validSpeeds.includes(settings.gameSpeed) + ? settings.gameSpeed + : "Normal", + playerName: (settings.playerName || "Anonymous").substring(0, 20), // Max 20 characters + enableSounds: Boolean(settings.enableSounds !== false), // Default true + enableAnimations: Boolean(settings.enableAnimations !== false), // Default true + }; +}; + +/** + * Create a game save state for persistence + * @param {object} gameState - Current game state + * @returns {object} Serializable save state + */ +export const createSaveState = (gameState) => { + return { + version: "1.0", + timestamp: Date.now(), + gameData: { + score: gameState.score, + lines: gameState.lines, + level: gameState.level, + difficulty: gameState.difficulty, + gameSpeed: gameState.gameSpeed, + playerName: gameState.playerName, + gameTime: getGameTime(gameState), + linesCleared: gameState.linesCleared, + maxCombo: gameState.maxCombo, + maxConsecutiveQuads: gameState.maxConsecutiveQuads, + }, + }; +}; + +/** + * Generate performance report for end of game + * @param {object} gameState - Final game state + * @returns {object} Comprehensive performance report + */ +export const generatePerformanceReport = (gameState) => { + const gameTime = getGameTime(gameState); + const efficiency = + gameState.lines > 0 ? gameState.score / gameState.lines : 0; + const totalLineClearActions = Object.values(gameState.linesCleared).reduce( + (sum, count) => sum + count, + 0, + ); + + return { + // Core metrics + finalScore: gameState.score, + totalLines: gameState.lines, + finalLevel: gameState.level, + gameTime: formatGameTime(gameTime), + + // Performance metrics + linesPerMinute: + gameTime > 0 ? Math.round((gameState.lines / gameTime) * 60000) : 0, + scorePerSecond: + gameTime > 0 ? Math.round((gameState.score / gameTime) * 1000) : 0, + efficiency: Math.round(efficiency), + + // Clear breakdown + clearBreakdown: gameState.linesCleared, + totalClears: totalLineClearActions, + quadPercentage: + totalLineClearActions > 0 + ? Math.round( + (gameState.linesCleared.quad / totalLineClearActions) * 100, + ) + : 0, + + // Achievement tracking + maxCombo: gameState.maxCombo, + maxConsecutiveQuads: gameState.maxConsecutiveQuads, + perfectClears: gameState.perfectClears, + + // Difficulty context + startingDifficulty: gameState.difficulty, + gameSpeed: gameState.gameSpeed, + }; +}; + +// Export game configuration and states +export { DIFFICULTY_PATTERNS }; + +// Default export with all functions +export default { + createEmptyBoard, + createStartingBoard, + initializeGame, + getGameTime, + pauseGame, + resumeGame, + endGame, + updateGameStats, + isPerfectClear, + getGameProgress, + formatGameTime, + validateGameSettings, + createSaveState, + generatePerformanceReport, +}; diff --git a/web/mapleblocks-frontend-prototype/src/utils/blocksLogic.js b/web/mapleblocks-frontend-prototype/src/utils/blocksLogic.js new file mode 100644 index 0000000..01bc2f7 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/utils/blocksLogic.js @@ -0,0 +1,32 @@ +// Game constants +export const BOARD_WIDTH = 10; +export const BOARD_HEIGHT = 20; + +export const PIECES = { + I: { shape: [[1,1,1,1]], color: '#00f5ff' }, + O: { shape: [[1,1],[1,1]], color: '#ffff00' }, + T: { shape: [[0,1,0],[1,1,1]], color: '#a000f0' }, + S: { shape: [[0,1,1],[1,1,0]], color: '#00f000' }, + Z: { shape: [[1,1,0],[0,1,1]], color: '#f00000' }, + J: { shape: [[1,0,0],[1,1,1]], color: '#0000f0' }, + L: { shape: [[0,0,1],[1,1,1]], color: '#f0a000' } +}; + +export const PIECE_TYPES = Object.keys(PIECES); + +// Board operations +export const createEmptyBoard = () => { + return Array(BOARD_HEIGHT).fill().map(() => Array(BOARD_WIDTH).fill(0)); +}; + +export const isValidPosition = (piece, board, x, y) => { + // ... validation logic +}; + +export const placePiece = (piece, board) => { + // ... piece placement logic +}; + +export const clearLines = (board) => { + // ... line clearing logic +}; \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/utils/blocksPieces.js b/web/mapleblocks-frontend-prototype/src/utils/blocksPieces.js new file mode 100644 index 0000000..634b6d6 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/utils/blocksPieces.js @@ -0,0 +1,387 @@ +// Maple Blocks Piece System +// Handles piece definitions, generation, rotation, and movement + +// Piece definitions with Canadian-inspired colors +export const PIECES = { + I: { + shape: [[1,1,1,1]], + color: '#00f5ff', // Cyan - like ice + name: 'Line' + }, + O: { + shape: [[1,1],[1,1]], + color: '#ffff00', // Yellow - like maple syrup + name: 'Square' + }, + T: { + shape: [[0,1,0],[1,1,1]], + color: '#a000f0', // Purple - like wildflowers + name: 'T-Shape' + }, + S: { + shape: [[0,1,1],[1,1,0]], + color: '#00f000', // Green - like pine trees + name: 'S-Shape' + }, + Z: { + shape: [[1,1,0],[0,1,1]], + color: '#f00000', // Red - like maple leaf + name: 'Z-Shape' + }, + J: { + shape: [[1,0,0],[1,1,1]], + color: '#0000f0', // Blue - like lakes + name: 'J-Shape' + }, + L: { + shape: [[0,0,1],[1,1,1]], + color: '#f0a000', // Orange - like autumn leaves + name: 'L-Shape' + } +}; + +// Array of piece types for random generation +export const PIECE_TYPES = Object.keys(PIECES); + +// Starting positions for different piece types (centered on board) +const STARTING_POSITIONS = { + I: { x: 3, y: 0 }, // Line piece needs special positioning + O: { x: 4, y: 0 }, // Square piece + T: { x: 3, y: 0 }, // T-piece + S: { x: 3, y: 0 }, // S-piece + Z: { x: 3, y: 0 }, // Z-piece + J: { x: 3, y: 0 }, // J-piece + L: { x: 3, y: 0 } // L-piece +}; + +// Piece statistics for tracking +let pieceStats = { + I: 0, O: 0, T: 0, S: 0, Z: 0, J: 0, L: 0 +}; + +/** + * Generate a random piece + * @param {number} boardWidth - Width of the game board (default 10) + * @returns {object} New piece object with shape, color, position, and rotation + */ +export const generateRandomPiece = (boardWidth = 10) => { + const type = PIECE_TYPES[Math.floor(Math.random() * PIECE_TYPES.length)]; + const piece = PIECES[type]; + const startingPos = STARTING_POSITIONS[type]; + + // Update statistics + pieceStats[type]++; + + return { + type, + shape: piece.shape.map(row => [...row]), // Deep copy to avoid mutations + color: piece.color, + name: piece.name, + x: startingPos.x, + y: startingPos.y, + rotation: 0, + id: Date.now() + Math.random() // Unique identifier + }; +}; + +/** + * Generate a specific piece type (useful for testing) + * @param {string} type - Piece type (I, O, T, S, Z, J, L) + * @param {number} boardWidth - Width of the game board + * @returns {object} New piece object + */ +export const generateSpecificPiece = (type, boardWidth = 10) => { + if (!PIECES[type]) { + console.warn(`Invalid piece type: ${type}. Using random piece.`); + return generateRandomPiece(boardWidth); + } + + const piece = PIECES[type]; + const startingPos = STARTING_POSITIONS[type]; + + return { + type, + shape: piece.shape.map(row => [...row]), + color: piece.color, + name: piece.name, + x: startingPos.x, + y: startingPos.y, + rotation: 0, + id: Date.now() + Math.random() + }; +}; + +/** + * Rotate a piece clockwise (90 degrees) + * @param {object} piece - The piece to rotate + * @returns {object} New piece object with rotated shape + */ +export const rotatePieceClockwise = (piece) => { + if (!piece || !piece.shape) { + console.warn('Invalid piece for rotation'); + return piece; + } + + // O-piece doesn't need rotation + if (piece.type === 'O') { + return { ...piece }; + } + + const shape = piece.shape; + const rotatedShape = shape[0].map((_, index) => + shape.map(row => row[index]).reverse() + ); + + return { + ...piece, + shape: rotatedShape, + rotation: (piece.rotation + 90) % 360 + }; +}; + +/** + * Rotate a piece counterclockwise (90 degrees) + * @param {object} piece - The piece to rotate + * @returns {object} New piece object with rotated shape + */ +export const rotatePieceCounterclockwise = (piece) => { + if (!piece || !piece.shape) { + console.warn('Invalid piece for rotation'); + return piece; + } + + // O-piece doesn't need rotation + if (piece.type === 'O') { + return { ...piece }; + } + + const shape = piece.shape; + const rotatedShape = shape[0].map((_, index) => + shape.map(row => row[row.length - 1 - index]) + ); + + return { + ...piece, + shape: rotatedShape, + rotation: (piece.rotation - 90 + 360) % 360 + }; +}; + +/** + * Move a piece in a direction + * @param {object} piece - The piece to move + * @param {number} deltaX - Horizontal movement (-1 for left, 1 for right, 0 for no movement) + * @param {number} deltaY - Vertical movement (usually 1 for down) + * @returns {object} New piece object with updated position + */ +export const movePiece = (piece, deltaX, deltaY) => { + if (!piece) { + console.warn('Invalid piece for movement'); + return piece; + } + + return { + ...piece, + x: piece.x + deltaX, + y: piece.y + deltaY + }; +}; + +/** + * Get the bounding box of a piece (useful for collision detection) + * @param {object} piece - The piece to analyze + * @returns {object} Bounding box with minX, maxX, minY, maxY + */ +export const getPieceBounds = (piece) => { + if (!piece || !piece.shape) { + return { minX: 0, maxX: 0, minY: 0, maxY: 0 }; + } + + let minX = piece.shape[0].length; + let maxX = -1; + let minY = piece.shape.length; + let maxY = -1; + + piece.shape.forEach((row, rowIndex) => { + row.forEach((cell, colIndex) => { + if (cell) { + minX = Math.min(minX, colIndex); + maxX = Math.max(maxX, colIndex); + minY = Math.min(minY, rowIndex); + maxY = Math.max(maxY, rowIndex); + } + }); + }); + + return { + minX: piece.x + minX, + maxX: piece.x + maxX, + minY: piece.y + minY, + maxY: piece.y + maxY, + width: maxX - minX + 1, + height: maxY - minY + 1 + }; +}; + +/** + * Get all filled positions of a piece (useful for collision detection) + * @param {object} piece - The piece to analyze + * @returns {array} Array of {x, y} coordinates where the piece has blocks + */ +export const getPiecePositions = (piece) => { + if (!piece || !piece.shape) { + return []; + } + + const positions = []; + + piece.shape.forEach((row, rowIndex) => { + row.forEach((cell, colIndex) => { + if (cell) { + positions.push({ + x: piece.x + colIndex, + y: piece.y + rowIndex + }); + } + }); + }); + + return positions; +}; + +/** + * Create a preview version of a piece (smaller, for next piece display) + * @param {object} piece - The piece to create a preview for + * @param {number} previewSize - Size of the preview grid (default 4x4) + * @returns {object} Preview piece centered in a grid + */ +export const createPiecePreview = (piece, previewSize = 4) => { + if (!piece || !piece.shape) { + return null; + } + + // Create empty preview grid + const previewGrid = Array(previewSize).fill().map(() => Array(previewSize).fill(0)); + + // Calculate centering offset + const offsetX = Math.floor((previewSize - piece.shape[0].length) / 2); + const offsetY = Math.floor((previewSize - piece.shape.length) / 2); + + // Place piece in preview grid + piece.shape.forEach((row, rowIndex) => { + row.forEach((cell, colIndex) => { + if (cell) { + const previewX = offsetX + colIndex; + const previewY = offsetY + rowIndex; + + if (previewX >= 0 && previewX < previewSize && + previewY >= 0 && previewY < previewSize) { + previewGrid[previewY][previewX] = piece.color; + } + } + }); + }); + + return { + grid: previewGrid, + size: previewSize, + piece: piece + }; +}; + +/** + * Get piece statistics + * @returns {object} Statistics for each piece type + */ +export const getPieceStats = () => { + const total = Object.values(pieceStats).reduce((sum, count) => sum + count, 0); + + const stats = {}; + Object.keys(pieceStats).forEach(type => { + stats[type] = { + count: pieceStats[type], + percentage: total > 0 ? Math.round((pieceStats[type] / total) * 100) : 0, + name: PIECES[type].name + }; + }); + + return { + individual: stats, + total, + mostCommon: Object.keys(stats).reduce((a, b) => + stats[a].count > stats[b].count ? a : b + ), + leastCommon: Object.keys(stats).reduce((a, b) => + stats[a].count < stats[b].count ? a : b + ) + }; +}; + +/** + * Reset piece statistics + */ +export const resetPieceStats = () => { + pieceStats = { I: 0, O: 0, T: 0, S: 0, Z: 0, J: 0, L: 0 }; +}; + +/** + * Generate a bag of pieces (ensures more even distribution) + * This prevents long droughts of specific pieces + * @returns {array} Array of 7 pieces (one of each type) in random order + */ +export const generatePieceBag = () => { + const bag = [...PIECE_TYPES]; + + // Fisher-Yates shuffle + for (let i = bag.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [bag[i], bag[j]] = [bag[j], bag[i]]; + } + + return bag.map(type => generateSpecificPiece(type)); +}; + +/** + * Check if a piece can be rotated (basic wall kick) + * @param {object} piece - The piece to check + * @param {number} boardWidth - Width of the board + * @returns {object} Rotation result with success flag and adjusted position + */ +export const canRotatePiece = (piece, boardWidth) => { + const rotated = rotatePieceClockwise(piece); + const bounds = getPieceBounds(rotated); + + let adjustedPiece = { ...rotated }; + + // Wall kick: adjust position if rotation would go out of bounds + if (bounds.minX < 0) { + adjustedPiece.x -= bounds.minX; + } else if (bounds.maxX >= boardWidth) { + adjustedPiece.x -= (bounds.maxX - boardWidth + 1); + } + + return { + canRotate: true, + adjustedPiece, + wallKickUsed: adjustedPiece.x !== rotated.x + }; +}; + +// Export constants and piece definitions +export { pieceStats }; + +// Default export with all functions +export default { + generateRandomPiece, + generateSpecificPiece, + rotatePieceClockwise, + rotatePieceCounterclockwise, + movePiece, + getPieceBounds, + getPiecePositions, + createPiecePreview, + getPieceStats, + resetPieceStats, + generatePieceBag, + canRotatePiece +}; \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/utils/blocksScoring.js b/web/mapleblocks-frontend-prototype/src/utils/blocksScoring.js new file mode 100644 index 0000000..76ec87e --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/utils/blocksScoring.js @@ -0,0 +1,242 @@ +// Maple Blocks Scoring System +// Handles all scoring calculations, speed progression, and level management + +// Standard line clearing score multipliers +const LINE_SCORES = { + 0: 0, // No lines cleared + 1: 40, // Single line + 2: 100, // Double lines + 3: 300, // Triple lines + 4: 1200 // Quad lines (Maple Blocks!) +}; + +// Speed settings for different game modes +const SPEED_SETTINGS = { + 'Slow': { + baseSpeed: 1000, // 1 second per drop + description: 'Relaxed pace for beginners' + }, + 'Normal': { + baseSpeed: 800, // 0.8 seconds per drop + description: 'Standard game speed' + }, + 'Fast': { + baseSpeed: 600, // 0.6 seconds per drop + description: 'Quick pace for experienced players' + } +}; + +// Bonus scoring system +const BONUS_MULTIPLIERS = { + CONSECUTIVE_QUADS: 1.5, // Extra points for back-to-back quad clears + SPEED_BONUS: 1.2, // Bonus for fast drops + LEVEL_PROGRESSION: 1.1 // Small bonus as levels increase +}; + +/** + * Calculate score for cleared lines + * @param {number} linesCleared - Number of lines cleared (0-4) + * @param {number} currentLevel - Current game level (affects multiplier) + * @param {boolean} isConsecutiveQuad - Whether this is a consecutive quad clear + * @returns {number} Score points earned + */ +export const calculateScore = (linesCleared, currentLevel, isConsecutiveQuad = false) => { + if (linesCleared < 0 || linesCleared > 4) { + console.warn('Invalid lines cleared:', linesCleared); + return 0; + } + + let baseScore = LINE_SCORES[linesCleared] || 0; + + // Level multiplier (level + 1 to avoid zero multiplication) + let score = baseScore * (currentLevel + 1); + + // Consecutive quad bonus + if (linesCleared === 4 && isConsecutiveQuad) { + score *= BONUS_MULTIPLIERS.CONSECUTIVE_QUADS; + } + + return Math.floor(score); +}; + +/** + * Calculate drop speed based on game speed setting and current level + * @param {string} gameSpeed - 'Slow', 'Normal', or 'Fast' + * @param {number} currentLevel - Current game level + * @returns {number} Drop interval in milliseconds + */ +export const getDropSpeed = (gameSpeed, currentLevel) => { + const speedSetting = SPEED_SETTINGS[gameSpeed]; + + if (!speedSetting) { + console.warn('Invalid game speed:', gameSpeed, '- using Normal'); + return getDropSpeed('Normal', currentLevel); + } + + const baseSpeed = speedSetting.baseSpeed; + + // Speed increases by 50ms per level, with minimum of 100ms + const speedReduction = currentLevel * 50; + const finalSpeed = Math.max(100, baseSpeed - speedReduction); + + return finalSpeed; +}; + +/** + * Calculate the current level based on total lines cleared + * In Maple Blocks, level increases every 10 lines cleared + * @param {number} totalLines - Total lines cleared in the game + * @returns {number} Current level (starts at 0) + */ +export const calculateLevel = (totalLines) => { + return Math.floor(totalLines / 10); +}; + +/** + * Calculate lines needed to reach the next level + * @param {number} totalLines - Total lines cleared so far + * @returns {number} Lines needed for next level + */ +export const getLinesUntilNextLevel = (totalLines) => { + const remainder = totalLines % 10; + return 10 - remainder; +}; + +/** + * Calculate progress percentage toward next level + * @param {number} totalLines - Total lines cleared so far + * @returns {number} Percentage (0-100) toward next level + */ +export const getLevelProgress = (totalLines) => { + const remainder = totalLines % 10; + return (remainder / 10) * 100; +}; + +/** + * Get score breakdown for display purposes + * @param {number} linesCleared - Number of lines cleared + * @param {number} currentLevel - Current game level + * @param {boolean} isConsecutiveQuad - Whether this is a consecutive quad + * @returns {object} Detailed score breakdown + */ +export const getScoreBreakdown = (linesCleared, currentLevel, isConsecutiveQuad = false) => { + const baseScore = LINE_SCORES[linesCleared] || 0; + const levelMultiplier = currentLevel + 1; + const scoreAfterLevel = baseScore * levelMultiplier; + + let bonusMultiplier = 1; + const bonuses = []; + + if (linesCleared === 4 && isConsecutiveQuad) { + bonusMultiplier *= BONUS_MULTIPLIERS.CONSECUTIVE_QUADS; + bonuses.push('Consecutive Quad Bonus!'); + } + + const finalScore = Math.floor(scoreAfterLevel * bonusMultiplier); + + return { + linesCleared, + baseScore, + levelMultiplier, + scoreAfterLevel, + bonusMultiplier, + bonuses, + finalScore, + clearType: getClearTypeName(linesCleared) + }; +}; + +/** + * Get the name for different types of line clears + * @param {number} linesCleared - Number of lines cleared + * @returns {string} Name of the clear type + */ +export const getClearTypeName = (linesCleared) => { + const clearTypes = { + 0: 'No Clear', + 1: 'Single', + 2: 'Double', + 3: 'Triple', + 4: 'Maple Blocks!' // Special name for our game! + }; + + return clearTypes[linesCleared] || 'Unknown'; +}; + +/** + * Calculate estimated time to complete current level + * @param {number} totalLines - Total lines cleared so far + * @param {number} averageLinesPerMinute - Player's average clearing rate + * @returns {number} Estimated seconds to next level + */ +export const getEstimatedTimeToNextLevel = (totalLines, averageLinesPerMinute) => { + const linesNeeded = getLinesUntilNextLevel(totalLines); + const minutesNeeded = linesNeeded / averageLinesPerMinute; + return Math.ceil(minutesNeeded * 60); // Convert to seconds +}; + +/** + * Get speed description for UI display + * @param {string} gameSpeed - Game speed setting + * @returns {string} Human-readable description + */ +export const getSpeedDescription = (gameSpeed) => { + const speedSetting = SPEED_SETTINGS[gameSpeed]; + return speedSetting ? speedSetting.description : 'Unknown speed setting'; +}; + +/** + * Calculate performance rating based on score and time + * @param {number} score - Final game score + * @param {number} timeInSeconds - Total game time + * @param {number} totalLines - Total lines cleared + * @returns {object} Performance rating and stats + */ +export const calculatePerformanceRating = (score, timeInSeconds, totalLines) => { + const scorePerSecond = timeInSeconds > 0 ? score / timeInSeconds : 0; + const linesPerMinute = timeInSeconds > 0 ? (totalLines / timeInSeconds) * 60 : 0; + + let rating = 'Beginner'; + let stars = 1; + + if (scorePerSecond > 100) { + rating = 'Advanced'; + stars = 4; + } else if (scorePerSecond > 50) { + rating = 'Intermediate'; + stars = 3; + } else if (scorePerSecond > 20) { + rating = 'Improving'; + stars = 2; + } + + if (linesPerMinute > 60) { + rating = 'Master'; + stars = 5; + } + + return { + rating, + stars, + scorePerSecond: Math.round(scorePerSecond), + linesPerMinute: Math.round(linesPerMinute), + efficiency: Math.round((score / Math.max(1, totalLines)) * 10) / 10 + }; +}; + +// Export constants for use in other files +export { LINE_SCORES, SPEED_SETTINGS, BONUS_MULTIPLIERS }; + +// Default export with all functions +export default { + calculateScore, + getDropSpeed, + calculateLevel, + getLinesUntilNextLevel, + getLevelProgress, + getScoreBreakdown, + getClearTypeName, + getEstimatedTimeToNextLevel, + getSpeedDescription, + calculatePerformanceRating +}; \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/utils/gameinfo.js b/web/mapleblocks-frontend-prototype/src/utils/gameinfo.js new file mode 100644 index 0000000..a5ff6f6 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/utils/gameinfo.js @@ -0,0 +1,255 @@ +// Maple Blocks Game Information and Instructions +// Centralized place for all game instructions, tips, and information + +// Game controls and instructions +export const GAME_CONTROLS = { + movement: [ + { key: '←→', description: 'Move piece left/right', icon: '🔄' }, + { key: '↓', description: 'Drop piece faster', icon: '⚡' }, + { key: 'Space', description: 'Rotate piece clockwise', icon: '🔄' }, + { key: 'P', description: 'Pause/Resume game', icon: '⏸️' } + ], + gameplay: [ + { action: 'Clear Lines', description: 'Fill complete horizontal lines to clear them', icon: '🎯' }, + { action: 'Level Up', description: 'Clear 10 lines to advance to next level', icon: '📈' }, + { action: 'Speed Increase', description: 'Game gets faster with each level', icon: '🚀' }, + { action: 'Game Over', description: 'When pieces reach the top of the board', icon: '💀' } + ] +}; + +// Scoring system information +export const SCORING_INFO = { + lineClears: [ + { lines: 1, name: 'Single', points: '40 × Level', icon: '1️⃣' }, + { lines: 2, name: 'Double', points: '100 × Level', icon: '2️⃣' }, + { lines: 3, name: 'Triple', points: '300 × Level', icon: '3️⃣' }, + { lines: 4, name: 'Maple Blocks!', points: '1200 × Level', icon: '🍁' } + ], + bonuses: [ + { type: 'Level Multiplier', description: 'All scores multiply by (Level + 1)', icon: '✖️' }, + { type: 'Speed Bonus', description: 'Faster drops can earn bonus points', icon: '⚡' }, + { type: 'Perfect Clear', description: 'Extra points for clearing entire board', icon: '✨' } + ] +}; + +// Game tips and strategies +export const GAME_TIPS = [ + { + title: 'Plan Ahead', + description: 'Look at the next piece preview to plan your moves', + icon: '🔮', + difficulty: 'Beginner' + }, + { + title: 'Build Flat', + description: 'Try to keep your stack relatively flat to avoid getting trapped', + icon: '📏', + difficulty: 'Beginner' + }, + { + title: 'Save the Wells', + description: 'Keep a 1-wide column open for I-pieces (line pieces)', + icon: '🕳️', + difficulty: 'Intermediate' + }, + { + title: 'Go for Quads', + description: 'Line up 4 rows for "Maple Blocks!" - the highest scoring move', + icon: '🍁', + difficulty: 'Intermediate' + }, + { + title: 'Speed Control', + description: 'Use soft drops (↓) to maintain control while scoring speed bonuses', + icon: '🎯', + difficulty: 'Advanced' + }, + { + title: 'Emergency Tactics', + description: 'When stack gets high, focus on survival over high scores', + icon: '🚨', + difficulty: 'Advanced' + } +]; + +// Level progression information +export const LEVEL_INFO = { + progression: 'Every 10 lines cleared advances you one level', + effects: [ + 'Pieces drop faster each level', + 'Score multiplier increases', + 'Game becomes more challenging', + 'Higher levels = higher potential scores' + ], + maxLevel: 'No maximum level - see how high you can go!', + startingDifficulty: 'Choose 0-10 incomplete lines to start with for extra challenge' +}; + +// Piece information +export const PIECE_INFO = { + types: [ + { name: 'I-Piece (Line)', shape: '████', color: '#00f5ff', description: 'Perfect for clearing multiple lines' }, + { name: 'O-Piece (Square)', shape: '██\n██', color: '#ffff00', description: 'Stable base piece' }, + { name: 'T-Piece', shape: ' █ \n███', color: '#a000f0', description: 'Versatile for tight spaces' }, + { name: 'S-Piece', shape: ' ██\n██ ', color: '#00f000', description: 'Great for creating steps' }, + { name: 'Z-Piece', shape: '██ \n ██', color: '#f00000', description: 'Mirror of S-piece' }, + { name: 'J-Piece', shape: '█ \n███', color: '#0000f0', description: 'Good for corners' }, + { name: 'L-Piece', shape: ' █\n███', color: '#f0a000', description: 'Mirror of J-piece' } + ], + strategy: 'Each piece has unique strengths - learn to use them effectively!' +}; + +// Game modes and difficulty +export const DIFFICULTY_INFO = { + speeds: [ + { name: 'Slow', description: 'Relaxed pace, perfect for learning', icon: '🐌' }, + { name: 'Normal', description: 'Classic Maple Blocks experience', icon: '🚀' }, + { name: 'Fast', description: 'High-speed challenge for experts', icon: '⚡' } + ], + startingLevels: { + description: 'Choose how many incomplete lines to start with', + levels: [ + { level: 0, description: 'Clean board - classic start' }, + { level: '1-3', description: 'Light challenge with some obstacles' }, + { level: '4-6', description: 'Moderate challenge' }, + { level: '7-10', description: 'Expert mode - very challenging start' } + ] + } +}; + +// Achievement information +export const ACHIEVEMENTS = [ + { name: 'First Steps', description: 'Clear your first line', icon: '👶' }, + { name: 'Getting Started', description: 'Reach level 1', icon: '🌱' }, + { name: 'Maple Rookie', description: 'Score 1,000 points', icon: '🥉' }, + { name: 'Line Master', description: 'Clear 50 lines in one game', icon: '🎯' }, + { name: 'Speed Demon', description: 'Reach level 10', icon: '🔥' }, + { name: 'Quad Master', description: 'Clear 5 "Maple Blocks!" in one game', icon: '🍁' }, + { name: 'Perfect Storm', description: 'Achieve a perfect clear', icon: '✨' }, + { name: 'Maple Legend', description: 'Score 100,000 points', icon: '👑' } +]; + +// Functions to get formatted instruction data + +/** + * Get basic game instructions for display + * @returns {object} Formatted basic instructions + */ +export const getBasicInstructions = () => { + return { + title: 'How to Play Maple Blocks', + sections: [ + { + title: 'Controls', + items: GAME_CONTROLS.movement + }, + { + title: 'Objective', + items: GAME_CONTROLS.gameplay + }, + { + title: 'Scoring', + items: SCORING_INFO.lineClears.map(clear => ({ + key: `${clear.lines} Line${clear.lines > 1 ? 's' : ''}`, + description: `${clear.name} - ${clear.points} points`, + icon: clear.icon + })) + } + ] + }; +}; + +/** + * Get detailed game guide + * @returns {object} Complete game guide + */ +export const getDetailedGuide = () => { + return { + title: 'Complete Maple Blocks Guide', + sections: [ + { + title: 'Game Controls', + content: GAME_CONTROLS + }, + { + title: 'Scoring System', + content: SCORING_INFO + }, + { + title: 'Tips & Strategies', + content: GAME_TIPS + }, + { + title: 'Level Progression', + content: LEVEL_INFO + }, + { + title: 'Piece Guide', + content: PIECE_INFO + }, + { + title: 'Difficulty Settings', + content: DIFFICULTY_INFO + } + ] + }; +}; + +/** + * Get tips by difficulty level + * @param {string} difficulty - 'Beginner', 'Intermediate', or 'Advanced' + * @returns {array} Filtered tips for the difficulty level + */ +export const getTipsByDifficulty = (difficulty) => { + return GAME_TIPS.filter(tip => tip.difficulty === difficulty); +}; + +/** + * Get quick reference card for in-game display + * @returns {object} Quick reference information + */ +export const getQuickReference = () => { + return { + controls: GAME_CONTROLS.movement.slice(0, 4), // Top 4 controls + scoring: SCORING_INFO.lineClears, + tips: GAME_TIPS.filter(tip => tip.difficulty === 'Beginner').slice(0, 2) + }; +}; + +/** + * Get random tip for display + * @returns {object} Random tip object + */ +export const getRandomTip = () => { + const randomIndex = Math.floor(Math.random() * GAME_TIPS.length); + return GAME_TIPS[randomIndex]; +}; + +/** + * Format instructions for modal display + * @param {string} type - 'basic' or 'detailed' + * @returns {object} Formatted instructions for modal + */ +export const getInstructionsForModal = (type = 'basic') => { + if (type === 'detailed') { + return getDetailedGuide(); + } + return getBasicInstructions(); +}; + +// Export everything as default object as well +export default { + GAME_CONTROLS, + SCORING_INFO, + GAME_TIPS, + LEVEL_INFO, + PIECE_INFO, + DIFFICULTY_INFO, + ACHIEVEMENTS, + getBasicInstructions, + getDetailedGuide, + getTipsByDifficulty, + getQuickReference, + getRandomTip, + getInstructionsForModal +}; \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/utils/mobile.jsx b/web/mapleblocks-frontend-prototype/src/utils/mobile.jsx new file mode 100644 index 0000000..f69f0a3 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/utils/mobile.jsx @@ -0,0 +1,334 @@ +// Mobile Interface Utilities for Maple Blocks +// Handles responsive design, hamburger menu, and mobile-specific components + +import React from 'react'; + +/** + * Detect if the current device is mobile based on screen width + * @returns {boolean} True if mobile device + */ +export const isMobileDevice = () => { + if (typeof window !== 'undefined') { + return window.innerWidth < 768; // Tailwind's md breakpoint + } + return false; +}; + +/** + * Mobile Stats Modal Component + * Shows all game information in a mobile-friendly modal + */ +export const MobileStatsModal = ({ + isOpen, + onClose, + gameState, + onShowInstructions, + getCurrentGameTime, + getLevelProgress +}) => { + if (!isOpen) return null; + + return ( +
+
+ + {/* Modal Header */} +
+

+ 📊 + Game Info +

+ +
+ + {/* Game Stats */} +
+

Current Game

+ +
+

Score

+

{gameState.score.toLocaleString()}

+
+ +
+
+

Lines

+

{gameState.lines}

+
+ +
+

Level

+

{gameState.level}

+
+
+ +
+
+

Difficulty

+

{gameState.difficulty}

+
+ +
+

Time

+

{getCurrentGameTime()}

+
+
+
+ + {/* Clear Stats */} +
+

+ 🎯 + Clear Stats +

+
+
+ Singles: + {gameState.linesCleared.single} +
+
+ Doubles: + {gameState.linesCleared.double} +
+
+ Triples: + {gameState.linesCleared.triple} +
+
+ Maple Blocks: + {gameState.linesCleared.quad} +
+
+
+ + {/* Progress */} +
+

🎯 Progress

+
+

Next level: {10 - (gameState.lines % 10)} lines

+
+
+
+

+ Speed: {gameState.gameSpeed} +

+
+
+ + {/* Instructions Link */} +
+ +
+
+
+ ); +}; + +/** + * Hamburger Menu Icon Component + */ +export const HamburgerIcon = ({ isOpen, onClick, className = "" }) => { + return ( + + ); +}; + +/** + * Mobile Game Header Component + * Shows hamburger menu and basic game info + */ +export const MobileGameHeader = ({ + onMenuClick, + gameState, + isMenuOpen, + getCurrentGameTime +}) => { + return ( +
+ {/* Left side - Hamburger */} + + + {/* Center - Quick Stats */} +
+
+

Score

+

{gameState.score.toLocaleString()}

+
+
+

Lines

+

{gameState.lines}

+
+
+

Level

+

{gameState.level}

+
+
+ + {/* Right side - Time */} +
+

Time

+

{getCurrentGameTime()}

+
+
+ ); +}; + +/** + * Mobile Next Piece Component + * Compact version for mobile layout + */ +export const MobileNextPiece = ({ nextPiece }) => { + if (!nextPiece) return null; + + return ( +
+
+

+ 🔮Next: +

+
+
+ {nextPiece.shape.map((row, rowIndex) => + row.map((cell, colIndex) => ( +
+ )) + )} +
+
+
+
+ ); +}; + +/** + * Mobile Layout Wrapper Component + * Handles the overall mobile layout structure + */ +export const MobileLayout = ({ + gameState, + showMobileMenu, + onMenuToggle, + onShowInstructions, + getCurrentGameTime, + getLevelProgress, + nextPiece, + children // Game board and controls +}) => { + return ( +
+
+ + {/* Mobile Header */} + + + {/* Next Piece */} +
+ +
+ + {/* Game Board and Controls */} + {children} + + {/* Mobile Stats Modal */} + +
+
+ ); +}; + +/** + * Hook to detect mobile screen size + */ +export const useMobileDetection = () => { + const [isMobile, setIsMobile] = React.useState(false); + + React.useEffect(() => { + const checkMobile = () => { + setIsMobile(window.innerWidth < 768); + }; + + checkMobile(); + window.addEventListener('resize', checkMobile); + + return () => window.removeEventListener('resize', checkMobile); + }, []); + + return isMobile; +}; + +// Export all components and utilities +export default { + isMobileDevice, + MobileStatsModal, + HamburgerIcon, + MobileGameHeader, + MobileNextPiece, + MobileLayout, + useMobileDetection +}; \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/src/utils/storage.js b/web/mapleblocks-frontend-prototype/src/utils/storage.js new file mode 100644 index 0000000..723a1e1 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/src/utils/storage.js @@ -0,0 +1,261 @@ +// Storage keys +const STORAGE_KEYS = { + HIGH_SCORES: 'mapleBlocks_highScores', + SETTINGS: 'mapleBlocks_settings', + USER_PREFERENCES: 'mapleBlocks_userPreferences' +}; + +// Default values +const DEFAULT_SETTINGS = { + startingLevel: 0, + gameSpeed: 'Normal' +}; + +const DEFAULT_HIGH_SCORES = []; + +// Helper function to safely parse JSON +const safeJSONParse = (jsonString, defaultValue) => { + try { + return JSON.parse(jsonString); + } catch (error) { + console.warn('Failed to parse JSON from localStorage:', error); + return defaultValue; + } +}; + +// Helper function to safely stringify JSON +const safeJSONStringify = (data) => { + try { + return JSON.stringify(data); + } catch (error) { + console.error('Failed to stringify data for localStorage:', error); + return null; + } +}; + +// High Scores Management +export const highScoresStorage = { + // Get all high scores + getHighScores: () => { + const scores = localStorage.getItem(STORAGE_KEYS.HIGH_SCORES); + return safeJSONParse(scores, DEFAULT_HIGH_SCORES); + }, + + // Add a new high score + addHighScore: (score, level, gameSpeed, playerName = 'Anonymous') => { + const scores = highScoresStorage.getHighScores(); + + const newScore = { + score: parseInt(score), + level: parseInt(level), + gameSpeed, + playerName, + date: new Date().toISOString(), + timestamp: Date.now() + }; + + scores.push(newScore); + + // Sort by score (highest first) and keep only top 50 + scores.sort((a, b) => b.score - a.score); + const topScores = scores.slice(0, 50); + + const jsonString = safeJSONStringify(topScores); + if (jsonString) { + localStorage.setItem(STORAGE_KEYS.HIGH_SCORES, jsonString); + } + + return topScores; + }, + + // Get top N scores + getTopScores: (limit = 10) => { + const scores = highScoresStorage.getHighScores(); + return scores.slice(0, limit); + }, + + // Check if score qualifies for high score list + isHighScore: (score) => { + const scores = highScoresStorage.getHighScores(); + if (scores.length < 50) return true; + return score > scores[scores.length - 1].score; + }, + + // Get personal best + getPersonalBest: () => { + const scores = highScoresStorage.getHighScores(); + return scores.length > 0 ? scores[0].score : 0; + }, + + // Clear all high scores + clearHighScores: () => { + localStorage.removeItem(STORAGE_KEYS.HIGH_SCORES); + }, + + // Get scores by level + getScoresByLevel: (level) => { + const scores = highScoresStorage.getHighScores(); + return scores.filter(score => score.level === parseInt(level)); + }, + + // Get scores by speed + getScoresBySpeed: (gameSpeed) => { + const scores = highScoresStorage.getHighScores(); + return scores.filter(score => score.gameSpeed === gameSpeed); + } +}; + +// Game Settings Management +export const settingsStorage = { + // Get user settings + getSettings: () => { + const settings = localStorage.getItem(STORAGE_KEYS.SETTINGS); + return { ...DEFAULT_SETTINGS, ...safeJSONParse(settings, {}) }; + }, + + // Save user settings + saveSettings: (settings) => { + const currentSettings = settingsStorage.getSettings(); + const updatedSettings = { ...currentSettings, ...settings }; + + const jsonString = safeJSONStringify(updatedSettings); + if (jsonString) { + localStorage.setItem(STORAGE_KEYS.SETTINGS, jsonString); + } + + return updatedSettings; + }, + + // Get starting level + getStartingLevel: () => { + const settings = settingsStorage.getSettings(); + return settings.startingLevel; + }, + + // Save starting level + saveStartingLevel: (level) => { + return settingsStorage.saveSettings({ startingLevel: parseInt(level) }); + }, + + // Get game speed + getGameSpeed: () => { + const settings = settingsStorage.getSettings(); + return settings.gameSpeed; + }, + + // Save game speed + saveGameSpeed: (speed) => { + return settingsStorage.saveSettings({ gameSpeed: speed }); + }, + + // Reset settings to defaults + resetSettings: () => { + localStorage.removeItem(STORAGE_KEYS.SETTINGS); + return DEFAULT_SETTINGS; + } +}; + +// User Preferences Management (for additional features) +export const preferencesStorage = { + // Get user preferences + getPreferences: () => { + const prefs = localStorage.getItem(STORAGE_KEYS.USER_PREFERENCES); + return safeJSONParse(prefs, {}); + }, + + // Save user preferences + savePreferences: (preferences) => { + const currentPrefs = preferencesStorage.getPreferences(); + const updatedPrefs = { ...currentPrefs, ...preferences }; + + const jsonString = safeJSONStringify(updatedPrefs); + if (jsonString) { + localStorage.setItem(STORAGE_KEYS.USER_PREFERENCES, jsonString); + } + + return updatedPrefs; + }, + + // Clear preferences + clearPreferences: () => { + localStorage.removeItem(STORAGE_KEYS.USER_PREFERENCES); + } +}; + +// Utility functions +export const storageUtils = { + // Check if localStorage is available + isLocalStorageAvailable: () => { + try { + const test = '__localStorage_test__'; + localStorage.setItem(test, test); + localStorage.removeItem(test); + return true; + } catch (e) { + return false; + } + }, + + // Get storage usage info + getStorageInfo: () => { + if (!storageUtils.isLocalStorageAvailable()) { + return { available: false }; + } + + const highScores = localStorage.getItem(STORAGE_KEYS.HIGH_SCORES) || ''; + const settings = localStorage.getItem(STORAGE_KEYS.SETTINGS) || ''; + const preferences = localStorage.getItem(STORAGE_KEYS.USER_PREFERENCES) || ''; + + return { + available: true, + totalSize: highScores.length + settings.length + preferences.length, + highScoresSize: highScores.length, + settingsSize: settings.length, + preferencesSize: preferences.length + }; + }, + + // Clear all game data + clearAllData: () => { + Object.values(STORAGE_KEYS).forEach(key => { + localStorage.removeItem(key); + }); + }, + + // Export all data + exportData: () => { + return { + highScores: highScoresStorage.getHighScores(), + settings: settingsStorage.getSettings(), + preferences: preferencesStorage.getPreferences(), + exportDate: new Date().toISOString() + }; + }, + + // Import data + importData: (data) => { + try { + if (data.highScores) { + localStorage.setItem(STORAGE_KEYS.HIGH_SCORES, JSON.stringify(data.highScores)); + } + if (data.settings) { + localStorage.setItem(STORAGE_KEYS.SETTINGS, JSON.stringify(data.settings)); + } + if (data.preferences) { + localStorage.setItem(STORAGE_KEYS.USER_PREFERENCES, JSON.stringify(data.preferences)); + } + return true; + } catch (error) { + console.error('Failed to import data:', error); + return false; + } + } +}; + +// Default export with all storage functions +export default { + highScores: highScoresStorage, + settings: settingsStorage, + preferences: preferencesStorage, + utils: storageUtils +}; \ No newline at end of file diff --git a/web/mapleblocks-frontend-prototype/tailwind.config.js b/web/mapleblocks-frontend-prototype/tailwind.config.js new file mode 100644 index 0000000..8823cc1 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/tailwind.config.js @@ -0,0 +1,83 @@ +/** @type {import('tailwindcss').Config} */ +export default { + content: ["./index.html", "./src/**/*.{js,ts,jsx,tsx}"], + theme: { + extend: { + // Custom colors for Maple Blocks theme + colors: { + "maple-red": { + 50: "#fef2f2", + 100: "#fee2e2", + 200: "#fecaca", + 300: "#fca5a5", + 400: "#f87171", + 500: "#ef4444", + 600: "#dc2626", + 700: "#b91c1c", + 800: "#991b1b", + 900: "#7f1d1d", + }, + "maple-gold": { + 50: "#fffbeb", + 100: "#fef3c7", + 200: "#fde68a", + 300: "#fcd34d", + 400: "#fbbf24", + 500: "#f59e0b", + 600: "#d97706", + 700: "#b45309", + 800: "#92400e", + 900: "#78350f", + }, + }, + // Custom animations for game effects + animation: { + "bounce-slow": "bounce 2s infinite", + "pulse-fast": "pulse 1s infinite", + "spin-slow": "spin 2s linear infinite", + "fade-in": "fadeIn 0.5s ease-in-out", + "slide-up": "slideUp 0.3s ease-out", + glow: "glow 2s ease-in-out infinite", + }, + keyframes: { + fadeIn: { + "0%": { opacity: "0" }, + "100%": { opacity: "1" }, + }, + slideUp: { + "0%": { transform: "translateY(20px)", opacity: "0" }, + "100%": { transform: "translateY(0)", opacity: "1" }, + }, + glow: { + "0%, 100%": { boxShadow: "0 0 5px rgba(239, 68, 68, 0.5)" }, + "50%": { boxShadow: "0 0 20px rgba(239, 68, 68, 0.8)" }, + }, + }, + // Custom spacing for game layout + spacing: { + 18: "4.5rem", + 88: "22rem", + 128: "32rem", + }, + // Custom font sizes for game text + fontSize: { + "2xs": "0.625rem", + "6xl": "3.75rem", + "7xl": "4.5rem", + "8xl": "6rem", + "9xl": "8rem", + }, + // Custom shadows for game elements + boxShadow: { + game: "0 10px 25px rgba(0, 0, 0, 0.3)", + "game-hover": "0 15px 35px rgba(0, 0, 0, 0.4)", + maple: "0 0 20px rgba(239, 68, 68, 0.3)", + }, + // Custom backdrop blur + backdropBlur: { + xs: "2px", + }, + }, + }, + plugins: [], +}; diff --git a/web/mapleblocks-frontend-prototype/vite.config.js b/web/mapleblocks-frontend-prototype/vite.config.js new file mode 100644 index 0000000..625d111 --- /dev/null +++ b/web/mapleblocks-frontend-prototype/vite.config.js @@ -0,0 +1,9 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [react()], + css: { + postcss: "./postcss.config.js", + }, +}); diff --git a/web/mapleqr-frontend-prototype/index.html b/web/mapleqr-frontend-prototype/index.html new file mode 100644 index 0000000..189fd36 --- /dev/null +++ b/web/mapleqr-frontend-prototype/index.html @@ -0,0 +1,13 @@ + + + + + + + Maple QR + + +
+ + + diff --git a/web/mapleqr-frontend-prototype/package-lock.json b/web/mapleqr-frontend-prototype/package-lock.json new file mode 100644 index 0000000..7261014 --- /dev/null +++ b/web/mapleqr-frontend-prototype/package-lock.json @@ -0,0 +1,2912 @@ +{ + "name": "maple-qr-wizard", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "maple-qr-wizard", + "version": "1.0.0", + "dependencies": { + "@heroicons/react": "^2.2.0", + "qrcode": "^1.5.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.21.1" + }, + "devDependencies": { + "autoprefixer": "^10.4.15", + "postcss": "^8.4.24", + "tailwindcss": "^3.4.3", + "vite": "^5.2.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/@heroicons/react": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@heroicons/react/-/react-2.2.0.tgz", + "integrity": "sha512-LMcepvRaS9LYHJGsF0zzmgKCUim/X3N/DQKc4jepAXJ7l8QxJ1PmxJzqplF2Z3FE4PqBAIGyJAQ/w4B5dsqbtQ==", + "license": "MIT", + "peerDependencies": { + "react": ">= 16 || ^19.0.0-rc" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@remix-run/router": { + "version": "1.23.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.23.0.tgz", + "integrity": "sha512-O3rHJzAQKamUz1fvE0Qaw0xSFqsA/yafi2iqeE0pvdFtCO1viYx8QL6f3Ln/aCCTLxs68SLf0KPM9eSeM8yBnA==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", + "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", + "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", + "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", + "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", + "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", + "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", + "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", + "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", + "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", + "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", + "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", + "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", + "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", + "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", + "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", + "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", + "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", + "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", + "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", + "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", + "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true, + "license": "MIT" + }, + "node_modules/autoprefixer": { + "version": "10.4.21", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz", + "integrity": "sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.24.4", + "caniuse-lite": "^1.0.30001702", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.1.1", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.24.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", + "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", + "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": { + "caniuse-lite": "^1.0.30001716", + "electron-to-chromium": "^1.5.149", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001718", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", + "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/cliui/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/dijkstrajs": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dijkstrajs/-/dijkstrajs-1.0.3.tgz", + "integrity": "sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==", + "license": "MIT" + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true, + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.5.155", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", + "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", + "dev": true, + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, + "node_modules/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/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.7", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", + "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", + "dev": true, + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "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/lilconfig": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", + "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "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.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pngjs": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-5.0.0.tgz", + "integrity": "sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/postcss": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "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.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.2.0.tgz", + "integrity": "sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.1.1" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/qrcode": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/qrcode/-/qrcode-1.5.4.tgz", + "integrity": "sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==", + "license": "MIT", + "dependencies": { + "dijkstrajs": "^1.0.1", + "pngjs": "^5.0.0", + "yargs": "^15.3.1" + }, + "bin": { + "qrcode": "bin/qrcode" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/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-router": { + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.30.0.tgz", + "integrity": "sha512-D3X8FyH9nBcTSHGdEKurK7r8OYE1kKFn3d/CF+CoxbSHkxU7o37+Uh7eAHRXr6k2tSExXYO++07PeXJtA/dEhQ==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.30.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.30.0.tgz", + "integrity": "sha512-x30B78HV5tFk8ex0ITwzC9TTZMua4jGyA9IUlH1JLQYQTFyxr/ZxwOJq7evg1JX1qGVUcvhsmQSKdPncQrjTgA==", + "license": "MIT", + "dependencies": { + "@remix-run/router": "1.23.0", + "react-router": "6.30.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.40.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", + "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.7" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.40.2", + "@rollup/rollup-android-arm64": "4.40.2", + "@rollup/rollup-darwin-arm64": "4.40.2", + "@rollup/rollup-darwin-x64": "4.40.2", + "@rollup/rollup-freebsd-arm64": "4.40.2", + "@rollup/rollup-freebsd-x64": "4.40.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", + "@rollup/rollup-linux-arm-musleabihf": "4.40.2", + "@rollup/rollup-linux-arm64-gnu": "4.40.2", + "@rollup/rollup-linux-arm64-musl": "4.40.2", + "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-gnu": "4.40.2", + "@rollup/rollup-linux-riscv64-musl": "4.40.2", + "@rollup/rollup-linux-s390x-gnu": "4.40.2", + "@rollup/rollup-linux-x64-gnu": "4.40.2", + "@rollup/rollup-linux-x64-musl": "4.40.2", + "@rollup/rollup-win32-arm64-msvc": "4.40.2", + "@rollup/rollup-win32-ia32-msvc": "4.40.2", + "@rollup/rollup-win32-x64-msvc": "4.40.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.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/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/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/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.17.tgz", + "integrity": "sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==", + "dev": true, + "license": "MIT", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.6.0", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.2", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.6", + "lilconfig": "^3.1.3", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.4.47", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.2", + "postcss-nested": "^6.2.0", + "postcss-selector-parser": "^6.1.2", + "resolve": "^1.22.8", + "sucrase": "^3.35.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "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/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "5.4.19", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.19.tgz", + "integrity": "sha512-qO3aKv3HoQC8QKiNSTuUM1l9o/XX3+c+VTgLHbJWHZGeTPVAg2XwazI9UWzoxjIJCGCV2zU60uqMzjeLZuULqA==", + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "license": "ISC" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", + "integrity": "sha512-4lLa/EcQCB0cJkyts+FpIRx5G/llPxfP6VQU5KByHEhLxY3IJCH0f0Hy1MHI8sClTvsIb8qwRJ6R/ZdlDJ/leQ==", + "dev": true, + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yargs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "license": "MIT" + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + } + } +} diff --git a/web/mapleqr-frontend-prototype/package.json b/web/mapleqr-frontend-prototype/package.json new file mode 100644 index 0000000..ae479ce --- /dev/null +++ b/web/mapleqr-frontend-prototype/package.json @@ -0,0 +1,23 @@ +{ + "name": "maple-qr-wizard", + "version": "1.0.0", + "description": "A simple QR code generation wizard using React, Tailwind, and Vite", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@heroicons/react": "^2.2.0", + "qrcode": "^1.5.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-router-dom": "^6.21.1" + }, + "devDependencies": { + "autoprefixer": "^10.4.15", + "postcss": "^8.4.24", + "tailwindcss": "^3.4.3", + "vite": "^5.2.0" + } +} diff --git a/web/mapleqr-frontend-prototype/postcss.config.js b/web/mapleqr-frontend-prototype/postcss.config.js new file mode 100644 index 0000000..85f717c --- /dev/null +++ b/web/mapleqr-frontend-prototype/postcss.config.js @@ -0,0 +1,6 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +} diff --git a/web/mapleqr-frontend-prototype/src/App.jsx b/web/mapleqr-frontend-prototype/src/App.jsx new file mode 100644 index 0000000..a41477e --- /dev/null +++ b/web/mapleqr-frontend-prototype/src/App.jsx @@ -0,0 +1,20 @@ +// src/App.jsx +import React from "react"; +import { + BrowserRouter as Router, + Routes, + Route, + Navigate, +} from "react-router-dom"; +import WizardPage from "./pages/WizardPage"; + +export default function App() { + return ( + + + } /> + } /> + + + ); +} diff --git a/web/mapleqr-frontend-prototype/src/components/Archive.zip b/web/mapleqr-frontend-prototype/src/components/Archive.zip new file mode 100644 index 0000000000000000000000000000000000000000..89360d5e9934ba1608b891b15466798a20785c88 GIT binary patch literal 5820 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 J-$Zux^*=kKW2gWC literal 0 HcmV?d00001 diff --git a/web/mapleqr-frontend-prototype/src/components/StepColorSettings.jsx b/web/mapleqr-frontend-prototype/src/components/StepColorSettings.jsx new file mode 100644 index 0000000..c8eb35c --- /dev/null +++ b/web/mapleqr-frontend-prototype/src/components/StepColorSettings.jsx @@ -0,0 +1,160 @@ +// src/components/StepColorSettings.jsx +import React, { useState, useEffect } from "react"; + +const presetColors = [ + "#8a1622", // deep red + "#ef5429", // orange + "#ffff00", // yellow + "#228B22", // forest green + "#0000ff", // blue + "#660066", // purple + "#000000", // black +]; + +function hexToRgb(hex) { + const bigint = parseInt(hex.slice(1), 16); + const r = (bigint >> 16) & 255; + const g = (bigint >> 8) & 255; + const b = bigint & 255; + return `rgb(${r}, ${g}, ${b})`; +} + +function rgbToHex(rgb) { + const result = rgb.match(/\d+/g); + if (!result) return "#000000"; + return ( + "#" + result.map((n) => parseInt(n).toString(16).padStart(2, "0")).join("") + ); +} + +export default function StepColorSettings({ + formData, + setFormData, + onNext, + onBack, +}) { + const [mode, setMode] = useState("white"); // white | presets | custom + const [hex, setHex] = useState("#000000"); + const [rgb, setRgb] = useState("rgb(0, 0, 0)"); + + useEffect(() => { + setFormData({ ...formData, color: hex }); + }, [hex]); + + const handleHexChange = (e) => { + const value = e.target.value; + setHex(value); + setRgb(hexToRgb(value)); + }; + + const handleRgbChange = (e) => { + const value = e.target.value; + setRgb(value); + try { + const hexValue = rgbToHex(value); + setHex(hexValue); + } catch {} + }; + + const tileClasses = (selected) => + `border rounded-xl px-4 py-4 text-left transition hover:shadow-md ${ + mode === selected ? "border-[#8a1622] bg-[#fff5f6]" : "border-gray-200" + }`; + + return ( +
+

+ Step 5: Choose Foreground Colour +

+ +
+ + + +
+ + {mode === "presets" && ( + <> +

Select a preset color:

+
+ {presetColors.map((color) => ( +
+ + )} + + {mode === "custom" && ( +
+
+
+ + +
+
+ )} + +
+ + +
+
+ ); +} diff --git a/web/mapleqr-frontend-prototype/src/components/StepInputDetails.jsx b/web/mapleqr-frontend-prototype/src/components/StepInputDetails.jsx new file mode 100644 index 0000000..bdfaf56 --- /dev/null +++ b/web/mapleqr-frontend-prototype/src/components/StepInputDetails.jsx @@ -0,0 +1,128 @@ +// src/components/StepInputDetails.jsx +import React, { useState } from "react"; + +export default function StepInputDetails({ + selectedType, + formData, + setFormData, + onNext, + onBack, +}) { + const [errors, setErrors] = useState({}); + + const handleChange = (e) => { + const { name, value } = e.target; + setFormData({ ...formData, [name]: value }); + }; + + const handleSubmit = () => { + setErrors({}); + onNext(); + }; + + const inputStyle = + "w-full border-2 border-[#8a1622] bg-[#fff5f6] text-[#222] px-4 py-3 rounded-xl placeholder-gray-500 focus:outline-none focus:ring-2 focus:ring-[#8a1622] transition"; + + return ( +
+

+ Step 2: Enter Details +

+
+ {selectedType === "url" && ( + + )} + {selectedType === "text" && ( +