diff --git a/.gitignore b/.gitignore index 033df5fb..e7b24d9a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ .venv __pycache__ +static/v2/ +frontend/node_modules/ diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 00000000..b9470778 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,2 @@ +node_modules/ +dist/ diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 00000000..b530e959 --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,13 @@ + + + + + + Mosswart Overlord v2 + + + +
+ + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 00000000..b660f580 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,2209 @@ +{ + "name": "mosswart-overlord-v2", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mosswart-overlord-v2", + "version": "0.1.0", + "dependencies": { + "react": "^19.1.0", + "react-dom": "^19.1.0", + "recharts": "^2.15.3" + }, + "devDependencies": { + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "typescript": "~5.8.3", + "vite": "^6.3.3" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", + "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.28.5", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.0.tgz", + "integrity": "sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", + "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-compilation-targets": "^7.28.6", + "@babel/helper-module-transforms": "^7.28.6", + "@babel/helpers": "^7.28.6", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/traverse": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.1", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", + "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@babel/types": "^7.29.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", + "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.28.6", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", + "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", + "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.28.6", + "@babel/helper-validator-identifier": "^7.28.5", + "@babel/traverse": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", + "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", + "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", + "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.28.6", + "@babel/parser": "^7.28.6", + "@babel/types": "^7.28.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", + "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.0", + "@babel/generator": "^7.29.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.29.0", + "@babel/template": "^7.28.6", + "@babel/types": "^7.29.0", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.27", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.27.tgz", + "integrity": "sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/d3-array": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@types/d3-array/-/d3-array-3.2.2.tgz", + "integrity": "sha512-hOLWVbm7uRza0BYXpIIW5pxfrKe0W+D5lrFiAEYR+pb6w3N2SwSMaJbXdUfSEv+dT4MfHBLtn5js0LAWaO6otw==", + "license": "MIT" + }, + "node_modules/@types/d3-color": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@types/d3-color/-/d3-color-3.1.3.tgz", + "integrity": "sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==", + "license": "MIT" + }, + "node_modules/@types/d3-ease": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-ease/-/d3-ease-3.0.2.tgz", + "integrity": "sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==", + "license": "MIT" + }, + "node_modules/@types/d3-interpolate": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-interpolate/-/d3-interpolate-3.0.4.tgz", + "integrity": "sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==", + "license": "MIT", + "dependencies": { + "@types/d3-color": "*" + } + }, + "node_modules/@types/d3-path": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@types/d3-path/-/d3-path-3.1.1.tgz", + "integrity": "sha512-VMZBYyQvbGmWyWVea0EHs/BwLgxc+MKi1zLDCONksozI4YJMcTt8ZEuIR4Sb1MMTE8MMW49v0IwI5+b7RmfWlg==", + "license": "MIT" + }, + "node_modules/@types/d3-scale": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/d3-scale/-/d3-scale-4.0.9.tgz", + "integrity": "sha512-dLmtwB8zkAeO/juAMfnV+sItKjlsw2lKdZVVy6LRr0cBmegxSABiLEpGVmSJJ8O08i4+sGR6qQtb6WtuwJdvVw==", + "license": "MIT", + "dependencies": { + "@types/d3-time": "*" + } + }, + "node_modules/@types/d3-shape": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/d3-shape/-/d3-shape-3.1.8.tgz", + "integrity": "sha512-lae0iWfcDeR7qt7rA88BNiqdvPS5pFVPpo5OfjElwNaT2yyekbM0C9vK+yqBqEmHr6lDkRnYNoTBYlAgJa7a4w==", + "license": "MIT", + "dependencies": { + "@types/d3-path": "*" + } + }, + "node_modules/@types/d3-time": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-3.0.4.tgz", + "integrity": "sha512-yuzZug1nkAAaBlBBikKZTgzCeA+k1uy4ZFwWANOfKw5z5LRhV0gNA7gNkKm7HoK+HRN0wX3EkxGk0fpbWhmB7g==", + "license": "MIT" + }, + "node_modules/@types/d3-timer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/d3-timer/-/d3-timer-3.0.2.tgz", + "integrity": "sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "19.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.14.tgz", + "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "csstype": "^3.2.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.2.3", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", + "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.2.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.7.0.tgz", + "integrity": "sha512-gUu9hwfWvvEDBBmgtAowQCojwZmJ5mcLn3aufeCsitijs3+f2NsrPtlAWIR6OPiqljl96GVCUbLe0HyqIpVaoA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.0", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.27", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.18", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.18.tgz", + "integrity": "sha512-VSnGQAOLtP5mib/DPyg2/t+Tlv65NTBz83BJBJvmLVHHuKJVaDOBvJJykiT5TR++em5nfAySPccDZDa4oSrn8A==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", + "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "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", + "peer": true, + "dependencies": { + "baseline-browser-mapping": "^2.10.12", + "caniuse-lite": "^1.0.30001782", + "electron-to-chromium": "^1.5.328", + "node-releases": "^2.0.36", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001787", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001787.tgz", + "integrity": "sha512-mNcrMN9KeI68u7muanUpEejSLghOKlVhRqS/Za2IeyGllJ9I9otGpR9g3nsw7n4W378TE/LyIteA0+/FOZm4Kg==", + "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/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-ease": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-ease/-/d3-ease-3.0.1.tgz", + "integrity": "sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.2.tgz", + "integrity": "sha512-AJDdYOdnyRDV5b6ArilzCPPwc1ejkHcoyFarqlPqT7zRYjhavcT3uSrqcMvsgh2CgoPbK3RCwyHaVyxYcP2Arg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js-light": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", + "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==", + "license": "MIT" + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.335", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.335.tgz", + "integrity": "sha512-q9n5T4BR4Xwa2cwbrwcsDJtHD/enpQ5S1xF1IAtdqf5AAgqDFmR/aakqH3ChFdqd/QXJhS3rnnXFtexU7rax6Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/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/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/fast-equals": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.4.0.tgz", + "integrity": "sha512-jt2DW/aNFNwke7AUd+Z+e6pz39KO5rzdbbFCg2sGafS4mk13MI7Z8O5z9cADNn5lhGODIgLwug6TZO2ctf7kcw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/node-releases": { + "version": "2.0.37", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.37.tgz", + "integrity": "sha512-1h5gKZCF+pO/o3Iqt5Jp7wc9rH3eJJ0+nh/CIoiRwjRxde/hAHyLPXYN4V3CqKAbiZPSeJFSWHmJsbkicta0Eg==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "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.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.9", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.9.tgz", + "integrity": "sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/prop-types/node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react/-/react-19.2.5.tgz", + "integrity": "sha512-llUJLzz1zTUBrskt2pwZgLq59AemifIftw4aB7JxOqf1HY2FDaGDxgwpAPVzHU1kdWabH7FauP4i1oEeer2WCA==", + "license": "MIT", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-J5bAZz+DXMMwW/wV3xzKke59Af6CHY7G4uYLN1OvBcKEsWOs4pQExj86BBKamxl/Ik5bx9whOrvBlSDfWzgSag==", + "license": "MIT", + "peer": true, + "dependencies": { + "scheduler": "^0.27.0" + }, + "peerDependencies": { + "react": "^19.2.5" + } + }, + "node_modules/react-is": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", + "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", + "license": "MIT" + }, + "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-smooth": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/react-smooth/-/react-smooth-4.0.4.tgz", + "integrity": "sha512-gnGKTpYwqL0Iii09gHobNolvX4Kiq4PKx6eWBCYYix+8cdw+cGo3do906l1NBPKkSWx1DghC1dlWG9L2uGd61Q==", + "license": "MIT", + "dependencies": { + "fast-equals": "^5.0.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/recharts": { + "version": "2.15.4", + "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", + "integrity": "sha512-UT/q6fwS3c1dHbXv2uFgYJ9BMFHu3fwnd7AYZaEQhXuYQ4hgsxLvsUXzGdKeZrW5xopzDCvuA2N41WJ88I7zIw==", + "license": "MIT", + "dependencies": { + "clsx": "^2.0.0", + "eventemitter3": "^4.0.1", + "lodash": "^4.17.21", + "react-is": "^18.3.1", + "react-smooth": "^4.0.4", + "recharts-scale": "^0.4.4", + "tiny-invariant": "^1.3.1", + "victory-vendor": "^36.6.8" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.0.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/recharts-scale": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/recharts-scale/-/recharts-scale-0.4.5.tgz", + "integrity": "sha512-kivNFO+0OcUNu7jQquLXAxz1FIwZj8nrj+YkOKc5694NbjCvcT6aSZiIzNzd2Kul4o4rTto8QVR9lMNtxD4G1w==", + "license": "MIT", + "dependencies": { + "decimal.js-light": "^2.4.1" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", + "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", + "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/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/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==", + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.16", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", + "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", + "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/victory-vendor": { + "version": "36.9.2", + "resolved": "https://registry.npmjs.org/victory-vendor/-/victory-vendor-36.9.2.tgz", + "integrity": "sha512-PnpQQMuxlwYdocC8fIJqVXvkeViHYzotI+NJrCuav0ZYFoq912ZHBk3mCeuj+5/VpodOjPe1z0Fk2ihgzlXqjQ==", + "license": "MIT AND ISC", + "dependencies": { + "@types/d3-array": "^3.0.3", + "@types/d3-ease": "^3.0.0", + "@types/d3-interpolate": "^3.0.1", + "@types/d3-scale": "^4.0.2", + "@types/d3-shape": "^3.1.0", + "@types/d3-time": "^3.0.0", + "@types/d3-timer": "^3.0.0", + "d3-array": "^3.1.6", + "d3-ease": "^3.0.1", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-shape": "^3.1.0", + "d3-time": "^3.0.0", + "d3-timer": "^3.0.1" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "dev": true, + "license": "MIT", + "peer": true, + "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/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 00000000..73342583 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,23 @@ +{ + "name": "mosswart-overlord-v2", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^19.1.0", + "react-dom": "^19.1.0", + "recharts": "^2.15.3" + }, + "devDependencies": { + "@types/react": "^19.1.2", + "@types/react-dom": "^19.1.2", + "@vitejs/plugin-react": "^4.4.1", + "typescript": "~5.8.3", + "vite": "^6.3.3" + } +} diff --git a/frontend/src/App.tsx b/frontend/src/App.tsx new file mode 100644 index 00000000..fa4a3605 --- /dev/null +++ b/frontend/src/App.tsx @@ -0,0 +1,21 @@ +import { Layout } from './components/Layout'; +import { GlobalStats } from './components/GlobalStats'; +import { CharacterGrid } from './components/CharacterGrid'; +import { useLiveData } from './hooks/useLiveData'; +import './styles/global.css'; + +export default function App() { + const { characters, serverHealth, totalRares, totalKills } = useLiveData(); + + return ( + + + + + ); +} diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts new file mode 100644 index 00000000..1a8747e1 --- /dev/null +++ b/frontend/src/api/client.ts @@ -0,0 +1,15 @@ +// In production the browser hits /api/* and Nginx strips the prefix. +// In dev, Vite's proxy does the same stripping. +// So we always use /api/ as prefix — works both environments. +const API_BASE = '/api'; + +export async function apiFetch(path: string): Promise { + const res = await fetch(`${API_BASE}${path}`, { credentials: 'include' }); + if (!res.ok) throw new Error(`API ${path}: ${res.status}`); + return res.json(); +} + +export function wsUrl(): string { + const proto = location.protocol === 'https:' ? 'wss:' : 'ws:'; + return `${proto}//${location.host}/api/ws/live`; +} diff --git a/frontend/src/api/endpoints.ts b/frontend/src/api/endpoints.ts new file mode 100644 index 00000000..63e5b588 --- /dev/null +++ b/frontend/src/api/endpoints.ts @@ -0,0 +1,22 @@ +import { apiFetch } from './client'; +import type { TelemetrySnapshot, CombatStatsMessage, ServerHealth } from '../types'; + +interface LiveResponse { + players: TelemetrySnapshot[]; +} + +interface CombatStatsResponse { + stats: CombatStatsMessage[]; +} + +interface CountResponse { + total_rares?: number; + total_kills?: number; + count?: number; +} + +export const getLive = () => apiFetch('/live'); +export const getCombatStats = () => apiFetch('/combat-stats'); +export const getServerHealth = () => apiFetch('/server-health'); +export const getTotalRares = () => apiFetch('/total-rares'); +export const getTotalKills = () => apiFetch('/total-kills'); diff --git a/frontend/src/components/CharacterCard.tsx b/frontend/src/components/CharacterCard.tsx new file mode 100644 index 00000000..f5f92054 --- /dev/null +++ b/frontend/src/components/CharacterCard.tsx @@ -0,0 +1,89 @@ +import React, { useState } from 'react'; +import { VitalBar } from './VitalBar'; +import type { CharacterState } from '../types'; + +interface Props { + character: CharacterState; +} + +const vtankBadge = (state: string) => { + const s = (state || 'idle').toLowerCase(); + if (s === 'combat') return { label: 'Combat', cls: 'badge-combat' }; + if (s === 'nav' || s === 'navigation') return { label: 'Nav', cls: 'badge-nav' }; + return { label: 'Idle', cls: 'badge-idle' }; +}; + +export const CharacterCard: React.FC = React.memo(({ character }) => { + const [expanded, setExpanded] = useState(false); + const { telemetry: t, vitals: v, combat: c } = character; + const badge = vtankBadge(t?.vt_state ?? ''); + + return ( +
setExpanded(!expanded)}> +
+ {character.name} + {badge.label} +
+ + {v ? ( +
+ + + +
+ ) : ( +
Awaiting vitals...
+ )} + +
+
+ {t?.kills_per_hour ?? '--'} + kills/hr +
+
+ {t?.kills?.toLocaleString() ?? '--'} + kills +
+
+ {t?.deaths ?? '0'} + deaths +
+
+ {t?.onlinetime?.replace(/^00\./, '') ?? '--'} + uptime +
+
+ + {t && ( +
+ {t.ns?.toFixed(1)}N, {t.ew?.toFixed(1)}E +
+ )} + + {expanded && ( +
+ {v?.vitae ?
Vitae: {v.vitae}%
: null} +
+ Prismatics: {t?.prismatic_taper_count ?? '--'} + Total Deaths: {t?.total_deaths ?? '--'} +
+ {c?.session && ( +
+ Session Dmg: {c.session.total_damage_given?.toLocaleString()} + Session Kills: {c.session.total_kills} +
+ )} +
+ RAM: {t?.mem_mb ? (t.mem_mb / 1048576).toFixed(0) + ' MB' : '--'} + CPU: {t?.cpu_pct?.toFixed(1) ?? '--'}% +
+
+ )} +
+ ); +}); + +CharacterCard.displayName = 'CharacterCard'; diff --git a/frontend/src/components/CharacterGrid.tsx b/frontend/src/components/CharacterGrid.tsx new file mode 100644 index 00000000..36d78c80 --- /dev/null +++ b/frontend/src/components/CharacterGrid.tsx @@ -0,0 +1,27 @@ +import React, { useMemo } from 'react'; +import { CharacterCard } from './CharacterCard'; +import type { CharacterState } from '../types'; + +interface Props { + characters: Map; +} + +export const CharacterGrid: React.FC = ({ characters }) => { + const sorted = useMemo(() => { + return Array.from(characters.values()).sort((a, b) => + a.name.localeCompare(b.name) + ); + }, [characters]); + + if (sorted.length === 0) { + return
No active characters
; + } + + return ( +
+ {sorted.map(ch => ( + + ))} +
+ ); +}; diff --git a/frontend/src/components/GlobalStats.tsx b/frontend/src/components/GlobalStats.tsx new file mode 100644 index 00000000..76d8e472 --- /dev/null +++ b/frontend/src/components/GlobalStats.tsx @@ -0,0 +1,36 @@ +import React from 'react'; +import type { ServerHealth } from '../types'; + +interface Props { + activeChars: number; + totalKills: number; + totalRares: number; + serverHealth: ServerHealth | null; +} + +export const GlobalStats: React.FC = ({ activeChars, totalKills, totalRares, serverHealth }) => { + const serverStatus = serverHealth?.status?.toLowerCase() ?? 'unknown'; + const isOnline = serverStatus === 'online' || serverStatus === 'up'; + + return ( +
+
+ {activeChars} + Active Characters +
+
+ {totalKills.toLocaleString()} + Total Kills +
+
+ {totalRares} + Total Rares +
+
+ + {serverHealth?.latency_ms ?? '--'}ms + Coldeve +
+
+ ); +}; diff --git a/frontend/src/components/Layout.tsx b/frontend/src/components/Layout.tsx new file mode 100644 index 00000000..956c8131 --- /dev/null +++ b/frontend/src/components/Layout.tsx @@ -0,0 +1,23 @@ +import React from 'react'; + +interface Props { + children: React.ReactNode; +} + +export const Layout: React.FC = ({ children }) => { + return ( +
+
+

Mosswart Overlord

+ +
+
+ {children} +
+
+ ); +}; diff --git a/frontend/src/components/VitalBar.tsx b/frontend/src/components/VitalBar.tsx new file mode 100644 index 00000000..ae1a3f12 --- /dev/null +++ b/frontend/src/components/VitalBar.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +interface Props { + label: string; + current: number; + max: number; + color: string; + bgColor: string; +} + +export const VitalBar: React.FC = React.memo(({ label, current, max, color, bgColor }) => { + const pct = max > 0 ? Math.min(100, Math.max(0, (current / max) * 100)) : 0; + return ( +
+ {label} +
+
+
+ {current}/{max} +
+ ); +}); + +VitalBar.displayName = 'VitalBar'; diff --git a/frontend/src/hooks/useLiveData.ts b/frontend/src/hooks/useLiveData.ts new file mode 100644 index 00000000..6fa5255e --- /dev/null +++ b/frontend/src/hooks/useLiveData.ts @@ -0,0 +1,133 @@ +import { useState, useCallback, useEffect, useRef } from 'react'; +import { useWebSocket } from './useWebSocket'; +import { getLive, getCombatStats, getServerHealth, getTotalRares, getTotalKills } from '../api/endpoints'; +import type { + CharacterState, TelemetrySnapshot, VitalsMessage, CombatStatsMessage, + RareMessage, ServerHealth, WSMessage, +} from '../types'; + +export interface DashboardState { + characters: Map; + serverHealth: ServerHealth | null; + totalRares: number; + totalKills: number; + recentRares: RareMessage[]; +} + +export function useLiveData(): DashboardState { + const [characters, setCharacters] = useState>(new Map()); + const [serverHealth, setServerHealth] = useState(null); + const [totalRares, setTotalRares] = useState(0); + const [totalKills, setTotalKills] = useState(0); + const [recentRares, setRecentRares] = useState([]); + const charsRef = useRef(characters); + charsRef.current = characters; + + // Helper to update a single character's state + const updateChar = useCallback((name: string, updater: (prev: CharacterState) => CharacterState) => { + setCharacters(prev => { + const next = new Map(prev); + const existing = next.get(name) ?? { name, telemetry: null, vitals: null, combat: null, lastUpdate: 0 }; + next.set(name, updater(existing)); + return next; + }); + }, []); + + // WebSocket message handler + const handleWS = useCallback((msg: WSMessage) => { + if (!msg.type) return; + + if (msg.type === 'telemetry') { + const t = msg as TelemetrySnapshot & { type: string }; + updateChar(t.character_name, s => ({ ...s, telemetry: t, lastUpdate: Date.now() })); + } else if (msg.type === 'vitals') { + const v = msg as VitalsMessage; + updateChar(v.character_name, s => ({ ...s, vitals: v, lastUpdate: Date.now() })); + } else if (msg.type === 'combat_stats') { + const c = msg as CombatStatsMessage; + updateChar(c.character_name, s => ({ ...s, combat: c, lastUpdate: Date.now() })); + } else if (msg.type === 'rare') { + const r = msg as RareMessage; + setRecentRares(prev => [r, ...prev].slice(0, 50)); + } + }, [updateChar]); + + useWebSocket(handleWS); + + // HTTP polls as fallback/initial load + useEffect(() => { + const fetchLive = async () => { + try { + const data = await getLive(); + setCharacters(prev => { + const next = new Map(prev); + for (const p of data.players ?? []) { + const existing = next.get(p.character_name); + next.set(p.character_name, { + name: p.character_name, + telemetry: p, + vitals: existing?.vitals ?? null, + combat: existing?.combat ?? null, + lastUpdate: Date.now(), + }); + } + // Remove stale characters not in /live response + for (const key of next.keys()) { + if (!data.players?.some(p => p.character_name === key)) { + next.delete(key); + } + } + return next; + }); + } catch { /* ignore */ } + }; + + fetchLive(); + const id = setInterval(fetchLive, 5000); + return () => clearInterval(id); + }, []); + + // Combat stats poll + useEffect(() => { + const fetch = async () => { + try { + const data = await getCombatStats(); + for (const s of data.stats ?? []) { + updateChar(s.character_name, prev => ({ + ...prev, + combat: { ...s, type: 'combat_stats' }, + })); + } + } catch { /* ignore */ } + }; + fetch(); + const id = setInterval(fetch, 30000); + return () => clearInterval(id); + }, [updateChar]); + + // Server health poll + useEffect(() => { + const fetch = async () => { + try { setServerHealth(await getServerHealth()); } catch { /* ignore */ } + }; + fetch(); + const id = setInterval(fetch, 30000); + return () => clearInterval(id); + }, []); + + // Global counters poll + useEffect(() => { + const fetch = async () => { + try { + const [rares, kills] = await Promise.all([getTotalRares(), getTotalKills()]); + setTotalRares(rares.total_rares ?? rares.count ?? 0); + setTotalKills(kills.total_kills ?? kills.count ?? 0); + } catch { /* ignore */ } + }; + fetch(); + const id = setInterval(fetch, 300000); + return () => clearInterval(id); + }, []); + + return { characters, serverHealth, totalRares, totalKills, recentRares }; +} diff --git a/frontend/src/hooks/useWebSocket.ts b/frontend/src/hooks/useWebSocket.ts new file mode 100644 index 00000000..cf350562 --- /dev/null +++ b/frontend/src/hooks/useWebSocket.ts @@ -0,0 +1,44 @@ +import { useEffect, useRef, useCallback } from 'react'; +import { wsUrl } from '../api/client'; +import type { WSMessage } from '../types'; + +type MessageHandler = (msg: WSMessage) => void; + +export function useWebSocket(onMessage: MessageHandler) { + const wsRef = useRef(null); + const reconnectTimer = useRef(0); + const onMessageRef = useRef(onMessage); + onMessageRef.current = onMessage; + + const connect = useCallback(() => { + if (wsRef.current?.readyState === WebSocket.OPEN) return; + + const ws = new WebSocket(wsUrl()); + wsRef.current = ws; + + ws.addEventListener('message', (evt) => { + try { + const msg = JSON.parse(evt.data) as WSMessage; + onMessageRef.current(msg); + } catch { /* ignore parse errors */ } + }); + + ws.addEventListener('close', () => { + wsRef.current = null; + reconnectTimer.current = window.setTimeout(connect, 2000); + }); + + ws.addEventListener('error', () => { + ws.close(); + }); + }, []); + + useEffect(() => { + connect(); + return () => { + clearTimeout(reconnectTimer.current); + wsRef.current?.close(); + wsRef.current = null; + }; + }, [connect]); +} diff --git a/frontend/src/main.tsx b/frontend/src/main.tsx new file mode 100644 index 00000000..d9736adc --- /dev/null +++ b/frontend/src/main.tsx @@ -0,0 +1,9 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App'; + +createRoot(document.getElementById('root')!).render( + + + , +); diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css new file mode 100644 index 00000000..5758679f --- /dev/null +++ b/frontend/src/styles/global.css @@ -0,0 +1,304 @@ +/* ── Reset & Variables ─────────────────────────────────── */ +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } + +:root { + --bg-body: #0d0d0d; + --bg-card: #1a1a1a; + --bg-card-hover: #222; + --bg-header: #111; + --border: #333; + --text: #ddd; + --text-muted: #888; + --text-dim: #555; + --accent: #4488ff; + --hp: linear-gradient(90deg, #ff4444, #ff6666); + --hp-bg: #330000; + --sta: linear-gradient(90deg, #ffaa00, #ffcc44); + --sta-bg: #331a00; + --mana: linear-gradient(90deg, #4488ff, #66aaff); + --mana-bg: #001433; + --badge-combat: #44cc44; + --badge-nav: #ffaa00; + --badge-idle: #666; + --radius: 6px; +} + +body { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + background: var(--bg-body); + color: var(--text); + line-height: 1.4; + min-height: 100vh; +} + +/* ── Dashboard Layout ─────────────────────────────────── */ +.dashboard { + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.dashboard-header { + background: var(--bg-header); + border-bottom: 1px solid var(--border); + padding: 12px 24px; + display: flex; + align-items: center; + justify-content: space-between; + position: sticky; + top: 0; + z-index: 100; +} + +.dashboard-title { + font-size: 1.2rem; + font-weight: 600; + color: var(--accent); +} + +.dashboard-nav { + display: flex; + gap: 16px; +} + +.nav-link { + color: var(--text-muted); + text-decoration: none; + font-size: 0.85rem; + transition: color 0.2s; +} +.nav-link:hover { color: var(--text); } + +.dashboard-main { + flex: 1; + padding: 16px 24px; + max-width: 1600px; + margin: 0 auto; + width: 100%; +} + +/* ── Global Stats Bar ─────────────────────────────────── */ +.global-stats { + display: flex; + gap: 24px; + padding: 12px 0; + margin-bottom: 16px; + border-bottom: 1px solid var(--border); + flex-wrap: wrap; +} + +.global-stat { + display: flex; + align-items: center; + gap: 6px; +} + +.global-value { + font-size: 1.1rem; + font-weight: 600; + color: var(--text); +} + +.global-label { + font-size: 0.75rem; + color: var(--text-muted); +} + +.server-dot { + width: 8px; + height: 8px; + border-radius: 50%; + display: inline-block; +} +.server-dot.online { background: #44cc44; } +.server-dot.offline { background: #cc4444; } + +/* ── Character Grid ───────────────────────────────────── */ +.char-grid { + display: grid; + grid-template-columns: repeat(auto-fill, minmax(300px, 1fr)); + gap: 12px; +} + +.grid-empty { + text-align: center; + color: var(--text-muted); + padding: 48px; + font-size: 1rem; +} + +/* ── Character Card ───────────────────────────────────── */ +.char-card { + background: var(--bg-card); + border: 1px solid var(--border); + border-radius: var(--radius); + padding: 12px 14px; + cursor: pointer; + transition: background 0.15s, border-color 0.15s; +} +.char-card:hover { + background: var(--bg-card-hover); + border-color: #444; +} + +.char-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 8px; +} + +.char-name { + font-size: 0.9rem; + font-weight: 600; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.char-badge { + font-size: 0.65rem; + font-weight: 700; + text-transform: uppercase; + padding: 2px 8px; + border-radius: 3px; + letter-spacing: 0.5px; +} +.badge-combat { background: rgba(68,204,68,0.2); color: var(--badge-combat); } +.badge-nav { background: rgba(255,170,0,0.2); color: var(--badge-nav); } +.badge-idle { background: rgba(100,100,100,0.2); color: var(--badge-idle); } + +/* ── Vital Bars ───────────────────────────────────────── */ +.char-vitals { + display: flex; + flex-direction: column; + gap: 3px; + margin-bottom: 8px; +} + +.char-vitals-placeholder { + font-size: 0.75rem; + color: var(--text-dim); + margin-bottom: 8px; + font-style: italic; +} + +.vital-bar { + display: flex; + align-items: center; + gap: 6px; +} + +.vital-label { + font-size: 0.65rem; + color: var(--text-muted); + width: 20px; + text-align: right; +} + +.vital-track { + flex: 1; + height: 6px; + border-radius: 3px; + overflow: hidden; +} + +.vital-fill { + height: 100%; + border-radius: 3px; + transition: width 0.3s ease-out; +} + +.vital-text { + font-size: 0.65rem; + color: var(--text-muted); + width: 65px; + text-align: right; + font-variant-numeric: tabular-nums; +} + +/* ── Stats Row ────────────────────────────────────────── */ +.char-stats-row { + display: flex; + gap: 12px; + margin-bottom: 4px; +} + +.stat { + display: flex; + flex-direction: column; + align-items: center; +} + +.stat-value { + font-size: 0.85rem; + font-weight: 600; + font-variant-numeric: tabular-nums; +} + +.stat-label { + font-size: 0.6rem; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.3px; +} + +/* ── Location ─────────────────────────────────────────── */ +.char-location { + font-size: 0.7rem; + color: var(--text-dim); + text-align: right; +} + +/* ── Expanded Details ─────────────────────────────────── */ +.char-expanded { + margin-top: 8px; + padding-top: 8px; + border-top: 1px solid var(--border); +} + +.expanded-row { + display: flex; + justify-content: space-between; + font-size: 0.75rem; + color: var(--text-muted); + margin-bottom: 2px; +} + +.vitae-warn { + color: #ff6666; + font-size: 0.8rem; + font-weight: 600; + margin-bottom: 4px; +} + +/* ── Mobile Responsive ────────────────────────────────── */ +@media (max-width: 768px) { + .dashboard-header { + flex-direction: column; + gap: 8px; + padding: 10px 16px; + } + .dashboard-main { + padding: 12px 12px; + } + .global-stats { + gap: 16px; + } + .char-grid { + grid-template-columns: 1fr; + } + .char-stats-row { + gap: 8px; + } +} + +@media (max-width: 480px) { + .dashboard-nav { + gap: 10px; + font-size: 0.8rem; + } + .char-card { + padding: 10px; + } +} diff --git a/frontend/src/types/index.ts b/frontend/src/types/index.ts new file mode 100644 index 00000000..8d7ba4fb --- /dev/null +++ b/frontend/src/types/index.ts @@ -0,0 +1,109 @@ +// Matches the telemetry payload from the plugin + /live endpoint join +export interface TelemetrySnapshot { + character_name: string; + char_tag: string; + session_id: string; + timestamp: string; + ew: number; + ns: number; + z: number; + kills: number; + kills_per_hour: string; + onlinetime: string; + deaths: string; + total_deaths: string; + prismatic_taper_count: string; + vt_state: string; + mem_mb: number; + cpu_pct: number; + // Joined from DB in /live + total_rares?: number; + session_rares?: number; + total_kills?: number; +} + +export interface VitalsMessage { + type: 'vitals'; + character_name: string; + health_current: number; + health_max: number; + health_percentage: number; + stamina_current: number; + stamina_max: number; + stamina_percentage: number; + mana_current: number; + mana_max: number; + mana_percentage: number; + vitae: number; +} + +export interface RareMessage { + type: 'rare'; + character_name: string; + name: string; + timestamp: string; +} + +export interface CombatStatsMessage { + type: 'combat_stats'; + character_name: string; + session_id: string; + session: CombatSessionState | null; + lifetime: CombatSessionState | null; +} + +export interface CombatSessionState { + total_damage_given: number; + total_damage_received: number; + total_kills: number; + total_aetheria_surges: number; + total_cloak_surges: number; + session_start: string; + monsters: Record; +} + +export interface MonsterRecord { + name: string; + kill_count: number; + damage_given: number; + damage_received: number; + aetheria_surges: number; + cloak_surges: number; + offense: Record>; + defense: Record>; +} + +export interface DamageStats { + total_attacks: number; + failed_attacks: number; + crits: number; + total_normal_damage: number; + max_normal_damage: number; + total_crit_damage: number; + max_crit_damage: number; + damage: number; +} + +export interface ServerHealth { + status: string; + latency_ms: number | null; + player_count: number | null; + uptime_seconds: number | null; + last_check: string | null; +} + +// Merged live state for each character shown in the dashboard +export interface CharacterState { + name: string; + telemetry: TelemetrySnapshot | null; + vitals: VitalsMessage | null; + combat: CombatStatsMessage | null; + lastUpdate: number; // timestamp ms +} + +export type WSMessage = + | (TelemetrySnapshot & { type: 'telemetry' }) + | VitalsMessage + | CombatStatsMessage + | RareMessage + | { type: string; [key: string]: unknown }; diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 00000000..75e2ff7a --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["src"] +} diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo new file mode 100644 index 00000000..a10579c8 --- /dev/null +++ b/frontend/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/app.tsx","./src/main.tsx","./src/api/client.ts","./src/api/endpoints.ts","./src/components/charactercard.tsx","./src/components/charactergrid.tsx","./src/components/globalstats.tsx","./src/components/layout.tsx","./src/components/vitalbar.tsx","./src/hooks/uselivedata.ts","./src/hooks/usewebsocket.ts","./src/types/index.ts"],"version":"5.8.3"} \ No newline at end of file diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 00000000..720de40c --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,22 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' + +export default defineConfig({ + plugins: [react()], + base: '/v2/', + build: { + outDir: '../static/v2', + emptyOutDir: true, + }, + server: { + port: 5173, + proxy: { + '/api': { + target: 'http://localhost:8765', + changeOrigin: true, + rewrite: (path) => path.replace(/^\/api/, ''), + ws: true, + }, + }, + }, +}) diff --git a/static/v2/assets/index-Ba_QIbRB.css b/static/v2/assets/index-Ba_QIbRB.css new file mode 100644 index 00000000..b16f3a8a --- /dev/null +++ b/static/v2/assets/index-Ba_QIbRB.css @@ -0,0 +1 @@ +*,*:before,*:after{box-sizing:border-box;margin:0;padding:0}:root{--bg-body: #0d0d0d;--bg-card: #1a1a1a;--bg-card-hover: #222;--bg-header: #111;--border: #333;--text: #ddd;--text-muted: #888;--text-dim: #555;--accent: #4488ff;--hp: linear-gradient(90deg, #ff4444, #ff6666);--hp-bg: #330000;--sta: linear-gradient(90deg, #ffaa00, #ffcc44);--sta-bg: #331a00;--mana: linear-gradient(90deg, #4488ff, #66aaff);--mana-bg: #001433;--badge-combat: #44cc44;--badge-nav: #ffaa00;--badge-idle: #666;--radius: 6px}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:var(--bg-body);color:var(--text);line-height:1.4;min-height:100vh}.dashboard{display:flex;flex-direction:column;min-height:100vh}.dashboard-header{background:var(--bg-header);border-bottom:1px solid var(--border);padding:12px 24px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;z-index:100}.dashboard-title{font-size:1.2rem;font-weight:600;color:var(--accent)}.dashboard-nav{display:flex;gap:16px}.nav-link{color:var(--text-muted);text-decoration:none;font-size:.85rem;transition:color .2s}.nav-link:hover{color:var(--text)}.dashboard-main{flex:1;padding:16px 24px;max-width:1600px;margin:0 auto;width:100%}.global-stats{display:flex;gap:24px;padding:12px 0;margin-bottom:16px;border-bottom:1px solid var(--border);flex-wrap:wrap}.global-stat{display:flex;align-items:center;gap:6px}.global-value{font-size:1.1rem;font-weight:600;color:var(--text)}.global-label{font-size:.75rem;color:var(--text-muted)}.server-dot{width:8px;height:8px;border-radius:50%;display:inline-block}.server-dot.online{background:#4c4}.server-dot.offline{background:#c44}.char-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}.grid-empty{text-align:center;color:var(--text-muted);padding:48px;font-size:1rem}.char-card{background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius);padding:12px 14px;cursor:pointer;transition:background .15s,border-color .15s}.char-card:hover{background:var(--bg-card-hover);border-color:#444}.char-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}.char-name{font-size:.9rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.char-badge{font-size:.65rem;font-weight:700;text-transform:uppercase;padding:2px 8px;border-radius:3px;letter-spacing:.5px}.badge-combat{background:#4c43;color:var(--badge-combat)}.badge-nav{background:#fa03;color:var(--badge-nav)}.badge-idle{background:#64646433;color:var(--badge-idle)}.char-vitals{display:flex;flex-direction:column;gap:3px;margin-bottom:8px}.char-vitals-placeholder{font-size:.75rem;color:var(--text-dim);margin-bottom:8px;font-style:italic}.vital-bar{display:flex;align-items:center;gap:6px}.vital-label{font-size:.65rem;color:var(--text-muted);width:20px;text-align:right}.vital-track{flex:1;height:6px;border-radius:3px;overflow:hidden}.vital-fill{height:100%;border-radius:3px;transition:width .3s ease-out}.vital-text{font-size:.65rem;color:var(--text-muted);width:65px;text-align:right;font-variant-numeric:tabular-nums}.char-stats-row{display:flex;gap:12px;margin-bottom:4px}.stat{display:flex;flex-direction:column;align-items:center}.stat-value{font-size:.85rem;font-weight:600;font-variant-numeric:tabular-nums}.stat-label{font-size:.6rem;color:var(--text-muted);text-transform:uppercase;letter-spacing:.3px}.char-location{font-size:.7rem;color:var(--text-dim);text-align:right}.char-expanded{margin-top:8px;padding-top:8px;border-top:1px solid var(--border)}.expanded-row{display:flex;justify-content:space-between;font-size:.75rem;color:var(--text-muted);margin-bottom:2px}.vitae-warn{color:#f66;font-size:.8rem;font-weight:600;margin-bottom:4px}@media(max-width:768px){.dashboard-header{flex-direction:column;gap:8px;padding:10px 16px}.dashboard-main{padding:12px}.global-stats{gap:16px}.char-grid{grid-template-columns:1fr}.char-stats-row{gap:8px}}@media(max-width:480px){.dashboard-nav{gap:10px;font-size:.8rem}.char-card{padding:10px}} diff --git a/static/v2/assets/index-Nz88Zp1N.js b/static/v2/assets/index-Nz88Zp1N.js new file mode 100644 index 00000000..fb4e40d2 --- /dev/null +++ b/static/v2/assets/index-Nz88Zp1N.js @@ -0,0 +1,49 @@ +(function(){const q=document.createElement("link").relList;if(q&&q.supports&&q.supports("modulepreload"))return;for(const N of document.querySelectorAll('link[rel="modulepreload"]'))d(N);new MutationObserver(N=>{for(const j of N)if(j.type==="childList")for(const ll of j.addedNodes)ll.tagName==="LINK"&&ll.rel==="modulepreload"&&d(ll)}).observe(document,{childList:!0,subtree:!0});function Y(N){const j={};return N.integrity&&(j.integrity=N.integrity),N.referrerPolicy&&(j.referrerPolicy=N.referrerPolicy),N.crossOrigin==="use-credentials"?j.credentials="include":N.crossOrigin==="anonymous"?j.credentials="omit":j.credentials="same-origin",j}function d(N){if(N.ep)return;N.ep=!0;const j=Y(N);fetch(N.href,j)}})();function Fm(A){return A&&A.__esModule&&Object.prototype.hasOwnProperty.call(A,"default")?A.default:A}var fi={exports:{}},be={};/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var hd;function km(){if(hd)return be;hd=1;var A=Symbol.for("react.transitional.element"),q=Symbol.for("react.fragment");function Y(d,N,j){var ll=null;if(j!==void 0&&(ll=""+j),N.key!==void 0&&(ll=""+N.key),"key"in N){j={};for(var bl in N)bl!=="key"&&(j[bl]=N[bl])}else j=N;return N=j.ref,{$$typeof:A,type:d,key:ll,ref:N!==void 0?N:null,props:j}}return be.Fragment=q,be.jsx=Y,be.jsxs=Y,be}var Sd;function Im(){return Sd||(Sd=1,fi.exports=km()),fi.exports}var M=Im(),ii={exports:{}},G={};/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var gd;function Pm(){if(gd)return G;gd=1;var A=Symbol.for("react.transitional.element"),q=Symbol.for("react.portal"),Y=Symbol.for("react.fragment"),d=Symbol.for("react.strict_mode"),N=Symbol.for("react.profiler"),j=Symbol.for("react.consumer"),ll=Symbol.for("react.context"),bl=Symbol.for("react.forward_ref"),H=Symbol.for("react.suspense"),E=Symbol.for("react.memo"),$=Symbol.for("react.lazy"),R=Symbol.for("react.activity"),nl=Symbol.iterator;function V(v){return v===null||typeof v!="object"?null:(v=nl&&v[nl]||v["@@iterator"],typeof v=="function"?v:null)}var F={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},P=Object.assign,El={};function rl(v,T,O){this.props=v,this.context=T,this.refs=El,this.updater=O||F}rl.prototype.isReactComponent={},rl.prototype.setState=function(v,T){if(typeof v!="object"&&typeof v!="function"&&v!=null)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,v,T,"setState")},rl.prototype.forceUpdate=function(v){this.updater.enqueueForceUpdate(this,v,"forceUpdate")};function bt(){}bt.prototype=rl.prototype;function Sl(v,T,O){this.props=v,this.context=T,this.refs=El,this.updater=O||F}var Al=Sl.prototype=new bt;Al.constructor=Sl,P(Al,rl.prototype),Al.isPureReactComponent=!0;var _t=Array.isArray;function Vl(){}var k={H:null,A:null,T:null,S:null},Ll=Object.prototype.hasOwnProperty;function Ot(v,T,O){var p=O.ref;return{$$typeof:A,type:v,key:T,ref:p!==void 0?p:null,props:O}}function Qa(v,T){return Ot(v.type,T,v.props)}function Mt(v){return typeof v=="object"&&v!==null&&v.$$typeof===A}function Kl(v){var T={"=":"=0",":":"=2"};return"$"+v.replace(/[=:]/g,function(O){return T[O]})}var Ta=/\/+/g;function Ht(v,T){return typeof v=="object"&&v!==null&&v.key!=null?Kl(""+v.key):T.toString(36)}function zt(v){switch(v.status){case"fulfilled":return v.value;case"rejected":throw v.reason;default:switch(typeof v.status=="string"?v.then(Vl,Vl):(v.status="pending",v.then(function(T){v.status==="pending"&&(v.status="fulfilled",v.value=T)},function(T){v.status==="pending"&&(v.status="rejected",v.reason=T)})),v.status){case"fulfilled":return v.value;case"rejected":throw v.reason}}throw v}function r(v,T,O,p,X){var L=typeof v;(L==="undefined"||L==="boolean")&&(v=null);var el=!1;if(v===null)el=!0;else switch(L){case"bigint":case"string":case"number":el=!0;break;case"object":switch(v.$$typeof){case A:case q:el=!0;break;case $:return el=v._init,r(el(v._payload),T,O,p,X)}}if(el)return X=X(v),el=p===""?"."+Ht(v,0):p,_t(X)?(O="",el!=null&&(O=el.replace(Ta,"$&/")+"/"),r(X,T,O,"",function(Mu){return Mu})):X!=null&&(Mt(X)&&(X=Qa(X,O+(X.key==null||v&&v.key===X.key?"":(""+X.key).replace(Ta,"$&/")+"/")+el)),T.push(X)),1;el=0;var Ql=p===""?".":p+":";if(_t(v))for(var _l=0;_l>>1,yl=r[il];if(0>>1;ilN(O,x))pN(X,O)?(r[il]=X,r[p]=x,il=p):(r[il]=O,r[T]=x,il=T);else if(pN(X,x))r[il]=X,r[p]=x,il=p;else break l}}return _}function N(r,_){var x=r.sortIndex-_.sortIndex;return x!==0?x:r.id-_.id}if(A.unstable_now=void 0,typeof performance=="object"&&typeof performance.now=="function"){var j=performance;A.unstable_now=function(){return j.now()}}else{var ll=Date,bl=ll.now();A.unstable_now=function(){return ll.now()-bl}}var H=[],E=[],$=1,R=null,nl=3,V=!1,F=!1,P=!1,El=!1,rl=typeof setTimeout=="function"?setTimeout:null,bt=typeof clearTimeout=="function"?clearTimeout:null,Sl=typeof setImmediate<"u"?setImmediate:null;function Al(r){for(var _=Y(E);_!==null;){if(_.callback===null)d(E);else if(_.startTime<=r)d(E),_.sortIndex=_.expirationTime,q(H,_);else break;_=Y(E)}}function _t(r){if(P=!1,Al(r),!F)if(Y(H)!==null)F=!0,Vl||(Vl=!0,Kl());else{var _=Y(E);_!==null&&zt(_t,_.startTime-r)}}var Vl=!1,k=-1,Ll=5,Ot=-1;function Qa(){return El?!0:!(A.unstable_now()-Otr&&Qa());){var il=R.callback;if(typeof il=="function"){R.callback=null,nl=R.priorityLevel;var yl=il(R.expirationTime<=r);if(r=A.unstable_now(),typeof yl=="function"){R.callback=yl,Al(r),_=!0;break t}R===Y(H)&&d(H),Al(r)}else d(H);R=Y(H)}if(R!==null)_=!0;else{var v=Y(E);v!==null&&zt(_t,v.startTime-r),_=!1}}break l}finally{R=null,nl=x,V=!1}_=void 0}}finally{_?Kl():Vl=!1}}}var Kl;if(typeof Sl=="function")Kl=function(){Sl(Mt)};else if(typeof MessageChannel<"u"){var Ta=new MessageChannel,Ht=Ta.port2;Ta.port1.onmessage=Mt,Kl=function(){Ht.postMessage(null)}}else Kl=function(){rl(Mt,0)};function zt(r,_){k=rl(function(){r(A.unstable_now())},_)}A.unstable_IdlePriority=5,A.unstable_ImmediatePriority=1,A.unstable_LowPriority=4,A.unstable_NormalPriority=3,A.unstable_Profiling=null,A.unstable_UserBlockingPriority=2,A.unstable_cancelCallback=function(r){r.callback=null},A.unstable_forceFrameRate=function(r){0>r||125il?(r.sortIndex=x,q(E,r),Y(H)===null&&r===Y(E)&&(P?(bt(k),k=-1):P=!0,zt(_t,x-il))):(r.sortIndex=yl,q(H,r),F||V||(F=!0,Vl||(Vl=!0,Kl()))),r},A.unstable_shouldYield=Qa,A.unstable_wrapCallback=function(r){var _=nl;return function(){var x=nl;nl=_;try{return r.apply(this,arguments)}finally{nl=x}}}})(di)),di}var zd;function to(){return zd||(zd=1,vi.exports=lo()),vi.exports}var yi={exports:{}},Xl={};/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Td;function ao(){if(Td)return Xl;Td=1;var A=mi();function q(H){var E="https://react.dev/errors/"+H;if(1"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(A)}catch(q){console.error(q)}}return A(),yi.exports=ao(),yi.exports}/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Ad;function eo(){if(Ad)return ze;Ad=1;var A=to(),q=mi(),Y=uo();function d(l){var t="https://react.dev/errors/"+l;if(1yl||(l.current=il[yl],il[yl]=null,yl--)}function O(l,t){yl++,il[yl]=l.current,l.current=t}var p=v(null),X=v(null),L=v(null),el=v(null);function Ql(l,t){switch(O(L,t),O(X,l),O(p,null),t.nodeType){case 9:case 11:l=(l=t.documentElement)&&(l=l.namespaceURI)?xv(l):0;break;default:if(l=t.tagName,t=t.namespaceURI)t=xv(t),l=Gv(t,l);else switch(l){case"svg":l=1;break;case"math":l=2;break;default:l=0}}T(p),O(p,l)}function _l(){T(p),T(X),T(L)}function Mu(l){l.memoizedState!==null&&O(el,l);var t=p.current,a=Gv(t,l.type);t!==a&&(O(X,l),O(p,a))}function Ee(l){X.current===l&&(T(p),T(X)),el.current===l&&(T(el),he._currentValue=x)}var Zn,oi;function Ea(l){if(Zn===void 0)try{throw Error()}catch(a){var t=a.stack.trim().match(/\n( *(at )?)/);Zn=t&&t[1]||"",oi=-1)":-1e||i[u]!==o[e]){var g=` +`+i[u].replace(" at new "," at ");return l.displayName&&g.includes("")&&(g=g.replace("",l.displayName)),g}while(1<=u&&0<=e);break}}}finally{Vn=!1,Error.prepareStackTrace=a}return(a=l?l.displayName||l.name:"")?Ea(a):""}function Dd(l,t){switch(l.tag){case 26:case 27:case 5:return Ea(l.type);case 16:return Ea("Lazy");case 13:return l.child!==t&&t!==null?Ea("Suspense Fallback"):Ea("Suspense");case 19:return Ea("SuspenseList");case 0:case 15:return Ln(l.type,!1);case 11:return Ln(l.type.render,!1);case 1:return Ln(l.type,!0);case 31:return Ea("Activity");default:return""}}function hi(l){try{var t="",a=null;do t+=Dd(l,a),a=l,l=l.return;while(l);return t}catch(u){return` +Error generating stack: `+u.message+` +`+u.stack}}var Kn=Object.prototype.hasOwnProperty,Jn=A.unstable_scheduleCallback,wn=A.unstable_cancelCallback,pd=A.unstable_shouldYield,Ud=A.unstable_requestPaint,Pl=A.unstable_now,Nd=A.unstable_getCurrentPriorityLevel,Si=A.unstable_ImmediatePriority,gi=A.unstable_UserBlockingPriority,Ae=A.unstable_NormalPriority,Hd=A.unstable_LowPriority,ri=A.unstable_IdlePriority,Rd=A.log,Cd=A.unstable_setDisableYieldValue,Du=null,lt=null;function Ft(l){if(typeof Rd=="function"&&Cd(l),lt&&typeof lt.setStrictMode=="function")try{lt.setStrictMode(Du,l)}catch{}}var tt=Math.clz32?Math.clz32:Bd,jd=Math.log,qd=Math.LN2;function Bd(l){return l>>>=0,l===0?32:31-(jd(l)/qd|0)|0}var _e=256,Oe=262144,Me=4194304;function Aa(l){var t=l&42;if(t!==0)return t;switch(l&-l){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:return l&261888;case 262144:case 524288:case 1048576:case 2097152:return l&3932160;case 4194304:case 8388608:case 16777216:case 33554432:return l&62914560;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return l}}function De(l,t,a){var u=l.pendingLanes;if(u===0)return 0;var e=0,n=l.suspendedLanes,c=l.pingedLanes;l=l.warmLanes;var f=u&134217727;return f!==0?(u=f&~n,u!==0?e=Aa(u):(c&=f,c!==0?e=Aa(c):a||(a=f&~l,a!==0&&(e=Aa(a))))):(f=u&~n,f!==0?e=Aa(f):c!==0?e=Aa(c):a||(a=u&~l,a!==0&&(e=Aa(a)))),e===0?0:t!==0&&t!==e&&(t&n)===0&&(n=e&-e,a=t&-t,n>=a||n===32&&(a&4194048)!==0)?t:e}function pu(l,t){return(l.pendingLanes&~(l.suspendedLanes&~l.pingedLanes)&t)===0}function Yd(l,t){switch(l){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:return-1;case 67108864:case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function bi(){var l=Me;return Me<<=1,(Me&62914560)===0&&(Me=4194304),l}function Wn(l){for(var t=[],a=0;31>a;a++)t.push(l);return t}function Uu(l,t){l.pendingLanes|=t,t!==268435456&&(l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0)}function xd(l,t,a,u,e,n){var c=l.pendingLanes;l.pendingLanes=a,l.suspendedLanes=0,l.pingedLanes=0,l.warmLanes=0,l.expiredLanes&=a,l.entangledLanes&=a,l.errorRecoveryDisabledLanes&=a,l.shellSuspendCounter=0;var f=l.entanglements,i=l.expirationTimes,o=l.hiddenUpdates;for(a=c&~a;0"u")return null;try{return l.activeElement||l.body}catch{return l.body}}var Ld=/[\n"\\]/g;function vt(l){return l.replace(Ld,function(t){return"\\"+t.charCodeAt(0).toString(16)+" "})}function lc(l,t,a,u,e,n,c,f){l.name="",c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"?l.type=c:l.removeAttribute("type"),t!=null?c==="number"?(t===0&&l.value===""||l.value!=t)&&(l.value=""+st(t)):l.value!==""+st(t)&&(l.value=""+st(t)):c!=="submit"&&c!=="reset"||l.removeAttribute("value"),t!=null?tc(l,c,st(t)):a!=null?tc(l,c,st(a)):u!=null&&l.removeAttribute("value"),e==null&&n!=null&&(l.defaultChecked=!!n),e!=null&&(l.checked=e&&typeof e!="function"&&typeof e!="symbol"),f!=null&&typeof f!="function"&&typeof f!="symbol"&&typeof f!="boolean"?l.name=""+st(f):l.removeAttribute("name")}function Ri(l,t,a,u,e,n,c,f){if(n!=null&&typeof n!="function"&&typeof n!="symbol"&&typeof n!="boolean"&&(l.type=n),t!=null||a!=null){if(!(n!=="submit"&&n!=="reset"||t!=null)){Pn(l);return}a=a!=null?""+st(a):"",t=t!=null?""+st(t):a,f||t===l.value||(l.value=t),l.defaultValue=t}u=u??e,u=typeof u!="function"&&typeof u!="symbol"&&!!u,l.checked=f?l.checked:!!u,l.defaultChecked=!!u,c!=null&&typeof c!="function"&&typeof c!="symbol"&&typeof c!="boolean"&&(l.name=c),Pn(l)}function tc(l,t,a){t==="number"&&Ne(l.ownerDocument)===l||l.defaultValue===""+a||(l.defaultValue=""+a)}function wa(l,t,a,u){if(l=l.options,t){t={};for(var e=0;e"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),cc=!1;if(jt)try{var Cu={};Object.defineProperty(Cu,"passive",{get:function(){cc=!0}}),window.addEventListener("test",Cu,Cu),window.removeEventListener("test",Cu,Cu)}catch{cc=!1}var It=null,fc=null,Re=null;function Gi(){if(Re)return Re;var l,t=fc,a=t.length,u,e="value"in It?It.value:It.textContent,n=e.length;for(l=0;l=Bu),Ki=" ",Ji=!1;function wi(l,t){switch(l){case"keyup":return ry.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function Wi(l){return l=l.detail,typeof l=="object"&&"data"in l?l.data:null}var ka=!1;function zy(l,t){switch(l){case"compositionend":return Wi(t);case"keypress":return t.which!==32?null:(Ji=!0,Ki);case"textInput":return l=t.data,l===Ki&&Ji?null:l;default:return null}}function Ty(l,t){if(ka)return l==="compositionend"||!yc&&wi(l,t)?(l=Gi(),Re=fc=It=null,ka=!1,l):null;switch(l){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:a,offset:t-l};l=u}l:{for(;a;){if(a.nextSibling){a=a.nextSibling;break l}a=a.parentNode}a=void 0}a=as(a)}}function es(l,t){return l&&t?l===t?!0:l&&l.nodeType===3?!1:t&&t.nodeType===3?es(l,t.parentNode):"contains"in l?l.contains(t):l.compareDocumentPosition?!!(l.compareDocumentPosition(t)&16):!1:!1}function ns(l){l=l!=null&&l.ownerDocument!=null&&l.ownerDocument.defaultView!=null?l.ownerDocument.defaultView:window;for(var t=Ne(l.document);t instanceof l.HTMLIFrameElement;){try{var a=typeof t.contentWindow.location.href=="string"}catch{a=!1}if(a)l=t.contentWindow;else break;t=Ne(l.document)}return t}function hc(l){var t=l&&l.nodeName&&l.nodeName.toLowerCase();return t&&(t==="input"&&(l.type==="text"||l.type==="search"||l.type==="tel"||l.type==="url"||l.type==="password")||t==="textarea"||l.contentEditable==="true")}var Uy=jt&&"documentMode"in document&&11>=document.documentMode,Ia=null,Sc=null,Xu=null,gc=!1;function cs(l,t,a){var u=a.window===a?a.document:a.nodeType===9?a:a.ownerDocument;gc||Ia==null||Ia!==Ne(u)||(u=Ia,"selectionStart"in u&&hc(u)?u={start:u.selectionStart,end:u.selectionEnd}:(u=(u.ownerDocument&&u.ownerDocument.defaultView||window).getSelection(),u={anchorNode:u.anchorNode,anchorOffset:u.anchorOffset,focusNode:u.focusNode,focusOffset:u.focusOffset}),Xu&&Gu(Xu,u)||(Xu=u,u=Mn(Sc,"onSelect"),0>=c,e-=c,Dt=1<<32-tt(t)+e|a<Z?(W=U,U=null):W=U.sibling;var al=h(y,U,m[Z],b);if(al===null){U===null&&(U=W);break}l&&U&&al.alternate===null&&t(y,U),s=n(al,s,Z),tl===null?C=al:tl.sibling=al,tl=al,U=W}if(Z===m.length)return a(y,U),I&&Bt(y,Z),C;if(U===null){for(;ZZ?(W=U,U=null):W=U.sibling;var za=h(y,U,al.value,b);if(za===null){U===null&&(U=W);break}l&&U&&za.alternate===null&&t(y,U),s=n(za,s,Z),tl===null?C=za:tl.sibling=za,tl=za,U=W}if(al.done)return a(y,U),I&&Bt(y,Z),C;if(U===null){for(;!al.done;Z++,al=m.next())al=z(y,al.value,b),al!==null&&(s=n(al,s,Z),tl===null?C=al:tl.sibling=al,tl=al);return I&&Bt(y,Z),C}for(U=u(U);!al.done;Z++,al=m.next())al=S(U,y,Z,al.value,b),al!==null&&(l&&al.alternate!==null&&U.delete(al.key===null?Z:al.key),s=n(al,s,Z),tl===null?C=al:tl.sibling=al,tl=al);return l&&U.forEach(function($m){return t(y,$m)}),I&&Bt(y,Z),C}function dl(y,s,m,b){if(typeof m=="object"&&m!==null&&m.type===P&&m.key===null&&(m=m.props.children),typeof m=="object"&&m!==null){switch(m.$$typeof){case V:l:{for(var C=m.key;s!==null;){if(s.key===C){if(C=m.type,C===P){if(s.tag===7){a(y,s.sibling),b=e(s,m.props.children),b.return=y,y=b;break l}}else if(s.elementType===C||typeof C=="object"&&C!==null&&C.$$typeof===Ll&&ja(C)===s.type){a(y,s.sibling),b=e(s,m.props),Ju(b,m),b.return=y,y=b;break l}a(y,s);break}else t(y,s);s=s.sibling}m.type===P?(b=Ua(m.props.children,y.mode,b,m.key),b.return=y,y=b):(b=Ze(m.type,m.key,m.props,null,y.mode,b),Ju(b,m),b.return=y,y=b)}return c(y);case F:l:{for(C=m.key;s!==null;){if(s.key===C)if(s.tag===4&&s.stateNode.containerInfo===m.containerInfo&&s.stateNode.implementation===m.implementation){a(y,s.sibling),b=e(s,m.children||[]),b.return=y,y=b;break l}else{a(y,s);break}else t(y,s);s=s.sibling}b=_c(m,y.mode,b),b.return=y,y=b}return c(y);case Ll:return m=ja(m),dl(y,s,m,b)}if(zt(m))return D(y,s,m,b);if(Kl(m)){if(C=Kl(m),typeof C!="function")throw Error(d(150));return m=C.call(m),B(y,s,m,b)}if(typeof m.then=="function")return dl(y,s,$e(m),b);if(m.$$typeof===Sl)return dl(y,s,Ke(y,m),b);Fe(y,m)}return typeof m=="string"&&m!==""||typeof m=="number"||typeof m=="bigint"?(m=""+m,s!==null&&s.tag===6?(a(y,s.sibling),b=e(s,m),b.return=y,y=b):(a(y,s),b=Ac(m,y.mode,b),b.return=y,y=b),c(y)):a(y,s)}return function(y,s,m,b){try{Ku=0;var C=dl(y,s,m,b);return su=null,C}catch(U){if(U===iu||U===we)throw U;var tl=ut(29,U,null,y.mode);return tl.lanes=b,tl.return=y,tl}finally{}}}var Ba=Us(!0),Ns=Us(!1),ua=!1;function Bc(l){l.updateQueue={baseState:l.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function Yc(l,t){l=l.updateQueue,t.updateQueue===l&&(t.updateQueue={baseState:l.baseState,firstBaseUpdate:l.firstBaseUpdate,lastBaseUpdate:l.lastBaseUpdate,shared:l.shared,callbacks:null})}function ea(l){return{lane:l,tag:0,payload:null,callback:null,next:null}}function na(l,t,a){var u=l.updateQueue;if(u===null)return null;if(u=u.shared,(ul&2)!==0){var e=u.pending;return e===null?t.next=t:(t.next=e.next,e.next=t),u.pending=t,t=Qe(l),ms(l,null,a),t}return Xe(l,u,t,a),Qe(l)}function wu(l,t,a){if(t=t.updateQueue,t!==null&&(t=t.shared,(a&4194048)!==0)){var u=t.lanes;u&=l.pendingLanes,a|=u,t.lanes=a,Ti(l,a)}}function xc(l,t){var a=l.updateQueue,u=l.alternate;if(u!==null&&(u=u.updateQueue,a===u)){var e=null,n=null;if(a=a.firstBaseUpdate,a!==null){do{var c={lane:a.lane,tag:a.tag,payload:a.payload,callback:null,next:null};n===null?e=n=c:n=n.next=c,a=a.next}while(a!==null);n===null?e=n=t:n=n.next=t}else e=n=t;a={baseState:u.baseState,firstBaseUpdate:e,lastBaseUpdate:n,shared:u.shared,callbacks:u.callbacks},l.updateQueue=a;return}l=a.lastBaseUpdate,l===null?a.firstBaseUpdate=t:l.next=t,a.lastBaseUpdate=t}var Gc=!1;function Wu(){if(Gc){var l=fu;if(l!==null)throw l}}function $u(l,t,a,u){Gc=!1;var e=l.updateQueue;ua=!1;var n=e.firstBaseUpdate,c=e.lastBaseUpdate,f=e.shared.pending;if(f!==null){e.shared.pending=null;var i=f,o=i.next;i.next=null,c===null?n=o:c.next=o,c=i;var g=l.alternate;g!==null&&(g=g.updateQueue,f=g.lastBaseUpdate,f!==c&&(f===null?g.firstBaseUpdate=o:f.next=o,g.lastBaseUpdate=i))}if(n!==null){var z=e.baseState;c=0,g=o=i=null,f=n;do{var h=f.lane&-536870913,S=h!==f.lane;if(S?(w&h)===h:(u&h)===h){h!==0&&h===cu&&(Gc=!0),g!==null&&(g=g.next={lane:0,tag:f.tag,payload:f.payload,callback:null,next:null});l:{var D=l,B=f;h=t;var dl=a;switch(B.tag){case 1:if(D=B.payload,typeof D=="function"){z=D.call(dl,z,h);break l}z=D;break l;case 3:D.flags=D.flags&-65537|128;case 0:if(D=B.payload,h=typeof D=="function"?D.call(dl,z,h):D,h==null)break l;z=R({},z,h);break l;case 2:ua=!0}}h=f.callback,h!==null&&(l.flags|=64,S&&(l.flags|=8192),S=e.callbacks,S===null?e.callbacks=[h]:S.push(h))}else S={lane:h,tag:f.tag,payload:f.payload,callback:f.callback,next:null},g===null?(o=g=S,i=z):g=g.next=S,c|=h;if(f=f.next,f===null){if(f=e.shared.pending,f===null)break;S=f,f=S.next,S.next=null,e.lastBaseUpdate=S,e.shared.pending=null}}while(!0);g===null&&(i=z),e.baseState=i,e.firstBaseUpdate=o,e.lastBaseUpdate=g,n===null&&(e.shared.lanes=0),va|=c,l.lanes=c,l.memoizedState=z}}function Hs(l,t){if(typeof l!="function")throw Error(d(191,l));l.call(t)}function Rs(l,t){var a=l.callbacks;if(a!==null)for(l.callbacks=null,l=0;ln?n:8;var c=r.T,f={};r.T=f,ef(l,!1,t,a);try{var i=e(),o=r.S;if(o!==null&&o(f,i),i!==null&&typeof i=="object"&&typeof i.then=="function"){var g=xy(i,u);Iu(l,t,g,it(l))}else Iu(l,t,u,it(l))}catch(z){Iu(l,t,{then:function(){},status:"rejected",reason:z},it())}finally{_.p=n,c!==null&&f.types!==null&&(c.types=f.types),r.T=c}}function Ly(){}function af(l,t,a,u){if(l.tag!==5)throw Error(d(476));var e=v0(l).queue;s0(l,e,t,x,a===null?Ly:function(){return d0(l),a(u)})}function v0(l){var t=l.memoizedState;if(t!==null)return t;t={memoizedState:x,baseState:x,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Xt,lastRenderedState:x},next:null};var a={};return t.next={memoizedState:a,baseState:a,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Xt,lastRenderedState:a},next:null},l.memoizedState=t,l=l.alternate,l!==null&&(l.memoizedState=t),t}function d0(l){var t=v0(l);t.next===null&&(t=l.alternate.memoizedState),Iu(l,t.next.queue,{},it())}function uf(){return Yl(he)}function y0(){return Ml().memoizedState}function m0(){return Ml().memoizedState}function Ky(l){for(var t=l.return;t!==null;){switch(t.tag){case 24:case 3:var a=it();l=ea(a);var u=na(t,l,a);u!==null&&(Il(u,t,a),wu(u,t,a)),t={cache:Rc()},l.payload=t;return}t=t.return}}function Jy(l,t,a){var u=it();a={lane:u,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null},cn(l)?h0(t,a):(a=Tc(l,t,a,u),a!==null&&(Il(a,l,u),S0(a,t,u)))}function o0(l,t,a){var u=it();Iu(l,t,a,u)}function Iu(l,t,a,u){var e={lane:u,revertLane:0,gesture:null,action:a,hasEagerState:!1,eagerState:null,next:null};if(cn(l))h0(t,e);else{var n=l.alternate;if(l.lanes===0&&(n===null||n.lanes===0)&&(n=t.lastRenderedReducer,n!==null))try{var c=t.lastRenderedState,f=n(c,a);if(e.hasEagerState=!0,e.eagerState=f,at(f,c))return Xe(l,t,e,0),ml===null&&Ge(),!1}catch{}finally{}if(a=Tc(l,t,e,u),a!==null)return Il(a,l,u),S0(a,t,u),!0}return!1}function ef(l,t,a,u){if(u={lane:2,revertLane:Yf(),gesture:null,action:u,hasEagerState:!1,eagerState:null,next:null},cn(l)){if(t)throw Error(d(479))}else t=Tc(l,a,u,2),t!==null&&Il(t,l,2)}function cn(l){var t=l.alternate;return l===Q||t!==null&&t===Q}function h0(l,t){du=Pe=!0;var a=l.pending;a===null?t.next=t:(t.next=a.next,a.next=t),l.pending=t}function S0(l,t,a){if((a&4194048)!==0){var u=t.lanes;u&=l.pendingLanes,a|=u,t.lanes=a,Ti(l,a)}}var Pu={readContext:Yl,use:an,useCallback:zl,useContext:zl,useEffect:zl,useImperativeHandle:zl,useLayoutEffect:zl,useInsertionEffect:zl,useMemo:zl,useReducer:zl,useRef:zl,useState:zl,useDebugValue:zl,useDeferredValue:zl,useTransition:zl,useSyncExternalStore:zl,useId:zl,useHostTransitionStatus:zl,useFormState:zl,useActionState:zl,useOptimistic:zl,useMemoCache:zl,useCacheRefresh:zl};Pu.useEffectEvent=zl;var g0={readContext:Yl,use:an,useCallback:function(l,t){return Zl().memoizedState=[l,t===void 0?null:t],l},useContext:Yl,useEffect:l0,useImperativeHandle:function(l,t,a){a=a!=null?a.concat([l]):null,en(4194308,4,e0.bind(null,t,l),a)},useLayoutEffect:function(l,t){return en(4194308,4,l,t)},useInsertionEffect:function(l,t){en(4,2,l,t)},useMemo:function(l,t){var a=Zl();t=t===void 0?null:t;var u=l();if(Ya){Ft(!0);try{l()}finally{Ft(!1)}}return a.memoizedState=[u,t],u},useReducer:function(l,t,a){var u=Zl();if(a!==void 0){var e=a(t);if(Ya){Ft(!0);try{a(t)}finally{Ft(!1)}}}else e=t;return u.memoizedState=u.baseState=e,l={pending:null,lanes:0,dispatch:null,lastRenderedReducer:l,lastRenderedState:e},u.queue=l,l=l.dispatch=Jy.bind(null,Q,l),[u.memoizedState,l]},useRef:function(l){var t=Zl();return l={current:l},t.memoizedState=l},useState:function(l){l=kc(l);var t=l.queue,a=o0.bind(null,Q,t);return t.dispatch=a,[l.memoizedState,a]},useDebugValue:lf,useDeferredValue:function(l,t){var a=Zl();return tf(a,l,t)},useTransition:function(){var l=kc(!1);return l=s0.bind(null,Q,l.queue,!0,!1),Zl().memoizedState=l,[!1,l]},useSyncExternalStore:function(l,t,a){var u=Q,e=Zl();if(I){if(a===void 0)throw Error(d(407));a=a()}else{if(a=t(),ml===null)throw Error(d(349));(w&127)!==0||xs(u,t,a)}e.memoizedState=a;var n={value:a,getSnapshot:t};return e.queue=n,l0(Xs.bind(null,u,n,l),[l]),u.flags|=2048,mu(9,{destroy:void 0},Gs.bind(null,u,n,a,t),null),a},useId:function(){var l=Zl(),t=ml.identifierPrefix;if(I){var a=pt,u=Dt;a=(u&~(1<<32-tt(u)-1)).toString(32)+a,t="_"+t+"R_"+a,a=ln++,0<\/script>",n=n.removeChild(n.firstChild);break;case"select":n=typeof u.is=="string"?c.createElement("select",{is:u.is}):c.createElement("select"),u.multiple?n.multiple=!0:u.size&&(n.size=u.size);break;default:n=typeof u.is=="string"?c.createElement(e,{is:u.is}):c.createElement(e)}}n[ql]=t,n[Jl]=u;l:for(c=t.child;c!==null;){if(c.tag===5||c.tag===6)n.appendChild(c.stateNode);else if(c.tag!==4&&c.tag!==27&&c.child!==null){c.child.return=c,c=c.child;continue}if(c===t)break l;for(;c.sibling===null;){if(c.return===null||c.return===t)break l;c=c.return}c.sibling.return=c.return,c=c.sibling}t.stateNode=n;l:switch(Gl(n,e,u),e){case"button":case"input":case"select":case"textarea":u=!!u.autoFocus;break l;case"img":u=!0;break l;default:u=!1}u&&Zt(t)}}return hl(t),bf(t,t.type,l===null?null:l.memoizedProps,t.pendingProps,a),null;case 6:if(l&&t.stateNode!=null)l.memoizedProps!==u&&Zt(t);else{if(typeof u!="string"&&t.stateNode===null)throw Error(d(166));if(l=L.current,eu(t)){if(l=t.stateNode,a=t.memoizedProps,u=null,e=Bl,e!==null)switch(e.tag){case 27:case 5:u=e.memoizedProps}l[ql]=t,l=!!(l.nodeValue===a||u!==null&&u.suppressHydrationWarning===!0||Bv(l.nodeValue,a)),l||ta(t,!0)}else l=Dn(l).createTextNode(u),l[ql]=t,t.stateNode=l}return hl(t),null;case 31:if(a=t.memoizedState,l===null||l.memoizedState!==null){if(u=eu(t),a!==null){if(l===null){if(!u)throw Error(d(318));if(l=t.memoizedState,l=l!==null?l.dehydrated:null,!l)throw Error(d(557));l[ql]=t}else Na(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;hl(t),l=!1}else a=pc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=a),l=!0;if(!l)return t.flags&256?(nt(t),t):(nt(t),null);if((t.flags&128)!==0)throw Error(d(558))}return hl(t),null;case 13:if(u=t.memoizedState,l===null||l.memoizedState!==null&&l.memoizedState.dehydrated!==null){if(e=eu(t),u!==null&&u.dehydrated!==null){if(l===null){if(!e)throw Error(d(318));if(e=t.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(d(317));e[ql]=t}else Na(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;hl(t),e=!1}else e=pc(),l!==null&&l.memoizedState!==null&&(l.memoizedState.hydrationErrors=e),e=!0;if(!e)return t.flags&256?(nt(t),t):(nt(t),null)}return nt(t),(t.flags&128)!==0?(t.lanes=a,t):(a=u!==null,l=l!==null&&l.memoizedState!==null,a&&(u=t.child,e=null,u.alternate!==null&&u.alternate.memoizedState!==null&&u.alternate.memoizedState.cachePool!==null&&(e=u.alternate.memoizedState.cachePool.pool),n=null,u.memoizedState!==null&&u.memoizedState.cachePool!==null&&(n=u.memoizedState.cachePool.pool),n!==e&&(u.flags|=2048)),a!==l&&a&&(t.child.flags|=8192),yn(t,t.updateQueue),hl(t),null);case 4:return _l(),l===null&&Qf(t.stateNode.containerInfo),hl(t),null;case 10:return xt(t.type),hl(t),null;case 19:if(T(Ol),u=t.memoizedState,u===null)return hl(t),null;if(e=(t.flags&128)!==0,n=u.rendering,n===null)if(e)te(u,!1);else{if(Tl!==0||l!==null&&(l.flags&128)!==0)for(l=t.child;l!==null;){if(n=Ie(l),n!==null){for(t.flags|=128,te(u,!1),l=n.updateQueue,t.updateQueue=l,yn(t,l),t.subtreeFlags=0,l=a,a=t.child;a!==null;)os(a,l),a=a.sibling;return O(Ol,Ol.current&1|2),I&&Bt(t,u.treeForkCount),t.child}l=l.sibling}u.tail!==null&&Pl()>gn&&(t.flags|=128,e=!0,te(u,!1),t.lanes=4194304)}else{if(!e)if(l=Ie(n),l!==null){if(t.flags|=128,e=!0,l=l.updateQueue,t.updateQueue=l,yn(t,l),te(u,!0),u.tail===null&&u.tailMode==="hidden"&&!n.alternate&&!I)return hl(t),null}else 2*Pl()-u.renderingStartTime>gn&&a!==536870912&&(t.flags|=128,e=!0,te(u,!1),t.lanes=4194304);u.isBackwards?(n.sibling=t.child,t.child=n):(l=u.last,l!==null?l.sibling=n:t.child=n,u.last=n)}return u.tail!==null?(l=u.tail,u.rendering=l,u.tail=l.sibling,u.renderingStartTime=Pl(),l.sibling=null,a=Ol.current,O(Ol,e?a&1|2:a&1),I&&Bt(t,u.treeForkCount),l):(hl(t),null);case 22:case 23:return nt(t),Qc(),u=t.memoizedState!==null,l!==null?l.memoizedState!==null!==u&&(t.flags|=8192):u&&(t.flags|=8192),u?(a&536870912)!==0&&(t.flags&128)===0&&(hl(t),t.subtreeFlags&6&&(t.flags|=8192)):hl(t),a=t.updateQueue,a!==null&&yn(t,a.retryQueue),a=null,l!==null&&l.memoizedState!==null&&l.memoizedState.cachePool!==null&&(a=l.memoizedState.cachePool.pool),u=null,t.memoizedState!==null&&t.memoizedState.cachePool!==null&&(u=t.memoizedState.cachePool.pool),u!==a&&(t.flags|=2048),l!==null&&T(Ca),null;case 24:return a=null,l!==null&&(a=l.memoizedState.cache),t.memoizedState.cache!==a&&(t.flags|=2048),xt(pl),hl(t),null;case 25:return null;case 30:return null}throw Error(d(156,t.tag))}function ky(l,t){switch(Mc(t),t.tag){case 1:return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 3:return xt(pl),_l(),l=t.flags,(l&65536)!==0&&(l&128)===0?(t.flags=l&-65537|128,t):null;case 26:case 27:case 5:return Ee(t),null;case 31:if(t.memoizedState!==null){if(nt(t),t.alternate===null)throw Error(d(340));Na()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 13:if(nt(t),l=t.memoizedState,l!==null&&l.dehydrated!==null){if(t.alternate===null)throw Error(d(340));Na()}return l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 19:return T(Ol),null;case 4:return _l(),null;case 10:return xt(t.type),null;case 22:case 23:return nt(t),Qc(),l!==null&&T(Ca),l=t.flags,l&65536?(t.flags=l&-65537|128,t):null;case 24:return xt(pl),null;case 25:return null;default:return null}}function Q0(l,t){switch(Mc(t),t.tag){case 3:xt(pl),_l();break;case 26:case 27:case 5:Ee(t);break;case 4:_l();break;case 31:t.memoizedState!==null&&nt(t);break;case 13:nt(t);break;case 19:T(Ol);break;case 10:xt(t.type);break;case 22:case 23:nt(t),Qc(),l!==null&&T(Ca);break;case 24:xt(pl)}}function ae(l,t){try{var a=t.updateQueue,u=a!==null?a.lastEffect:null;if(u!==null){var e=u.next;a=e;do{if((a.tag&l)===l){u=void 0;var n=a.create,c=a.inst;u=n(),c.destroy=u}a=a.next}while(a!==e)}}catch(f){fl(t,t.return,f)}}function ia(l,t,a){try{var u=t.updateQueue,e=u!==null?u.lastEffect:null;if(e!==null){var n=e.next;u=n;do{if((u.tag&l)===l){var c=u.inst,f=c.destroy;if(f!==void 0){c.destroy=void 0,e=t;var i=a,o=f;try{o()}catch(g){fl(e,i,g)}}}u=u.next}while(u!==n)}}catch(g){fl(t,t.return,g)}}function Z0(l){var t=l.updateQueue;if(t!==null){var a=l.stateNode;try{Rs(t,a)}catch(u){fl(l,l.return,u)}}}function V0(l,t,a){a.props=xa(l.type,l.memoizedProps),a.state=l.memoizedState;try{a.componentWillUnmount()}catch(u){fl(l,t,u)}}function ue(l,t){try{var a=l.ref;if(a!==null){switch(l.tag){case 26:case 27:case 5:var u=l.stateNode;break;case 30:u=l.stateNode;break;default:u=l.stateNode}typeof a=="function"?l.refCleanup=a(u):a.current=u}}catch(e){fl(l,t,e)}}function Ut(l,t){var a=l.ref,u=l.refCleanup;if(a!==null)if(typeof u=="function")try{u()}catch(e){fl(l,t,e)}finally{l.refCleanup=null,l=l.alternate,l!=null&&(l.refCleanup=null)}else if(typeof a=="function")try{a(null)}catch(e){fl(l,t,e)}else a.current=null}function L0(l){var t=l.type,a=l.memoizedProps,u=l.stateNode;try{l:switch(t){case"button":case"input":case"select":case"textarea":a.autoFocus&&u.focus();break l;case"img":a.src?u.src=a.src:a.srcSet&&(u.srcset=a.srcSet)}}catch(e){fl(l,l.return,e)}}function zf(l,t,a){try{var u=l.stateNode;bm(u,l.type,a,t),u[Jl]=t}catch(e){fl(l,l.return,e)}}function K0(l){return l.tag===5||l.tag===3||l.tag===26||l.tag===27&&ha(l.type)||l.tag===4}function Tf(l){l:for(;;){for(;l.sibling===null;){if(l.return===null||K0(l.return))return null;l=l.return}for(l.sibling.return=l.return,l=l.sibling;l.tag!==5&&l.tag!==6&&l.tag!==18;){if(l.tag===27&&ha(l.type)||l.flags&2||l.child===null||l.tag===4)continue l;l.child.return=l,l=l.child}if(!(l.flags&2))return l.stateNode}}function Ef(l,t,a){var u=l.tag;if(u===5||u===6)l=l.stateNode,t?(a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a).insertBefore(l,t):(t=a.nodeType===9?a.body:a.nodeName==="HTML"?a.ownerDocument.body:a,t.appendChild(l),a=a._reactRootContainer,a!=null||t.onclick!==null||(t.onclick=Ct));else if(u!==4&&(u===27&&ha(l.type)&&(a=l.stateNode,t=null),l=l.child,l!==null))for(Ef(l,t,a),l=l.sibling;l!==null;)Ef(l,t,a),l=l.sibling}function mn(l,t,a){var u=l.tag;if(u===5||u===6)l=l.stateNode,t?a.insertBefore(l,t):a.appendChild(l);else if(u!==4&&(u===27&&ha(l.type)&&(a=l.stateNode),l=l.child,l!==null))for(mn(l,t,a),l=l.sibling;l!==null;)mn(l,t,a),l=l.sibling}function J0(l){var t=l.stateNode,a=l.memoizedProps;try{for(var u=l.type,e=t.attributes;e.length;)t.removeAttributeNode(e[0]);Gl(t,u,a),t[ql]=l,t[Jl]=a}catch(n){fl(l,l.return,n)}}var Vt=!1,Hl=!1,Af=!1,w0=typeof WeakSet=="function"?WeakSet:Set,jl=null;function Iy(l,t){if(l=l.containerInfo,Lf=jn,l=ns(l),hc(l)){if("selectionStart"in l)var a={start:l.selectionStart,end:l.selectionEnd};else l:{a=(a=l.ownerDocument)&&a.defaultView||window;var u=a.getSelection&&a.getSelection();if(u&&u.rangeCount!==0){a=u.anchorNode;var e=u.anchorOffset,n=u.focusNode;u=u.focusOffset;try{a.nodeType,n.nodeType}catch{a=null;break l}var c=0,f=-1,i=-1,o=0,g=0,z=l,h=null;t:for(;;){for(var S;z!==a||e!==0&&z.nodeType!==3||(f=c+e),z!==n||u!==0&&z.nodeType!==3||(i=c+u),z.nodeType===3&&(c+=z.nodeValue.length),(S=z.firstChild)!==null;)h=z,z=S;for(;;){if(z===l)break t;if(h===a&&++o===e&&(f=c),h===n&&++g===u&&(i=c),(S=z.nextSibling)!==null)break;z=h,h=z.parentNode}z=S}a=f===-1||i===-1?null:{start:f,end:i}}else a=null}a=a||{start:0,end:0}}else a=null;for(Kf={focusedElem:l,selectionRange:a},jn=!1,jl=t;jl!==null;)if(t=jl,l=t.child,(t.subtreeFlags&1028)!==0&&l!==null)l.return=t,jl=l;else for(;jl!==null;){switch(t=jl,n=t.alternate,l=t.flags,t.tag){case 0:if((l&4)!==0&&(l=t.updateQueue,l=l!==null?l.events:null,l!==null))for(a=0;a title"))),Gl(n,u,a),n[ql]=l,Cl(n),u=n;break l;case"link":var c=Pv("link","href",e).get(u+(a.href||""));if(c){for(var f=0;fdl&&(c=dl,dl=B,B=c);var y=us(f,B),s=us(f,dl);if(y&&s&&(S.rangeCount!==1||S.anchorNode!==y.node||S.anchorOffset!==y.offset||S.focusNode!==s.node||S.focusOffset!==s.offset)){var m=z.createRange();m.setStart(y.node,y.offset),S.removeAllRanges(),B>dl?(S.addRange(m),S.extend(s.node,s.offset)):(m.setEnd(s.node,s.offset),S.addRange(m))}}}}for(z=[],S=f;S=S.parentNode;)S.nodeType===1&&z.push({element:S,left:S.scrollLeft,top:S.scrollTop});for(typeof f.focus=="function"&&f.focus(),f=0;fa?32:a,r.T=null,a=Nf,Nf=null;var n=ya,c=Wt;if(Rl=0,ru=ya=null,Wt=0,(ul&6)!==0)throw Error(d(331));var f=ul;if(ul|=4,ev(n.current),tv(n,n.current,c,a),ul=f,se(0,!1),lt&&typeof lt.onPostCommitFiberRoot=="function")try{lt.onPostCommitFiberRoot(Du,n)}catch{}return!0}finally{_.p=e,r.T=u,Ev(l,t)}}function _v(l,t,a){t=yt(a,t),t=sf(l.stateNode,t,2),l=na(l,t,2),l!==null&&(Uu(l,2),Nt(l))}function fl(l,t,a){if(l.tag===3)_v(l,l,a);else for(;t!==null;){if(t.tag===3){_v(t,l,a);break}else if(t.tag===1){var u=t.stateNode;if(typeof t.type.getDerivedStateFromError=="function"||typeof u.componentDidCatch=="function"&&(da===null||!da.has(u))){l=yt(a,l),a=O0(2),u=na(t,a,2),u!==null&&(M0(a,u,t,l),Uu(u,2),Nt(u));break}}t=t.return}}function jf(l,t,a){var u=l.pingCache;if(u===null){u=l.pingCache=new tm;var e=new Set;u.set(t,e)}else e=u.get(t),e===void 0&&(e=new Set,u.set(t,e));e.has(a)||(Mf=!0,e.add(a),l=cm.bind(null,l,t,a),t.then(l,l))}function cm(l,t,a){var u=l.pingCache;u!==null&&u.delete(t),l.pingedLanes|=l.suspendedLanes&a,l.warmLanes&=~a,ml===l&&(w&a)===a&&(Tl===4||Tl===3&&(w&62914560)===w&&300>Pl()-Sn?(ul&2)===0&&bu(l,0):Df|=a,gu===w&&(gu=0)),Nt(l)}function Ov(l,t){t===0&&(t=bi()),l=pa(l,t),l!==null&&(Uu(l,t),Nt(l))}function fm(l){var t=l.memoizedState,a=0;t!==null&&(a=t.retryLane),Ov(l,a)}function im(l,t){var a=0;switch(l.tag){case 31:case 13:var u=l.stateNode,e=l.memoizedState;e!==null&&(a=e.retryLane);break;case 19:u=l.stateNode;break;case 22:u=l.stateNode._retryCache;break;default:throw Error(d(314))}u!==null&&u.delete(t),Ov(l,a)}function sm(l,t){return Jn(l,t)}var An=null,Tu=null,qf=!1,_n=!1,Bf=!1,oa=0;function Nt(l){l!==Tu&&l.next===null&&(Tu===null?An=Tu=l:Tu=Tu.next=l),_n=!0,qf||(qf=!0,dm())}function se(l,t){if(!Bf&&_n){Bf=!0;do for(var a=!1,u=An;u!==null;){if(l!==0){var e=u.pendingLanes;if(e===0)var n=0;else{var c=u.suspendedLanes,f=u.pingedLanes;n=(1<<31-tt(42|l)+1)-1,n&=e&~(c&~f),n=n&201326741?n&201326741|1:n?n|2:0}n!==0&&(a=!0,Uv(u,n))}else n=w,n=De(u,u===ml?n:0,u.cancelPendingCommit!==null||u.timeoutHandle!==-1),(n&3)===0||pu(u,n)||(a=!0,Uv(u,n));u=u.next}while(a);Bf=!1}}function vm(){Mv()}function Mv(){_n=qf=!1;var l=0;oa!==0&&Tm()&&(l=oa);for(var t=Pl(),a=null,u=An;u!==null;){var e=u.next,n=Dv(u,t);n===0?(u.next=null,a===null?An=e:a.next=e,e===null&&(Tu=a)):(a=u,(l!==0||(n&3)!==0)&&(_n=!0)),u=e}Rl!==0&&Rl!==5||se(l),oa!==0&&(oa=0)}function Dv(l,t){for(var a=l.suspendedLanes,u=l.pingedLanes,e=l.expirationTimes,n=l.pendingLanes&-62914561;0f)break;var g=i.transferSize,z=i.initiatorType;g&&Yv(z)&&(i=i.responseEnd,c+=g*(i"u"?null:document;function $v(l,t,a){var u=Eu;if(u&&typeof t=="string"&&t){var e=vt(t);e='link[rel="'+l+'"][href="'+e+'"]',typeof a=="string"&&(e+='[crossorigin="'+a+'"]'),Wv.has(e)||(Wv.add(e),l={rel:l,crossOrigin:a,href:t},u.querySelector(e)===null&&(t=u.createElement("link"),Gl(t,"link",l),Cl(t),u.head.appendChild(t)))}}function Nm(l){$t.D(l),$v("dns-prefetch",l,null)}function Hm(l,t){$t.C(l,t),$v("preconnect",l,t)}function Rm(l,t,a){$t.L(l,t,a);var u=Eu;if(u&&l&&t){var e='link[rel="preload"][as="'+vt(t)+'"]';t==="image"&&a&&a.imageSrcSet?(e+='[imagesrcset="'+vt(a.imageSrcSet)+'"]',typeof a.imageSizes=="string"&&(e+='[imagesizes="'+vt(a.imageSizes)+'"]')):e+='[href="'+vt(l)+'"]';var n=e;switch(t){case"style":n=Au(l);break;case"script":n=_u(l)}rt.has(n)||(l=R({rel:"preload",href:t==="image"&&a&&a.imageSrcSet?void 0:l,as:t},a),rt.set(n,l),u.querySelector(e)!==null||t==="style"&&u.querySelector(me(n))||t==="script"&&u.querySelector(oe(n))||(t=u.createElement("link"),Gl(t,"link",l),Cl(t),u.head.appendChild(t)))}}function Cm(l,t){$t.m(l,t);var a=Eu;if(a&&l){var u=t&&typeof t.as=="string"?t.as:"script",e='link[rel="modulepreload"][as="'+vt(u)+'"][href="'+vt(l)+'"]',n=e;switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":n=_u(l)}if(!rt.has(n)&&(l=R({rel:"modulepreload",href:l},t),rt.set(n,l),a.querySelector(e)===null)){switch(u){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(a.querySelector(oe(n)))return}u=a.createElement("link"),Gl(u,"link",l),Cl(u),a.head.appendChild(u)}}}function jm(l,t,a){$t.S(l,t,a);var u=Eu;if(u&&l){var e=Ka(u).hoistableStyles,n=Au(l);t=t||"default";var c=e.get(n);if(!c){var f={loading:0,preload:null};if(c=u.querySelector(me(n)))f.loading=5;else{l=R({rel:"stylesheet",href:l,"data-precedence":t},a),(a=rt.get(n))&&If(l,a);var i=c=u.createElement("link");Cl(i),Gl(i,"link",l),i._p=new Promise(function(o,g){i.onload=o,i.onerror=g}),i.addEventListener("load",function(){f.loading|=1}),i.addEventListener("error",function(){f.loading|=2}),f.loading|=4,Un(c,t,u)}c={type:"stylesheet",instance:c,count:1,state:f},e.set(n,c)}}}function qm(l,t){$t.X(l,t);var a=Eu;if(a&&l){var u=Ka(a).hoistableScripts,e=_u(l),n=u.get(e);n||(n=a.querySelector(oe(e)),n||(l=R({src:l,async:!0},t),(t=rt.get(e))&&Pf(l,t),n=a.createElement("script"),Cl(n),Gl(n,"link",l),a.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(e,n))}}function Bm(l,t){$t.M(l,t);var a=Eu;if(a&&l){var u=Ka(a).hoistableScripts,e=_u(l),n=u.get(e);n||(n=a.querySelector(oe(e)),n||(l=R({src:l,async:!0,type:"module"},t),(t=rt.get(e))&&Pf(l,t),n=a.createElement("script"),Cl(n),Gl(n,"link",l),a.head.appendChild(n)),n={type:"script",instance:n,count:1,state:null},u.set(e,n))}}function Fv(l,t,a,u){var e=(e=L.current)?pn(e):null;if(!e)throw Error(d(446));switch(l){case"meta":case"title":return null;case"style":return typeof a.precedence=="string"&&typeof a.href=="string"?(t=Au(a.href),a=Ka(e).hoistableStyles,u=a.get(t),u||(u={type:"style",instance:null,count:0,state:null},a.set(t,u)),u):{type:"void",instance:null,count:0,state:null};case"link":if(a.rel==="stylesheet"&&typeof a.href=="string"&&typeof a.precedence=="string"){l=Au(a.href);var n=Ka(e).hoistableStyles,c=n.get(l);if(c||(e=e.ownerDocument||e,c={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},n.set(l,c),(n=e.querySelector(me(l)))&&!n._p&&(c.instance=n,c.state.loading=5),rt.has(l)||(a={rel:"preload",as:"style",href:a.href,crossOrigin:a.crossOrigin,integrity:a.integrity,media:a.media,hrefLang:a.hrefLang,referrerPolicy:a.referrerPolicy},rt.set(l,a),n||Ym(e,l,a,c.state))),t&&u===null)throw Error(d(528,""));return c}if(t&&u!==null)throw Error(d(529,""));return null;case"script":return t=a.async,a=a.src,typeof a=="string"&&t&&typeof t!="function"&&typeof t!="symbol"?(t=_u(a),a=Ka(e).hoistableScripts,u=a.get(t),u||(u={type:"script",instance:null,count:0,state:null},a.set(t,u)),u):{type:"void",instance:null,count:0,state:null};default:throw Error(d(444,l))}}function Au(l){return'href="'+vt(l)+'"'}function me(l){return'link[rel="stylesheet"]['+l+"]"}function kv(l){return R({},l,{"data-precedence":l.precedence,precedence:null})}function Ym(l,t,a,u){l.querySelector('link[rel="preload"][as="style"]['+t+"]")?u.loading=1:(t=l.createElement("link"),u.preload=t,t.addEventListener("load",function(){return u.loading|=1}),t.addEventListener("error",function(){return u.loading|=2}),Gl(t,"link",a),Cl(t),l.head.appendChild(t))}function _u(l){return'[src="'+vt(l)+'"]'}function oe(l){return"script[async]"+l}function Iv(l,t,a){if(t.count++,t.instance===null)switch(t.type){case"style":var u=l.querySelector('style[data-href~="'+vt(a.href)+'"]');if(u)return t.instance=u,Cl(u),u;var e=R({},a,{"data-href":a.href,"data-precedence":a.precedence,href:null,precedence:null});return u=(l.ownerDocument||l).createElement("style"),Cl(u),Gl(u,"style",e),Un(u,a.precedence,l),t.instance=u;case"stylesheet":e=Au(a.href);var n=l.querySelector(me(e));if(n)return t.state.loading|=4,t.instance=n,Cl(n),n;u=kv(a),(e=rt.get(e))&&If(u,e),n=(l.ownerDocument||l).createElement("link"),Cl(n);var c=n;return c._p=new Promise(function(f,i){c.onload=f,c.onerror=i}),Gl(n,"link",u),t.state.loading|=4,Un(n,a.precedence,l),t.instance=n;case"script":return n=_u(a.src),(e=l.querySelector(oe(n)))?(t.instance=e,Cl(e),e):(u=a,(e=rt.get(n))&&(u=R({},a),Pf(u,e)),l=l.ownerDocument||l,e=l.createElement("script"),Cl(e),Gl(e,"link",u),l.head.appendChild(e),t.instance=e);case"void":return null;default:throw Error(d(443,t.type))}else t.type==="stylesheet"&&(t.state.loading&4)===0&&(u=t.instance,t.state.loading|=4,Un(u,a.precedence,l));return t.instance}function Un(l,t,a){for(var u=a.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),e=u.length?u[u.length-1]:null,n=e,c=0;c title"):null)}function xm(l,t,a){if(a===1||t.itemProp!=null)return!1;switch(l){case"meta":case"title":return!0;case"style":if(typeof t.precedence!="string"||typeof t.href!="string"||t.href==="")break;return!0;case"link":if(typeof t.rel!="string"||typeof t.href!="string"||t.href===""||t.onLoad||t.onError)break;switch(t.rel){case"stylesheet":return l=t.disabled,typeof t.precedence=="string"&&l==null;default:return!0}case"script":if(t.async&&typeof t.async!="function"&&typeof t.async!="symbol"&&!t.onLoad&&!t.onError&&t.src&&typeof t.src=="string")return!0}return!1}function td(l){return!(l.type==="stylesheet"&&(l.state.loading&3)===0)}function Gm(l,t,a,u){if(a.type==="stylesheet"&&(typeof u.media!="string"||matchMedia(u.media).matches!==!1)&&(a.state.loading&4)===0){if(a.instance===null){var e=Au(u.href),n=t.querySelector(me(e));if(n){t=n._p,t!==null&&typeof t=="object"&&typeof t.then=="function"&&(l.count++,l=Hn.bind(l),t.then(l,l)),a.state.loading|=4,a.instance=n,Cl(n);return}n=t.ownerDocument||t,u=kv(u),(e=rt.get(e))&&If(u,e),n=n.createElement("link"),Cl(n);var c=n;c._p=new Promise(function(f,i){c.onload=f,c.onerror=i}),Gl(n,"link",u),a.instance=n}l.stylesheets===null&&(l.stylesheets=new Map),l.stylesheets.set(a,t),(t=a.state.preload)&&(a.state.loading&3)===0&&(l.count++,a=Hn.bind(l),t.addEventListener("load",a),t.addEventListener("error",a))}}var li=0;function Xm(l,t){return l.stylesheets&&l.count===0&&Cn(l,l.stylesheets),0li?50:800)+t);return l.unsuspend=a,function(){l.unsuspend=null,clearTimeout(u),clearTimeout(e)}}:null}function Hn(){if(this.count--,this.count===0&&(this.imgCount===0||!this.waitingForImages)){if(this.stylesheets)Cn(this,this.stylesheets);else if(this.unsuspend){var l=this.unsuspend;this.unsuspend=null,l()}}}var Rn=null;function Cn(l,t){l.stylesheets=null,l.unsuspend!==null&&(l.count++,Rn=new Map,t.forEach(Qm,l),Rn=null,Hn.call(l))}function Qm(l,t){if(!(t.state.loading&4)){var a=Rn.get(l);if(a)var u=a.get(null);else{a=new Map,Rn.set(l,a);for(var e=l.querySelectorAll("link[data-precedence],style[data-precedence]"),n=0;n"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(A)}catch(q){console.error(q)}}return A(),si.exports=eo(),si.exports}var co=no();const fo=({children:A})=>M.jsxs("div",{className:"dashboard",children:[M.jsxs("header",{className:"dashboard-header",children:[M.jsx("h1",{className:"dashboard-title",children:"Mosswart Overlord"}),M.jsxs("nav",{className:"dashboard-nav",children:[M.jsx("a",{href:"/",className:"nav-link",children:"Classic View"}),M.jsx("a",{href:"/inventory.html",className:"nav-link",children:"Inventory"}),M.jsx("a",{href:"/suitbuilder.html",className:"nav-link",children:"Suitbuilder"})]})]}),M.jsx("main",{className:"dashboard-main",children:A})]}),io=({activeChars:A,totalKills:q,totalRares:Y,serverHealth:d})=>{var ll;const N=((ll=d==null?void 0:d.status)==null?void 0:ll.toLowerCase())??"unknown",j=N==="online"||N==="up";return M.jsxs("div",{className:"global-stats",children:[M.jsxs("div",{className:"global-stat",children:[M.jsx("span",{className:"global-value",children:A}),M.jsx("span",{className:"global-label",children:"Active Characters"})]}),M.jsxs("div",{className:"global-stat",children:[M.jsx("span",{className:"global-value",children:q.toLocaleString()}),M.jsx("span",{className:"global-label",children:"Total Kills"})]}),M.jsxs("div",{className:"global-stat",children:[M.jsx("span",{className:"global-value",children:Y}),M.jsx("span",{className:"global-label",children:"Total Rares"})]}),M.jsxs("div",{className:"global-stat",children:[M.jsx("span",{className:`server-dot ${j?"online":"offline"}`}),M.jsxs("span",{className:"global-value",children:[(d==null?void 0:d.latency_ms)??"--","ms"]}),M.jsx("span",{className:"global-label",children:"Coldeve"})]})]})},Qn=Od.memo(({label:A,current:q,max:Y,color:d,bgColor:N})=>{const j=Y>0?Math.min(100,Math.max(0,q/Y*100)):0;return M.jsxs("div",{className:"vital-bar",children:[M.jsx("span",{className:"vital-label",children:A}),M.jsx("div",{className:"vital-track",style:{backgroundColor:N},children:M.jsx("div",{className:"vital-fill",style:{width:`${j}%`,background:d}})}),M.jsxs("span",{className:"vital-text",children:[q,"/",Y]})]})});Qn.displayName="VitalBar";const so=A=>{const q=(A||"idle").toLowerCase();return q==="combat"?{label:"Combat",cls:"badge-combat"}:q==="nav"||q==="navigation"?{label:"Nav",cls:"badge-nav"}:{label:"Idle",cls:"badge-idle"}},Md=Od.memo(({character:A})=>{var bl,H,E,$,R,nl;const[q,Y]=Dl.useState(!1),{telemetry:d,vitals:N,combat:j}=A,ll=so((d==null?void 0:d.vt_state)??"");return M.jsxs("div",{className:"char-card",onClick:()=>Y(!q),children:[M.jsxs("div",{className:"char-header",children:[M.jsx("span",{className:"char-name",children:A.name}),M.jsx("span",{className:`char-badge ${ll.cls}`,children:ll.label})]}),N?M.jsxs("div",{className:"char-vitals",children:[M.jsx(Qn,{label:"HP",current:N.health_current,max:N.health_max,color:"linear-gradient(90deg, #ff4444, #ff6666)",bgColor:"#330000"}),M.jsx(Qn,{label:"ST",current:N.stamina_current,max:N.stamina_max,color:"linear-gradient(90deg, #ffaa00, #ffcc44)",bgColor:"#331a00"}),M.jsx(Qn,{label:"MN",current:N.mana_current,max:N.mana_max,color:"linear-gradient(90deg, #4488ff, #66aaff)",bgColor:"#001433"})]}):M.jsx("div",{className:"char-vitals-placeholder",children:"Awaiting vitals..."}),M.jsxs("div",{className:"char-stats-row",children:[M.jsxs("div",{className:"stat",children:[M.jsx("span",{className:"stat-value",children:(d==null?void 0:d.kills_per_hour)??"--"}),M.jsx("span",{className:"stat-label",children:"kills/hr"})]}),M.jsxs("div",{className:"stat",children:[M.jsx("span",{className:"stat-value",children:((bl=d==null?void 0:d.kills)==null?void 0:bl.toLocaleString())??"--"}),M.jsx("span",{className:"stat-label",children:"kills"})]}),M.jsxs("div",{className:"stat",children:[M.jsx("span",{className:"stat-value",children:(d==null?void 0:d.deaths)??"0"}),M.jsx("span",{className:"stat-label",children:"deaths"})]}),M.jsxs("div",{className:"stat",children:[M.jsx("span",{className:"stat-value",children:((H=d==null?void 0:d.onlinetime)==null?void 0:H.replace(/^00\./,""))??"--"}),M.jsx("span",{className:"stat-label",children:"uptime"})]})]}),d&&M.jsxs("div",{className:"char-location",children:[(E=d.ns)==null?void 0:E.toFixed(1),"N, ",($=d.ew)==null?void 0:$.toFixed(1),"E"]}),q&&M.jsxs("div",{className:"char-expanded",children:[N!=null&&N.vitae?M.jsxs("div",{className:"vitae-warn",children:["Vitae: ",N.vitae,"%"]}):null,M.jsxs("div",{className:"expanded-row",children:[M.jsxs("span",{children:["Prismatics: ",(d==null?void 0:d.prismatic_taper_count)??"--"]}),M.jsxs("span",{children:["Total Deaths: ",(d==null?void 0:d.total_deaths)??"--"]})]}),(j==null?void 0:j.session)&&M.jsxs("div",{className:"expanded-row",children:[M.jsxs("span",{children:["Session Dmg: ",(R=j.session.total_damage_given)==null?void 0:R.toLocaleString()]}),M.jsxs("span",{children:["Session Kills: ",j.session.total_kills]})]}),M.jsxs("div",{className:"expanded-row",children:[M.jsxs("span",{children:["RAM: ",d!=null&&d.mem_mb?(d.mem_mb/1048576).toFixed(0)+" MB":"--"]}),M.jsxs("span",{children:["CPU: ",((nl=d==null?void 0:d.cpu_pct)==null?void 0:nl.toFixed(1))??"--","%"]})]})]})]})});Md.displayName="CharacterCard";const vo=({characters:A})=>{const q=Dl.useMemo(()=>Array.from(A.values()).sort((Y,d)=>Y.name.localeCompare(d.name)),[A]);return q.length===0?M.jsx("div",{className:"grid-empty",children:"No active characters"}):M.jsx("div",{className:"char-grid",children:q.map(Y=>M.jsx(Md,{character:Y},Y.name))})},yo="/api";async function Te(A){const q=await fetch(`${yo}${A}`,{credentials:"include"});if(!q.ok)throw new Error(`API ${A}: ${q.status}`);return q.json()}function mo(){return`${location.protocol==="https:"?"wss:":"ws:"}//${location.host}/api/ws/live`}function oo(A){const q=Dl.useRef(null),Y=Dl.useRef(0),d=Dl.useRef(A);d.current=A;const N=Dl.useCallback(()=>{var ll;if(((ll=q.current)==null?void 0:ll.readyState)===WebSocket.OPEN)return;const j=new WebSocket(mo());q.current=j,j.addEventListener("message",bl=>{try{const H=JSON.parse(bl.data);d.current(H)}catch{}}),j.addEventListener("close",()=>{q.current=null,Y.current=window.setTimeout(N,2e3)}),j.addEventListener("error",()=>{j.close()})},[]);Dl.useEffect(()=>(N(),()=>{var j;clearTimeout(Y.current),(j=q.current)==null||j.close(),q.current=null}),[N])}const ho=()=>Te("/live"),So=()=>Te("/combat-stats"),go=()=>Te("/server-health"),ro=()=>Te("/total-rares"),bo=()=>Te("/total-kills");function zo(){const[A,q]=Dl.useState(new Map),[Y,d]=Dl.useState(null),[N,j]=Dl.useState(0),[ll,bl]=Dl.useState(0),[H,E]=Dl.useState([]),$=Dl.useRef(A);$.current=A;const R=Dl.useCallback((V,F)=>{q(P=>{const El=new Map(P),rl=El.get(V)??{name:V,telemetry:null,vitals:null,combat:null,lastUpdate:0};return El.set(V,F(rl)),El})},[]),nl=Dl.useCallback(V=>{if(V.type){if(V.type==="telemetry"){const F=V;R(F.character_name,P=>({...P,telemetry:F,lastUpdate:Date.now()}))}else if(V.type==="vitals"){const F=V;R(F.character_name,P=>({...P,vitals:F,lastUpdate:Date.now()}))}else if(V.type==="combat_stats"){const F=V;R(F.character_name,P=>({...P,combat:F,lastUpdate:Date.now()}))}else if(V.type==="rare"){const F=V;E(P=>[F,...P].slice(0,50))}}},[R]);return oo(nl),Dl.useEffect(()=>{const V=async()=>{try{const P=await ho();q(El=>{var bt;const rl=new Map(El);for(const Sl of P.players??[]){const Al=rl.get(Sl.character_name);rl.set(Sl.character_name,{name:Sl.character_name,telemetry:Sl,vitals:(Al==null?void 0:Al.vitals)??null,combat:(Al==null?void 0:Al.combat)??null,lastUpdate:Date.now()})}for(const Sl of rl.keys())(bt=P.players)!=null&&bt.some(Al=>Al.character_name===Sl)||rl.delete(Sl);return rl})}catch{}};V();const F=setInterval(V,5e3);return()=>clearInterval(F)},[]),Dl.useEffect(()=>{const V=async()=>{try{const P=await So();for(const El of P.stats??[])R(El.character_name,rl=>({...rl,combat:{...El,type:"combat_stats"}}))}catch{}};V();const F=setInterval(V,3e4);return()=>clearInterval(F)},[R]),Dl.useEffect(()=>{const V=async()=>{try{d(await go())}catch{}};V();const F=setInterval(V,3e4);return()=>clearInterval(F)},[]),Dl.useEffect(()=>{const V=async()=>{try{const[P,El]=await Promise.all([ro(),bo()]);j(P.total_rares??P.count??0),bl(El.total_kills??El.count??0)}catch{}};V();const F=setInterval(V,3e5);return()=>clearInterval(F)},[]),{characters:A,serverHealth:Y,totalRares:N,totalKills:ll,recentRares:H}}function To(){const{characters:A,serverHealth:q,totalRares:Y,totalKills:d}=zo();return M.jsxs(fo,{children:[M.jsx(io,{activeChars:A.size,totalKills:d,totalRares:Y,serverHealth:q}),M.jsx(vo,{characters:A})]})}co.createRoot(document.getElementById("root")).render(M.jsx(Dl.StrictMode,{children:M.jsx(To,{})})); diff --git a/static/v2/index.html b/static/v2/index.html new file mode 100644 index 00000000..239632c0 --- /dev/null +++ b/static/v2/index.html @@ -0,0 +1,14 @@ + + + + + + Mosswart Overlord v2 + + + + + +
+ +