diff --git a/.gitignore b/.gitignore index fb882c1..923c666 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. # dependencies +.agents/ .history/ /node_modules /.pnp diff --git a/bun.lock b/bun.lock index b2dd02a..fe46089 100644 --- a/bun.lock +++ b/bun.lock @@ -6,15 +6,15 @@ "name": "firefly-tools", "dependencies": { "@next/bundle-analyzer": "16.1.6", - "@tanstack/react-query": "^5.100.10", - "axios": "^1.16.1", + "@tanstack/react-query": "^5.102.5", + "axios": "^1.20.0", "fast-average-color": "^9.5.2", - "framer-motion": "^12.38.0", + "framer-motion": "^12.43.0", "html2canvas-pro": "^1.6.7", - "lru-cache": "^11.3.6", + "lru-cache": "^11.5.2", "lucide-react": "^0.563.0", "next": "16.1.6", - "next-intl": "^4.12.0", + "next-intl": "^4.13.7", "prismjs": "^1.30.0", "react": "19.2.4", "react-dom": "19.2.4", @@ -23,20 +23,20 @@ "react-toastify": "^11.1.0", "sharp": "^0.34.5", "zod": "^4.4.3", - "zustand": "^5.0.13", + "zustand": "^5.0.15", }, "devDependencies": { - "@tailwindcss/postcss": "^4.3.0", + "@tailwindcss/postcss": "^4.3.3", "@types/jest": "^30.0.0", - "@types/node": "^25.8.0", + "@types/node": "^25.9.5", "@types/react": "19.2.6", "@types/react-dom": "19.2.3", - "baseline-browser-mapping": "^2.10.29", - "daisyui": "^5.5.19", - "eslint": "^9.39.4", + "baseline-browser-mapping": "^2.11.19", + "daisyui": "^5.7.22", + "eslint": "^9.39.5", "eslint-config-next": "16.1.6", "tailwind-scrollbar": "^4.0.2", - "tailwindcss": "^4.3.0", + "tailwindcss": "^4.3.3", "ts-to-zod": "^5.1.0", "typescript": "^5.9.3", }, @@ -49,39 +49,39 @@ "packages": { "@alloc/quick-lru": ["@alloc/quick-lru@5.2.0", "", {}, "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw=="], - "@babel/code-frame": ["@babel/code-frame@7.28.6", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-JYgintcMjRiCvS8mMECzaEn+m3PfoQiyqukOMCCVQtoJGYJw8j/8LBJEiqkHLkfwCcs74E3pbAUFNg7d9VNJ+Q=="], + "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="], - "@babel/compat-data": ["@babel/compat-data@7.28.6", "", {}, "sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg=="], + "@babel/compat-data": ["@babel/compat-data@7.29.7", "", {}, "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg=="], - "@babel/core": ["@babel/core@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-compilation-targets": "^7.28.6", "@babel/helper-module-transforms": "^7.28.6", "@babel/helpers": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6", "@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" } }, "sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw=="], + "@babel/core": ["@babel/core@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.7", "@babel/helper-compilation-targets": "^7.29.7", "@babel/helper-module-transforms": "^7.29.7", "@babel/helpers": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/template": "^7.29.7", "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7", "@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" } }, "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA=="], - "@babel/generator": ["@babel/generator@7.28.6", "", { "dependencies": { "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw=="], + "@babel/generator": ["@babel/generator@7.29.8", "", { "dependencies": { "@babel/parser": "^7.29.8", "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" } }, "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg=="], - "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.28.6", "", { "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" } }, "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA=="], + "@babel/helper-compilation-targets": ["@babel/helper-compilation-targets@7.29.7", "", { "dependencies": { "@babel/compat-data": "^7.29.7", "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g=="], - "@babel/helper-globals": ["@babel/helper-globals@7.28.0", "", {}, "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw=="], + "@babel/helper-globals": ["@babel/helper-globals@7.29.7", "", {}, "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA=="], - "@babel/helper-module-imports": ["@babel/helper-module-imports@7.28.6", "", { "dependencies": { "@babel/traverse": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw=="], + "@babel/helper-module-imports": ["@babel/helper-module-imports@7.29.7", "", { "dependencies": { "@babel/traverse": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g=="], - "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.28.6", "", { "dependencies": { "@babel/helper-module-imports": "^7.28.6", "@babel/helper-validator-identifier": "^7.28.5", "@babel/traverse": "^7.28.6" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA=="], + "@babel/helper-module-transforms": ["@babel/helper-module-transforms@7.29.7", "", { "dependencies": { "@babel/helper-module-imports": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7", "@babel/traverse": "^7.29.7" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg=="], - "@babel/helper-string-parser": ["@babel/helper-string-parser@7.27.1", "", {}, "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="], + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], - "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], - "@babel/helper-validator-option": ["@babel/helper-validator-option@7.27.1", "", {}, "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg=="], + "@babel/helper-validator-option": ["@babel/helper-validator-option@7.29.7", "", {}, "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw=="], - "@babel/helpers": ["@babel/helpers@7.28.6", "", { "dependencies": { "@babel/template": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw=="], + "@babel/helpers": ["@babel/helpers@7.29.7", "", { "dependencies": { "@babel/template": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg=="], - "@babel/parser": ["@babel/parser@7.28.6", "", { "dependencies": { "@babel/types": "^7.28.6" }, "bin": "./bin/babel-parser.js" }, "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ=="], + "@babel/parser": ["@babel/parser@7.29.8", "", { "dependencies": { "@babel/types": "^7.29.8" }, "bin": "./bin/babel-parser.js" }, "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA=="], - "@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="], + "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], - "@babel/template": ["@babel/template@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/parser": "^7.28.6", "@babel/types": "^7.28.6" } }, "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ=="], + "@babel/template": ["@babel/template@7.29.7", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/parser": "^7.29.7", "@babel/types": "^7.29.7" } }, "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg=="], - "@babel/traverse": ["@babel/traverse@7.28.6", "", { "dependencies": { "@babel/code-frame": "^7.28.6", "@babel/generator": "^7.28.6", "@babel/helper-globals": "^7.28.0", "@babel/parser": "^7.28.6", "@babel/template": "^7.28.6", "@babel/types": "^7.28.6", "debug": "^4.3.1" } }, "sha512-fgWX62k02qtjqdSNTAGxmKYY/7FSL9WAS1o2Hu5+I5m9T0yxZzr4cnrfXQ/MX0rIifthCSs6FKTlzYbJcPtMNg=="], + "@babel/traverse": ["@babel/traverse@7.29.8", "", { "dependencies": { "@babel/code-frame": "^7.29.7", "@babel/generator": "^7.29.8", "@babel/helper-globals": "^7.29.7", "@babel/parser": "^7.29.8", "@babel/template": "^7.29.7", "@babel/types": "^7.29.8", "debug": "^4.3.1" } }, "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg=="], - "@babel/types": ["@babel/types@7.28.6", "", { "dependencies": { "@babel/helper-string-parser": "^7.27.1", "@babel/helper-validator-identifier": "^7.28.5" } }, "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg=="], + "@babel/types": ["@babel/types@7.29.8", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg=="], "@clack/core": ["@clack/core@1.0.0-alpha.4", "", { "dependencies": { "picocolors": "^1.0.0", "sisteransi": "^1.0.5" } }, "sha512-VCtU+vjyKPMSakVrB9q1bOnXN7QW/w4+YQDQCOF59GrzydW+169i0fVx/qzRRXJgt8KGj/pZZ/JxXroFZIDByg=="], @@ -89,11 +89,11 @@ "@discoveryjs/json-ext": ["@discoveryjs/json-ext@0.5.7", "", {}, "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw=="], - "@emnapi/core": ["@emnapi/core@1.8.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.1.0", "tslib": "^2.4.0" } }, "sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg=="], + "@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" } }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], - "@emnapi/runtime": ["@emnapi/runtime@1.8.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-mehfKSMWjjNol8659Z8KxEMrdSJDDot5SXMq00dM8BN4o+CLNXQ0xH2V7EchNHV4RmbZLmmPdEaXZc5H2FXmDg=="], + "@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], - "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.1.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ=="], + "@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], "@emotion/babel-plugin": ["@emotion/babel-plugin@11.13.5", "", { "dependencies": { "@babel/helper-module-imports": "^7.16.7", "@babel/runtime": "^7.18.3", "@emotion/hash": "^0.9.2", "@emotion/memoize": "^0.9.0", "@emotion/serialize": "^1.3.3", "babel-plugin-macros": "^3.1.0", "convert-source-map": "^1.5.0", "escape-string-regexp": "^4.0.0", "find-root": "^1.1.0", "source-map": "^0.5.7", "stylis": "4.2.0" } }, "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ=="], @@ -117,7 +117,7 @@ "@emotion/weak-memoize": ["@emotion/weak-memoize@0.4.0", "", {}, "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="], - "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.9.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ=="], + "@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.10.1", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg=="], "@eslint-community/regexpp": ["@eslint-community/regexpp@4.12.2", "", {}, "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew=="], @@ -127,39 +127,39 @@ "@eslint/core": ["@eslint/core@0.17.0", "", { "dependencies": { "@types/json-schema": "^7.0.15" } }, "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ=="], - "@eslint/eslintrc": ["@eslint/eslintrc@3.3.5", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.1", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-4IlJx0X0qftVsN5E+/vGujTRIFtwuLbNsVUe7TO6zYPDR1O6nFwvwhIKEKSrl6dZchmYBITazxKoUYOjdtjlRg=="], + "@eslint/eslintrc": ["@eslint/eslintrc@3.3.6", "", { "dependencies": { "ajv": "^6.14.0", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.3.0", "minimatch": "^3.1.5", "strip-json-comments": "^3.1.1" } }, "sha512-l2Ul9PrHsPCKcEY/ac7VgFj9D80C7S68sOKc618SyHDPK36s1XcFebXY0iTzUVn4Yq+YbwvSnDmCz9yxjX+QrA=="], - "@eslint/js": ["@eslint/js@9.39.4", "", {}, "sha512-nE7DEIchvtiFTwBw4Lfbu59PG+kCofhjsKaCWzxTpt4lfRjRMqG6uMBzKXuEcyXhOHoUp9riAm7/aWYGhXZ9cw=="], + "@eslint/js": ["@eslint/js@9.39.5", "", {}, "sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A=="], "@eslint/object-schema": ["@eslint/object-schema@2.1.7", "", {}, "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA=="], "@eslint/plugin-kit": ["@eslint/plugin-kit@0.4.1", "", { "dependencies": { "@eslint/core": "^0.17.0", "levn": "^0.4.1" } }, "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA=="], - "@floating-ui/core": ["@floating-ui/core@1.7.4", "", { "dependencies": { "@floating-ui/utils": "^0.2.10" } }, "sha512-C3HlIdsBxszvm5McXlB8PeOEWfBhcGBTZGkGlWc2U0KFY5IwG5OQEuQ8rq52DZmcHDlPLd+YFBK+cZcytwIFWg=="], + "@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="], - "@floating-ui/dom": ["@floating-ui/dom@1.7.5", "", { "dependencies": { "@floating-ui/core": "^1.7.4", "@floating-ui/utils": "^0.2.10" } }, "sha512-N0bD2kIPInNHUHehXhMke1rBGs1dwqvC9O9KYMyyjK7iXt7GAhnro7UlcuYcGdS/yYOlq0MAVgrow8IbWJwyqg=="], + "@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="], - "@floating-ui/utils": ["@floating-ui/utils@0.2.10", "", {}, "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ=="], + "@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], - "@formatjs/ecma402-abstract": ["@formatjs/ecma402-abstract@3.1.0", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.0", "@formatjs/intl-localematcher": "0.8.0", "decimal.js": "^10.6.0", "tslib": "^2.8.1" } }, "sha512-CjP1sUzM7XiQW6YluDreN+dMvcKZysO/J4ikvuDjDyd6nSOoSqAK9gvD1s75ZFaJVXtYOsz+y3CUXPZ1sKxcxw=="], + "@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.7", "", {}, "sha512-zXfhLpvA6T7+efdt9JLbBwZ00tT7NsBMDVnDu8rpHeNNv8KfRZAMo2gkG0k9lK/Nzc//3kJ9pImsfuJxk3KhUA=="], - "@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.5", "", {}, "sha512-KLi3fan6WnCHmigd9pmEEN8Hid0v4wiFBW576M/d07KMWYecf1CvyMI3n34vCmHT4AoVqG2n702kiHbXjzZX2A=="], + "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@3.5.17", "", { "dependencies": { "@formatjs/icu-skeleton-parser": "2.1.11" } }, "sha512-cN9jhVqT7u0K9tix43fhjoUwL0nazyW6zsNIXs2QdPADr+nurPfYyssUiMqcSCGlPcCiqnYVxgSn7zBSuI+5Bg=="], - "@formatjs/icu-messageformat-parser": ["@formatjs/icu-messageformat-parser@3.5.0", "", { "dependencies": { "@formatjs/ecma402-abstract": "3.1.0", "@formatjs/icu-skeleton-parser": "2.1.0", "tslib": "^2.8.1" } }, "sha512-Q01XuvtbDVCJQsG/E2MSfMZ+UdUoZV8v4Aex8tTH44SqKJZCeu5LjuclaKFUS0o1YoXndfEinJen5k1T1GR1vg=="], + "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@2.1.11", "", {}, "sha512-j8cUmOJzVgkHuS0QiQ6ga76UIoLOFSAMWhs7aZJztH3aAdCOAE6vpC8KVvFB4cU10ON0y2/5oOVmPJ43s2lTwA=="], - "@formatjs/icu-skeleton-parser": ["@formatjs/icu-skeleton-parser@2.1.0", "", { "dependencies": { "@formatjs/ecma402-abstract": "3.1.0", "tslib": "^2.8.1" } }, "sha512-wNer4imHDFBVAJnMb2OGoSyM4wL/uuLnuo5mrenliqkDaNjRbG4jzlJcwTTDEBhai8iCjnzUsE7xwNJC29SfWw=="], + "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.13", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.7" } }, "sha512-kHEAFOkeJSPNi7c5PaKaRjxcBrJwzzt81ifUu+8uve1EDW/VJl83KsxmqgqNZLzcFEhSliZGvx3+pk/RH0IOmg=="], - "@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.8", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.5" } }, "sha512-pBr2hVKWvkHVnfXegW+53NT9U2uaVQCc+EgzLPCCwXqBA3nvM5fPbK9IcJlNjV+NMKGyZ2F3ZSG78iGdxAAqbA=="], + "@humanfs/core": ["@humanfs/core@0.19.2", "", { "dependencies": { "@humanfs/types": "^0.15.0" } }, "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA=="], - "@humanfs/core": ["@humanfs/core@0.19.1", "", {}, "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA=="], + "@humanfs/node": ["@humanfs/node@0.16.8", "", { "dependencies": { "@humanfs/core": "^0.19.2", "@humanfs/types": "^0.15.0", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ=="], - "@humanfs/node": ["@humanfs/node@0.16.7", "", { "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.4.0" } }, "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ=="], + "@humanfs/types": ["@humanfs/types@0.15.0", "", {}, "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q=="], "@humanwhocodes/module-importer": ["@humanwhocodes/module-importer@1.0.1", "", {}, "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="], "@humanwhocodes/retry": ["@humanwhocodes/retry@0.4.3", "", {}, "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ=="], - "@img/colour": ["@img/colour@1.0.0", "", {}, "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw=="], + "@img/colour": ["@img/colour@1.1.0", "", {}, "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ=="], "@img/sharp-darwin-arm64": ["@img/sharp-darwin-arm64@0.34.5", "", { "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" }, "os": "darwin", "cpu": "arm64" }, "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w=="], @@ -209,17 +209,17 @@ "@img/sharp-win32-x64": ["@img/sharp-win32-x64@0.34.5", "", { "os": "win32", "cpu": "x64" }, "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw=="], - "@jest/diff-sequences": ["@jest/diff-sequences@30.0.1", "", {}, "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw=="], + "@jest/diff-sequences": ["@jest/diff-sequences@30.4.0", "", {}, "sha512-zOpzlfUs45l6u7jm39qr87JCHUDsaeCtvL+kQe/Vn9jSnRB4/5IPXISm0h9I1vZW/o00Kn4UTJ2MOlhnUGwv3g=="], - "@jest/expect-utils": ["@jest/expect-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0" } }, "sha512-1JnRfhqpD8HGpOmQp180Fo9Zt69zNtC+9lR+kT7NVL05tNXIi+QC8Csz7lfidMoVLPD3FnOtcmp0CEFnxExGEA=="], + "@jest/expect-utils": ["@jest/expect-utils@30.4.1", "", { "dependencies": { "@jest/get-type": "30.1.0" } }, "sha512-ZBn5CglH8fBsQsvs4VWNzD4aWfUYks+IdOOQU3MEK71ol/BcVm+P+rtb1KpiFBpSWSCE27uOahyyf1vfqOVbcQ=="], "@jest/get-type": ["@jest/get-type@30.1.0", "", {}, "sha512-eMbZE2hUnx1WV0pmURZY9XoXPkUYjpc55mb0CrhtdWLtzMQPFvu/rZkTLZFTsdaVQa+Tr4eWAteqcUzoawq/uA=="], - "@jest/pattern": ["@jest/pattern@30.0.1", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.0.1" } }, "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA=="], + "@jest/pattern": ["@jest/pattern@30.4.0", "", { "dependencies": { "@types/node": "*", "jest-regex-util": "30.4.0" } }, "sha512-RAWn3+f9u8BsHijKJ71uHcFp6vmyEt6VvoWXkl6hKF3qVIuWNmudVjg12DlBPGup/frIl5UcUlH5HfEuvHpEXg=="], - "@jest/schemas": ["@jest/schemas@30.0.5", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA=="], + "@jest/schemas": ["@jest/schemas@30.4.1", "", { "dependencies": { "@sinclair/typebox": "^0.34.0" } }, "sha512-i6b4qw5qnP8c5FEeBJg/uZQ4ddrkN6Ca8qISJh0pr7a5hfn3h3v5x60BEbOC7OYAGZNMs1LfFLwnW2CuK8F57Q=="], - "@jest/types": ["@jest/types@30.2.0", "", { "dependencies": { "@jest/pattern": "30.0.1", "@jest/schemas": "30.0.5", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-H9xg1/sfVvyfU7o3zMfBEjQ1gcsdeTMgqHoYdN79tuLqfTtuu7WckRA1R5whDwOzxaZAeMKTYWqP+WCAi0CHsg=="], + "@jest/types": ["@jest/types@30.4.1", "", { "dependencies": { "@jest/pattern": "30.4.0", "@jest/schemas": "30.4.1", "@types/istanbul-lib-coverage": "^2.0.6", "@types/istanbul-reports": "^3.0.4", "@types/node": "*", "@types/yargs": "^17.0.33", "chalk": "^4.1.2" } }, "sha512-f1x/vJXIfjOlEmejYpbkbgw1gOqpPECwMvMEtBqe47j7H2Hg8h8w3o3ikhSXq3MI15kg+oQ0exWO0uCtTNJLoQ=="], "@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="], @@ -231,7 +231,7 @@ "@jridgewell/trace-mapping": ["@jridgewell/trace-mapping@0.3.31", "", { "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw=="], - "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@0.2.12", "", { "dependencies": { "@emnapi/core": "^1.4.3", "@emnapi/runtime": "^1.4.3", "@tybys/wasm-util": "^0.10.0" } }, "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ=="], + "@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], "@next/bundle-analyzer": ["@next/bundle-analyzer@16.1.6", "", { "dependencies": { "webpack-bundle-analyzer": "4.10.1" } }, "sha512-ee2kagdTaeEWPlotgdTOqFHYcD3e2m2bbE3I9Rq2i6ABYi5OgopmtEUe8NM23viaYxLV2tDH/2nd5+qKoEr6cw=="], @@ -263,35 +263,33 @@ "@nolyfill/is-core-module": ["@nolyfill/is-core-module@1.0.39", "", {}, "sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA=="], - "@oclif/core": ["@oclif/core@4.8.0", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^3.1.10", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "is-wsl": "^2.2.0", "lilconfig": "^3.1.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.14", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0" } }, "sha512-jteNUQKgJHLHFbbz806aGZqf+RJJ7t4gwF4MYa8fCwCxQ8/klJNWc0MvaJiBebk7Mc+J39mdlsB4XraaCKznFw=="], + "@oclif/core": ["@oclif/core@4.14.0", "", { "dependencies": { "ansi-escapes": "^4.3.2", "ansis": "^3.17.0", "clean-stack": "^3.0.1", "cli-spinners": "^2.9.2", "debug": "^4.4.3", "ejs": "^6", "get-package-type": "^0.1.0", "indent-string": "^4.0.0", "lilconfig": "^3.1.3", "minimatch": "^10.2.5", "semver": "^7.8.1", "string-width": "^4.2.3", "supports-color": "^8", "tinyglobby": "^0.2.17", "widest-line": "^3.1.0", "wordwrap": "^1.0.0", "wrap-ansi": "^7.0.0", "wsl-utils": "^0.4.0" } }, "sha512-QCJIZoVJxV7jywgVAUlsQwl3dr3Sa21kfi5z9KrYolbexWJUtFSEtMoNiBWojD05mYycLnB50gp/VxlGdaOCRA=="], - "@parcel/watcher": ["@parcel/watcher@2.5.6", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.3" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.5.6", "@parcel/watcher-darwin-arm64": "2.5.6", "@parcel/watcher-darwin-x64": "2.5.6", "@parcel/watcher-freebsd-x64": "2.5.6", "@parcel/watcher-linux-arm-glibc": "2.5.6", "@parcel/watcher-linux-arm-musl": "2.5.6", "@parcel/watcher-linux-arm64-glibc": "2.5.6", "@parcel/watcher-linux-arm64-musl": "2.5.6", "@parcel/watcher-linux-x64-glibc": "2.5.6", "@parcel/watcher-linux-x64-musl": "2.5.6", "@parcel/watcher-win32-arm64": "2.5.6", "@parcel/watcher-win32-ia32": "2.5.6", "@parcel/watcher-win32-x64": "2.5.6" } }, "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ=="], + "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="], - "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.5.6", "", { "os": "android", "cpu": "arm64" }, "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A=="], + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="], - "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.5.6", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA=="], + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="], - "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.5.6", "", { "os": "darwin", "cpu": "x64" }, "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg=="], + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="], - "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.5.6", "", { "os": "freebsd", "cpu": "x64" }, "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng=="], + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="], - "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ=="], + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="], - "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.5.6", "", { "os": "linux", "cpu": "arm" }, "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg=="], + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="], - "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA=="], + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="], - "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.5.6", "", { "os": "linux", "cpu": "arm64" }, "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA=="], + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="], - "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ=="], + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="], - "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.5.6", "", { "os": "linux", "cpu": "x64" }, "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg=="], + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="], - "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.5.6", "", { "os": "win32", "cpu": "arm64" }, "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q=="], + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="], - "@parcel/watcher-win32-ia32": ["@parcel/watcher-win32-ia32@2.5.6", "", { "os": "win32", "cpu": "ia32" }, "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g=="], - - "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.5.6", "", { "os": "win32", "cpu": "x64" }, "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw=="], + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="], "@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="], @@ -299,73 +297,77 @@ "@schummar/icu-type-parser": ["@schummar/icu-type-parser@1.21.5", "", {}, "sha512-bXHSaW5jRTmke9Vd0h5P7BtWZG9Znqb8gSDxZnxaGSJnGwPLDPfS+3g0BKzeWqzgZPsIVZkM7m2tbo18cm5HBw=="], - "@sinclair/typebox": ["@sinclair/typebox@0.34.48", "", {}, "sha512-kKJTNuK3AQOrgjjotVxMrCn1sUJwM76wMszfq1kdU4uYVJjvEWuFQ6HgvLt4Xz3fSmZlTOxJ/Ie13KnIcWQXFA=="], + "@sinclair/typebox": ["@sinclair/typebox@0.34.52", "", {}, "sha512-XiMQh7qqVlxZzcVD+kkGMNGMzcTrDMLWI7S4x7z1MkCkbDPrekpZXEUK0eZqZFMuHQg2a2DZOcDIh9o5v3Gonw=="], - "@swc/core": ["@swc/core@1.15.11", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.25" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.11", "@swc/core-darwin-x64": "1.15.11", "@swc/core-linux-arm-gnueabihf": "1.15.11", "@swc/core-linux-arm64-gnu": "1.15.11", "@swc/core-linux-arm64-musl": "1.15.11", "@swc/core-linux-x64-gnu": "1.15.11", "@swc/core-linux-x64-musl": "1.15.11", "@swc/core-win32-arm64-msvc": "1.15.11", "@swc/core-win32-ia32-msvc": "1.15.11", "@swc/core-win32-x64-msvc": "1.15.11" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-iLmLTodbYxU39HhMPaMUooPwO/zqJWvsqkrXv1ZI38rMb048p6N7qtAtTp37sw9NzSrvH6oli8EdDygo09IZ/w=="], + "@swc/core": ["@swc/core@1.15.47", "", { "dependencies": { "@swc/counter": "^0.1.3", "@swc/types": "^0.1.27" }, "optionalDependencies": { "@swc/core-darwin-arm64": "1.15.47", "@swc/core-darwin-x64": "1.15.47", "@swc/core-linux-arm-gnueabihf": "1.15.47", "@swc/core-linux-arm64-gnu": "1.15.47", "@swc/core-linux-arm64-musl": "1.15.47", "@swc/core-linux-ppc64-gnu": "1.15.47", "@swc/core-linux-s390x-gnu": "1.15.47", "@swc/core-linux-x64-gnu": "1.15.47", "@swc/core-linux-x64-musl": "1.15.47", "@swc/core-win32-arm64-msvc": "1.15.47", "@swc/core-win32-ia32-msvc": "1.15.47", "@swc/core-win32-x64-msvc": "1.15.47" }, "peerDependencies": { "@swc/helpers": ">=0.5.17" }, "optionalPeers": ["@swc/helpers"] }, "sha512-FbsO5JcfOjfH38W/rohBRBweJeERsAuIP4f377lmkmxTcq9exjtx4SkRuZY5CdfhR2CBVwDIJegBpJDffwNsOg=="], - "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.11", "", { "os": "darwin", "cpu": "arm64" }, "sha512-QoIupRWVH8AF1TgxYyeA5nS18dtqMuxNwchjBIwJo3RdwLEFiJq6onOx9JAxHtuPwUkIVuU2Xbp+jCJ7Vzmgtg=="], + "@swc/core-darwin-arm64": ["@swc/core-darwin-arm64@1.15.47", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GsoMtan3ojGGMGFbl31mmRu5ctZ56re8grGE8mO/OHJ8O+JRkzod02fe7X6ZQ8JvamA3imkEkx/h3u+vsOgPgA=="], - "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.11", "", { "os": "darwin", "cpu": "x64" }, "sha512-S52Gu1QtPSfBYDiejlcfp9GlN+NjTZBRRNsz8PNwBgSE626/FUf2PcllVUix7jqkoMC+t0rS8t+2/aSWlMuQtA=="], + "@swc/core-darwin-x64": ["@swc/core-darwin-x64@1.15.47", "", { "os": "darwin", "cpu": "x64" }, "sha512-leTi7Rx3KF4zcC637iqWgk9SoV8VXAD8ppQYXsep63px5A/UftOcxLN1pmr8Z1si/YvX90ompP/rHgpYkgwXWg=="], - "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.11", "", { "os": "linux", "cpu": "arm" }, "sha512-lXJs8oXo6Z4yCpimpQ8vPeCjkgoHu5NoMvmJZ8qxDyU99KVdg6KwU9H79vzrmB+HfH+dCZ7JGMqMF//f8Cfvdg=="], + "@swc/core-linux-arm-gnueabihf": ["@swc/core-linux-arm-gnueabihf@1.15.47", "", { "os": "linux", "cpu": "arm" }, "sha512-hBqHuoWKKIsKmDBn9qVeWqj5GWZhtlcczVaqQmNRXsDfq+voR5CxKRfamA367QjJXtceYuliLFfEL8QsskRM2g=="], - "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-chRsz1K52/vj8Mfq/QOugVphlKPWlMh10V99qfH41hbGvwAU6xSPd681upO4bKiOr9+mRIZZW+EfJqY42ZzRyA=="], + "@swc/core-linux-arm64-gnu": ["@swc/core-linux-arm64-gnu@1.15.47", "", { "os": "linux", "cpu": "arm64" }, "sha512-TBxvRz+B4K205TWHHZxWVxkC2RFNP/Mz3PNcECBos5PsKwxjg3QSJzdoebr0VCf0Bfh8HOPldKxAP/8XkFe9gA=="], - "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.11", "", { "os": "linux", "cpu": "arm64" }, "sha512-PYftgsTaGnfDK4m6/dty9ryK1FbLk+LosDJ/RJR2nkXGc8rd+WenXIlvHjWULiBVnS1RsjHHOXmTS4nDhe0v0w=="], + "@swc/core-linux-arm64-musl": ["@swc/core-linux-arm64-musl@1.15.47", "", { "os": "linux", "cpu": "arm64" }, "sha512-3Yu3Uq/VgytqsPjTMbkPU1ExADytbdWbruJYhA584E9jrpE2Ki+R6VVPoZCeAVk1Cb7QxcRTgblw6bSa6a/R+w=="], - "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.11", "", { "os": "linux", "cpu": "x64" }, "sha512-DKtnJKIHiZdARyTKiX7zdRjiDS1KihkQWatQiCHMv+zc2sfwb4Glrodx2VLOX4rsa92NLR0Sw8WLcPEMFY1szQ=="], + "@swc/core-linux-ppc64-gnu": ["@swc/core-linux-ppc64-gnu@1.15.47", "", { "os": "linux", "cpu": "ppc64" }, "sha512-wfdMi5IaOaNtmh2/6geRoxIdNfqylUZFdtzTKS655y1axWfIWyx7As74vv0wVdjeCIZ3WmCI9odDd4rUttXOSQ=="], - "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.11", "", { "os": "linux", "cpu": "x64" }, "sha512-mUjjntHj4+8WBaiDe5UwRNHuEzLjIWBTSGTw0JT9+C9/Yyuh4KQqlcEQ3ro6GkHmBGXBFpGIj/o5VMyRWfVfWw=="], + "@swc/core-linux-s390x-gnu": ["@swc/core-linux-s390x-gnu@1.15.47", "", { "os": "linux", "cpu": "s390x" }, "sha512-3hHYBY0yx8Ez7GMRrkhXHQzMdR5IZA6Wq5Ee4svlgwvSECLpnAJ9+0AimEGUFDvuLwE7nV/2+PYe8+Nm4rvNcQ=="], - "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.11", "", { "os": "win32", "cpu": "arm64" }, "sha512-ZkNNG5zL49YpaFzfl6fskNOSxtcZ5uOYmWBkY4wVAvgbSAQzLRVBp+xArGWh2oXlY/WgL99zQSGTv7RI5E6nzA=="], + "@swc/core-linux-x64-gnu": ["@swc/core-linux-x64-gnu@1.15.47", "", { "os": "linux", "cpu": "x64" }, "sha512-TjfhjgP/jGCfFHYC3JQPhJA1HwErbIJ9JfREDc1KNkvY6P0LodCgKVIlQ5deeTbkG7ih3bF5PHJLuLpaZjdRyQ=="], - "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.11", "", { "os": "win32", "cpu": "ia32" }, "sha512-6XnzORkZCQzvTQ6cPrU7iaT9+i145oLwnin8JrfsLG41wl26+5cNQ2XV3zcbrnFEV6esjOceom9YO1w9mGJByw=="], + "@swc/core-linux-x64-musl": ["@swc/core-linux-x64-musl@1.15.47", "", { "os": "linux", "cpu": "x64" }, "sha512-CQpS8Ge/avfjZd0UEwG/sds83Uu32deQXcV1Jo3jD0mmvQQqtYAjpsDZXugmheeAwmt+YIuoVtVHro8LMYHqsQ=="], - "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.11", "", { "os": "win32", "cpu": "x64" }, "sha512-IQ2n6af7XKLL6P1gIeZACskSxK8jWtoKpJWLZmdXTDj1MGzktUy4i+FvpdtxFmJWNavRWH1VmTr6kAubRDHeKw=="], + "@swc/core-win32-arm64-msvc": ["@swc/core-win32-arm64-msvc@1.15.47", "", { "os": "win32", "cpu": "arm64" }, "sha512-0W8IKHsUTYiT7G2RqtOoVWk+89yzZikIiDUb/sCK6BmQDBhN91hQSfyUtW12jhEWLzYgcfmisfsZrmZE+84U1A=="], + + "@swc/core-win32-ia32-msvc": ["@swc/core-win32-ia32-msvc@1.15.47", "", { "os": "win32", "cpu": "ia32" }, "sha512-ZIp49d2Z4/ka2jO9otOg4hDvTdPmp86kVOgS2M5FCPI7eKKZ1W0boxWn+8XeZrfERtFGW0AlMRm4JhlJa7l3NA=="], + + "@swc/core-win32-x64-msvc": ["@swc/core-win32-x64-msvc@1.15.47", "", { "os": "win32", "cpu": "x64" }, "sha512-2h8Iek95vnixkBRCo+H8p09+Q5ll2NgSMFrWTy0iKt7+/t+8/T5mBpiT6c0ZxSS7wcWjwZ9sGZkK70tTSYHdDw=="], "@swc/counter": ["@swc/counter@0.1.3", "", {}, "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ=="], "@swc/helpers": ["@swc/helpers@0.5.15", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g=="], - "@swc/types": ["@swc/types@0.1.25", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-iAoY/qRhNH8a/hBvm3zKj9qQ4oc2+3w1unPJa2XvTK3XjeLXtzcCingVPw/9e5mn1+0yPqxcBGp9Jf0pkfMb1g=="], + "@swc/types": ["@swc/types@0.1.28", "", { "dependencies": { "@swc/counter": "^0.1.3" } }, "sha512-V6Mnml8v09QALx6K0elJ7o9K/MkVDtW3t6L+7Ou/JcWtb3xwId2AH4FeOceySd2JaO87IMw4+6vSZxLm34LPbw=="], - "@tailwindcss/node": ["@tailwindcss/node@4.3.0", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.21.0", "jiti": "^2.6.1", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.0" } }, "sha512-aFb4gUhFOgdh9AXo4IzBEOzBkkAxm9VigwDJnMIYv3lcfXCJVesNfbEaBl4BNgVRyid92AmdviqwBUBRKSeY3g=="], + "@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="], - "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.0", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.0", "@tailwindcss/oxide-darwin-arm64": "4.3.0", "@tailwindcss/oxide-darwin-x64": "4.3.0", "@tailwindcss/oxide-freebsd-x64": "4.3.0", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.0", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.0", "@tailwindcss/oxide-linux-arm64-musl": "4.3.0", "@tailwindcss/oxide-linux-x64-gnu": "4.3.0", "@tailwindcss/oxide-linux-x64-musl": "4.3.0", "@tailwindcss/oxide-wasm32-wasi": "4.3.0", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.0", "@tailwindcss/oxide-win32-x64-msvc": "4.3.0" } }, "sha512-F7HZGBeN9I0/AuuJS5PwcD8xayx5ri5GhjYUDBEVYUkexyA/giwbDNjRVrxSezE3T250OU2K/wp/ltWx3UOefg=="], + "@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.0", "", { "os": "android", "cpu": "arm64" }, "sha512-TJPiq67tKlLuObP6RkwvVGDoxCMBVtDgKkLfa/uyj7/FyxvQwHS+UOnVrXXgbEsfUaMgiVvC4KbJnRr26ho4Ng=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-oMN/WZRb+SO37BmUElEgeEWuU8E/HXRkiODxJxLe1UTHVXLrdVSgfaJV7pSlhRGMSOiXLuxTIjfsF3wYvz8cgQ=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-N6CUmu4a6bKVADfw77p+iw6Yd9Q3OBhe0veaDX+QazfuVYlQsHfDgxBrsjQ/IW+zywL8mTrNd0SdJT/zgtvMdA=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-zDL5hBkQdH5C6MpqbK3gQAgP80tsMwSI26vjOzjJtNCMUo0lFgOItzHKBIupOZNQxt3ouPH7RPhvNhiTfCe5CQ=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.0", "", { "os": "linux", "cpu": "arm" }, "sha512-R06HdNi7A7OEoMsf6d4tjZ71RCWnZQPHj2mnotSFURjNLdBC+cIgXQ7l81CqeoiQftjf6OOblxXMInMgN2VzMA=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-qTJHELX8jetjhRQHCLilkVLmybpzNQAtaI/gaoVoidn/ufbNDbAo8KlK2J+yPoc8wQxvDxCmh/5lr8nC1+lTbg=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-Z6sukiQsngnWO+l39X4pPbiWT81IC+PLKF+PHxIlyZbGNb9MODfYlXEVlFvej5BOZInWX01kVyzeLvHsXhfczQ=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-DRNdQRpSGzRGfARVuVkxvM8Q12nh19l4BF/G7zGA1oe+9wcC6saFBHTISrpIcKzhiXtSrlSrluCfvMuledoCTQ=="], + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.0", "", { "os": "linux", "cpu": "x64" }, "sha512-Z0IADbDo8bh6I7h2IQMx601AdXBLfFpEdUotft86evd/8ZPflZe9COPO8Q1vw+pfLWIUo9zN/JGZvwuAJqduqg=="], + "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="], - "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.0", "", { "dependencies": { "@emnapi/core": "^1.10.0", "@emnapi/runtime": "^1.10.0", "@emnapi/wasi-threads": "^1.2.1", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.1", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-HNZGOUxEmElksYR7S6sC5jTeNGpobAsy9u7Gu0AskJ8/20FR9GqebUyB+HBcU/ax6BHuiuJi+Oda4B+YX6H1yA=="], + "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="], - "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Pe+RPVTi1T+qymuuRpcdvwSVZjnll/f7n8gBxMMh3xLTctMDKqpdfGimbMyioqtLhUYZxdJ9wGNhV7MKHvgZsQ=="], + "@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Mvrf2kXW/yeW/OTezZlCGOirXRcUuLIBx/5Y12BaPM7wJoryG6dfS/NJL8aBPqtTEx/Vm4T4vKzFUcKDT+TKUA=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], - "@tailwindcss/postcss": ["@tailwindcss/postcss@4.3.0", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.3.0", "@tailwindcss/oxide": "4.3.0", "postcss": "^8.5.10", "tailwindcss": "4.3.0" } }, "sha512-Jm05Tjx+9yCLGv5qw1c+84Psds8MnyrEQYCB+FFk2lgGiUjlRqdxke4mVTuYrj2xnVZqKim2Apr5ySuQRYAw/w=="], + "@tailwindcss/postcss": ["@tailwindcss/postcss@4.3.3", "", { "dependencies": { "@alloc/quick-lru": "^5.2.0", "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "postcss": "^8.5.16", "tailwindcss": "4.3.3" } }, "sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg=="], - "@tanstack/query-core": ["@tanstack/query-core@5.100.10", "", {}, "sha512-8UR0yJR+GiQ40m3lPhUr0xbfAupe6GSQiksSBSa9SM2NjezFyxXCIA69/lz8cSoNKZLrw1/PktIyQBJcVeMi3w=="], + "@tanstack/query-core": ["@tanstack/query-core@5.102.5", "", {}, "sha512-RjCmHf9cPRYcH/dpO0Jagw3rxCM1bLzMKKSGzaDkQJADDKGpv5RFjN54IyHSOIPa822AUA7ASOXDjjy1jfyzIA=="], - "@tanstack/react-query": ["@tanstack/react-query@5.100.10", "", { "dependencies": { "@tanstack/query-core": "5.100.10" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-FLaZf2RCrA/Zgp4aiu5tG3TyasTRO7aZ99skxQpr3Hg/zXOhu6yq5FZCYQ/tRaJtM9ylnoK8tFK7PolXQadv6Q=="], + "@tanstack/react-query": ["@tanstack/react-query@5.102.5", "", { "dependencies": { "@tanstack/query-core": "5.102.5" }, "peerDependencies": { "react": "^18 || ^19" } }, "sha512-PyTmSq2nW4MnPuQ/T4hZbH2BYShpgCLSJNwCaPEEYO3RWd9yX611wOMm7etz2SZWVh4N7Azag5iZLMDqYTzfNA=="], - "@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + "@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], - "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], + "@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="], "@types/istanbul-lib-coverage": ["@types/istanbul-lib-coverage@2.0.6", "", {}, "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w=="], @@ -379,11 +381,11 @@ "@types/json5": ["@types/json5@0.0.29", "", {}, "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ=="], - "@types/node": ["@types/node@25.8.0", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-TCFSk8IZh+iLX1xtksoBVtdmgL+1IX0fC9BeU4QqFSuNdN/K+HUlhqOzEmSYYpZUVsLYcPqc9KX+60iDuninSQ=="], + "@types/node": ["@types/node@25.9.5", "", { "dependencies": { "undici-types": ">=7.24.0 <7.24.7" } }, "sha512-OScDchr2fwuUmWdf4kZ9h7PcJiYDVInhJizG/biAq3cAvqwYktuy/TYGGdZNMtNTFUP7rnb0NU4TUdm82kt4Rg=="], "@types/parse-json": ["@types/parse-json@4.0.2", "", {}, "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="], - "@types/prismjs": ["@types/prismjs@1.26.5", "", {}, "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ=="], + "@types/prismjs": ["@types/prismjs@1.26.6", "", {}, "sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw=="], "@types/react": ["@types/react@19.2.6", "", { "dependencies": { "csstype": "^3.2.2" } }, "sha512-p/jUvulfgU7oKtj6Xpk8cA2Y1xKTtICGpJYeJXz2YVO2UcvjQgeRMLDGfDeqeRW2Ta+0QNFwcc8X3GH8SxZz6w=="], @@ -397,71 +399,77 @@ "@types/yargs-parser": ["@types/yargs-parser@21.0.3", "", {}, "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.54.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/type-utils": "8.54.0", "@typescript-eslint/utils": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.54.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hAAP5io/7csFStuOmR782YmTthKBJ9ND3WVL60hcOjvtGFb+HJxH4O5huAcmcZ9v9G8P+JETiZ/G1B8MALnWZQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.68.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.68.0", "@typescript-eslint/type-utils": "8.68.0", "@typescript-eslint/utils": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.68.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-WASHDpCm6qO5jj9g1a+8NiW5+GCkAyLReR56/4VruYmNgfUmqpxOfZ2Yfb8xGfJPWv5Qi6LSD8sXdces3vbp/Q=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.54.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BtE0k6cjwjLZoZixN0t5AKP0kSzlGu7FctRXYuPAm//aaiZhmfq1JwdYpYr1brzEspYyFeF+8XF5j2VK6oalrA=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.68.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.68.0", "@typescript-eslint/types": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-fHq2VC1kpyYfvEcbiMjOpySY4WS7voEp89yAThrHRX5sm9j2lzYppCb2umFMEed4fWcyeLjHxrz0mpjNBaBxMQ=="], - "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.54.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.54.0", "@typescript-eslint/types": "^8.54.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-YPf+rvJ1s7MyiWM4uTRhE4DvBXrEV+d8oC3P9Y2eT7S+HBS0clybdMIPnhiATi9vZOYDc7OQ1L/i6ga6NFYK/g=="], + "@typescript-eslint/project-service": ["@typescript-eslint/project-service@8.68.0", "", { "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.68.0", "@typescript-eslint/types": "^8.68.0", "debug": "^4.4.3" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-5GQtWZCXFcFYux955pvoS02WLc49pXNlvIxocKjS0clvwo3in1RdlzVKyiqQH9vE5AKWFLTaUgeQkOrTS+0Qxw=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0" } }, "sha512-27rYVQku26j/PbHYcVfRPonmOlVI6gihHtXFbTdB5sb6qA0wdAQAbyXFVarQ5t4HRojIz64IV90YtsjQSSGlQg=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.68.0", "", { "dependencies": { "@typescript-eslint/types": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0" } }, "sha512-T5eXpcaJNg8bhjHJ8Rjp68Vq/QBteYtTKY8TZqVNPaUbuz0f6jI9t6aDkylwvalpAB9XTTFeFOjrjXAZ3YvmVA=="], - "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.54.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-dRgOyT2hPk/JwxNMZDsIXDgyl9axdJI3ogZ2XWhBPsnZUv+hPesa5iuhdYt2gzwA9t8RE5ytOJ6xB0moV0Ujvw=="], + "@typescript-eslint/tsconfig-utils": ["@typescript-eslint/tsconfig-utils@8.68.0", "", { "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-F7zrGQfiJHojPwi8vhxZQC1tWtJzvL74cK/nqri2lk8YUXvYaYwl263xOJ69jDWPUk1hmcdoayFwk9lX09npVw=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0", "debug": "^4.4.3", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-hiLguxJWHjjwL6xMBwD903ciAwd7DmK30Y9Axs/etOkftC3ZNN9K44IuRD/EB08amu+Zw6W37x9RecLkOo3pMA=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.68.0", "", { "dependencies": { "@typescript-eslint/types": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0", "@typescript-eslint/utils": "8.68.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-X77zqoY1EjeWGs/0JNxeaMfp5C5lIz4Tw8y66F1Ne8Faq6g424sBNYM6xBAqElfGZPLpWS+CZAp0DXyKDzWiHg=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.54.0", "", {}, "sha512-PDUI9R1BVjqu7AUDsRBbKMtwmjWcn4J3le+5LpcFgWULN3LvHC5rkc9gCVxbrsrGmO1jfPybN5s6h4Jy+OnkAA=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.68.0", "", {}, "sha512-9RnpsGJjrAllCMefGVVsImJM24YurhC0Q1h4UbvivtvOqXmR/vEJge2OoE++z9m6hyg8T1Q8t5SNT6tHSbrxcg=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.54.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.54.0", "@typescript-eslint/tsconfig-utils": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/visitor-keys": "8.54.0", "debug": "^4.4.3", "minimatch": "^9.0.5", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.4.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.0.0" } }, "sha512-BUwcskRaPvTk6fzVWgDPdUndLjB87KYDrN5EYGetnktoeAvPtO4ONHlAZDnj5VFnUANg0Sjm7j4usBlnoVMHwA=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.68.0", "", { "dependencies": { "@typescript-eslint/project-service": "8.68.0", "@typescript-eslint/tsconfig-utils": "8.68.0", "@typescript-eslint/types": "8.68.0", "@typescript-eslint/visitor-keys": "8.68.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "sha512-OKKsD0tYmoNiU5PW2zehO1yO56jYOm1ShYlxon/Z0SJNidAkdVg86eg9ruRuoXf8xfnuWZGbwDsStkoXbZtIIA=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.54.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.54.0", "@typescript-eslint/types": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-9Cnda8GS57AQakvRyG0PTejJNlA2xhvyNtEVIMlDWOOeEyBkYWhGPnfrIAnqxLMTSTo6q8g12XVjjev5l1NvMA=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.68.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.68.0", "@typescript-eslint/types": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-PB5gJMMOg0Q5P1tsgWtEAqQacJXq0qEqRHDX/YJ4FaTMLfZPpHB3gjl2EJuiZyPABxmj4ZQYiY9m1bdAJ5y7tQ=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.54.0", "", { "dependencies": { "@typescript-eslint/types": "8.54.0", "eslint-visitor-keys": "^4.2.1" } }, "sha512-VFlhGSl4opC0bprJiItPQ1RfUhGDIBokcPwaFH4yiBCaNPeld/9VeXbiPO1cLyorQi1G1vL+ecBk1x8o1axORA=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.68.0", "", { "dependencies": { "@typescript-eslint/types": "8.68.0", "eslint-visitor-keys": "^5.0.0" } }, "sha512-YR65gGdGvTUAWLldC3xLOvOzamdGzB4A5/N8rehEaHs3Zvoe39BhgY+u0SPch1OvrVTfLcc55wsSgK2NcnTS/A=="], - "@typescript/vfs": ["@typescript/vfs@1.6.2", "", { "dependencies": { "debug": "^4.1.1" }, "peerDependencies": { "typescript": "*" } }, "sha512-hoBwJwcbKHmvd2QVebiytN1aELvpk9B74B4L1mFm/XT1Q/VOYAWl2vQ9AWRFtQq8zmz6enTpfTV8WRc4ATjW/g=="], + "@typescript/vfs": ["@typescript/vfs@1.6.4", "", { "dependencies": { "debug": "^4.4.3" }, "peerDependencies": { "typescript": "*" } }, "sha512-PJFXFS4ZJKiJ9Qiuix6Dz/OwEIqHD7Dme1UwZhTK11vR+5dqW2ACbdndWQexBzCx+CPuMe5WBYQWCsFyGlQLlQ=="], - "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.11.1", "", { "os": "android", "cpu": "arm" }, "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw=="], + "@unrs/resolver-binding-android-arm-eabi": ["@unrs/resolver-binding-android-arm-eabi@1.12.2", "", { "os": "android", "cpu": "arm" }, "sha512-g5T90pqg1bo/7mytQx6F4iBNC0Wsh9cu+z9veDbFjc7HjpesJFWD7QMS0NGStXM075+7dJPPVvBbpZlnrdpi/w=="], - "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.11.1", "", { "os": "android", "cpu": "arm64" }, "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g=="], + "@unrs/resolver-binding-android-arm64": ["@unrs/resolver-binding-android-arm64@1.12.2", "", { "os": "android", "cpu": "arm64" }, "sha512-YGCRZv/9GLhwmz6mYDeTsm/92BAyR28l6c2ReweVW5pWgfsitWLY8upvfRlGdoyD8HjeTHSYJWyZGD4KJA/nFQ=="], - "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.11.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g=="], + "@unrs/resolver-binding-darwin-arm64": ["@unrs/resolver-binding-darwin-arm64@1.12.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-u9DiNT1auQMO20A9SyTuG3wUgQWB9Z7KjAg0uFuCDR1FsAY8A0CG2S6JpHS1xwm/w1G08bjXZDcyOCjv1WAm2w=="], - "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.11.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ=="], + "@unrs/resolver-binding-darwin-x64": ["@unrs/resolver-binding-darwin-x64@1.12.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-f7rPLi/T1HVKZu/u6t87lroib16n8vrSzcyxI7lg4BGO9UF26KhQL44sd9eOUgrTYhvRXtWOIZT5PejdPyJfUA=="], - "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.11.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw=="], + "@unrs/resolver-binding-freebsd-x64": ["@unrs/resolver-binding-freebsd-x64@1.12.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-BpcOjWCJub6nRZUS2zA20pmLvjtqAtGejETaIyRLiZiQf++cbrjltLA5NN/xaXfqeOBOSlMFbemIl5/S5tljmg=="], - "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw=="], + "@unrs/resolver-binding-linux-arm-gnueabihf": ["@unrs/resolver-binding-linux-arm-gnueabihf@1.12.2", "", { "os": "linux", "cpu": "arm" }, "sha512-vZTDvdSISZjJx66OzJqtsOhzifbqRjbmI1Mnu49fQDwog5GtDI4QidRiEAYbZCRj9C8YZEW+3ZjqsyS9GR4k2A=="], - "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.11.1", "", { "os": "linux", "cpu": "arm" }, "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw=="], + "@unrs/resolver-binding-linux-arm-musleabihf": ["@unrs/resolver-binding-linux-arm-musleabihf@1.12.2", "", { "os": "linux", "cpu": "arm" }, "sha512-BiPI+IrIlwcW4nLLMM21+B1dFPzd55yAVgVGrdgDjNef+ch03GdxrcyaIz8X9SsQirh/kCQ7mviyWlMxdh2D7g=="], - "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ=="], + "@unrs/resolver-binding-linux-arm64-gnu": ["@unrs/resolver-binding-linux-arm64-gnu@1.12.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-zJc0H99FEPoFfSrNpa91HYfxzfAJCr502oxNK1cfdC9hlaFI43RT+JFCann9JUgZmLzzntChHyn13Sgn9ljHNg=="], - "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.11.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w=="], + "@unrs/resolver-binding-linux-arm64-musl": ["@unrs/resolver-binding-linux-arm64-musl@1.12.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-KQ3Lki6l+Pz1k/eBipN41ES+YUK30beLGb9YqcB1O542cyLCNE6GaxrfcY3T6EezmGGk84wb5XyO9loTM9tkcA=="], - "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.11.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA=="], + "@unrs/resolver-binding-linux-loong64-gnu": ["@unrs/resolver-binding-linux-loong64-gnu@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-3SJGEh1DborhG6pyxvhPzCT4bbSIVihsvgJc13P1bHG7KLdNDaF9T3gsTwFc7Jw/5Y5/iWOjkEx7Zy0NvCGX3Q=="], - "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ=="], + "@unrs/resolver-binding-linux-loong64-musl": ["@unrs/resolver-binding-linux-loong64-musl@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-jiuG/Obbel7uw1PwHNFfrkiKhLAF6mnyZ6aWlOAVN9WqKm8v0OFGnciJIHu8+CMvXLQ8AD51LPzAoUfT21D5Ew=="], - "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.11.1", "", { "os": "linux", "cpu": "none" }, "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew=="], + "@unrs/resolver-binding-linux-ppc64-gnu": ["@unrs/resolver-binding-linux-ppc64-gnu@1.12.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-q7xRvVpmcfeL+LlZg8Pbbo6QaTZwDU5BaGZbwfhkEsXJn3Was8xYfE0RBH266xZt0rM6B7i8xAYIvjthuUIWHg=="], - "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.11.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg=="], + "@unrs/resolver-binding-linux-riscv64-gnu": ["@unrs/resolver-binding-linux-riscv64-gnu@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-0CVdx6lcnT3Q9inOH8tsMIOJ6ImndllMjqJHg8RLVdB7Vq4SfkEXl9mCSsVNuNA4MCYycRicCUxPCabVHJRr6A=="], - "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w=="], + "@unrs/resolver-binding-linux-riscv64-musl": ["@unrs/resolver-binding-linux-riscv64-musl@1.12.2", "", { "os": "linux", "cpu": "none" }, "sha512-iOwlRo9vnp6R6ohHQS11n0NnfdXx/omhkocmIfaPRpQhKZ+3BDMkkdRVh53qjkFkpPddf+FETA28NwGN7l5l+w=="], - "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.11.1", "", { "os": "linux", "cpu": "x64" }, "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA=="], + "@unrs/resolver-binding-linux-s390x-gnu": ["@unrs/resolver-binding-linux-s390x-gnu@1.12.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-HYJtLfXq94q8iZNFT1lknx258wlkkWhZeUXJRqzKBBUJ00CvZ+N33zgbCqimLjsyw5Va6uUxhVa12mI+kaveEw=="], - "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.11.1", "", { "dependencies": { "@napi-rs/wasm-runtime": "^0.2.11" }, "cpu": "none" }, "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ=="], + "@unrs/resolver-binding-linux-x64-gnu": ["@unrs/resolver-binding-linux-x64-gnu@1.12.2", "", { "os": "linux", "cpu": "x64" }, "sha512-mPsUhunKKDih5O96Y6enDQyHc1SqBPlY1E/SfMWDM3EdJ95Z9CArPeCVwCCqbP45ljvivdEk8Fxn+SIb1rDAJQ=="], - "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.11.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw=="], + "@unrs/resolver-binding-linux-x64-musl": ["@unrs/resolver-binding-linux-x64-musl@1.12.2", "", { "os": "linux", "cpu": "x64" }, "sha512-azrt6+5ydLd8Vt210AAFis/lZevSfPw93EJRIJG+xPu4WCJ8K0kppCTpMyLPcKT7H15M4Jnt2tMp5bOvCkRC6A=="], - "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.11.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ=="], + "@unrs/resolver-binding-openharmony-arm64": ["@unrs/resolver-binding-openharmony-arm64@1.12.2", "", { "os": "none", "cpu": "arm64" }, "sha512-YZ9hP4O0X9PQb8eO980qmLNGH4zT3I9+SZTdt0Pr0YyuGQhYKoOZkV02VzrzyOZJ5xIJ3UFIenKkUkGg8GjgWQ=="], - "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.11.1", "", { "os": "win32", "cpu": "x64" }, "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g=="], + "@unrs/resolver-binding-wasm32-wasi": ["@unrs/resolver-binding-wasm32-wasi@1.12.2", "", { "dependencies": { "@emnapi/core": "1.10.0", "@emnapi/runtime": "1.10.0", "@napi-rs/wasm-runtime": "^1.1.4" }, "cpu": "none" }, "sha512-tYFDIkMxSflfEc/h92ZWNsZlHSwgimbNHSO3PL2JWQHfCuC2q316jMyYU9TIWZsFK2bQwyK5VAdYgn8ygPj69A=="], - "acorn": ["acorn@8.15.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg=="], + "@unrs/resolver-binding-win32-arm64-msvc": ["@unrs/resolver-binding-win32-arm64-msvc@1.12.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-qzNyg3xL0VPQmCaUh+N5jSitce6k+uCBfMDesWRnlULOZaqUkaJ0ybdT+UqlAWJoQjuqfIU/0Ptx9bteN4D82g=="], + + "@unrs/resolver-binding-win32-ia32-msvc": ["@unrs/resolver-binding-win32-ia32-msvc@1.12.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-WD9sY00OfpHVGfsnHZoA8jVT+esS/Bg8z8jzxp5BnDCjjwsuKsPQrzswwpFy4J1AUJbXPRfkpcX0mXrzeXW79g=="], + + "@unrs/resolver-binding-win32-x64-msvc": ["@unrs/resolver-binding-win32-x64-msvc@1.12.2", "", { "os": "win32", "cpu": "x64" }, "sha512-nAB74NfSNKknqQ1RrYj6uz8FcXEomu/MATJZxh/x+BArzN2U3JbOYC0APYzUIGhVY3m5hRxA8VPNdPBoG8txlA=="], + + "acorn": ["acorn@8.18.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ=="], "acorn-jsx": ["acorn-jsx@5.3.2", "", { "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="], - "acorn-walk": ["acorn-walk@8.3.4", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g=="], + "acorn-walk": ["acorn-walk@8.3.5", "", { "dependencies": { "acorn": "^8.11.0" } }, "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw=="], "agent-base": ["agent-base@6.0.2", "", { "dependencies": { "debug": "4" } }, "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ=="], @@ -497,17 +505,15 @@ "ast-types-flow": ["ast-types-flow@0.0.8", "", {}, "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ=="], - "async": ["async@3.2.6", "", {}, "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA=="], - "async-function": ["async-function@1.0.0", "", {}, "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA=="], "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], "available-typed-arrays": ["available-typed-arrays@1.0.7", "", { "dependencies": { "possible-typed-array-names": "^1.0.0" } }, "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ=="], - "axe-core": ["axe-core@4.11.1", "", {}, "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A=="], + "axe-core": ["axe-core@4.13.0", "", {}, "sha512-UzGt8zg7Ny8djbYMhxl2zuEevVa7r2gJjYY5Lwr1xM7+XU2nd6CkIWFTVcCIbAP63vSz71NaVyyuSk9lHKcy0A=="], - "axios": ["axios@1.16.1", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.5", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A=="], + "axios": ["axios@1.20.0", "", { "dependencies": { "follow-redirects": "^1.16.0", "form-data": "^4.0.6", "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg=="], "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], @@ -517,15 +523,15 @@ "base64-arraybuffer": ["base64-arraybuffer@1.0.2", "", {}, "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="], - "baseline-browser-mapping": ["baseline-browser-mapping@2.10.29", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Asa2krT+XTPZINCS+2QcyS8WTkObE77RwkydwF7h6DmnKqbvlalz93m/dnphUyCa6SWSP51VgtEUf2FN+gelFQ=="], + "baseline-browser-mapping": ["baseline-browser-mapping@2.11.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.cjs" } }, "sha512-Grytf1xOxOEMTGRwx6rLGKkTabd4vMg3VrKdj/7joCmV0qgh4QwMMO6xh34YEXQqirAuUdgQGa5orJQQ+69RBw=="], - "brace-expansion": ["brace-expansion@1.1.12", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg=="], + "brace-expansion": ["brace-expansion@1.1.18", "", { "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "browserslist": ["browserslist@4.28.1", "", { "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", "electron-to-chromium": "^1.5.263", "node-releases": "^2.0.27", "update-browserslist-db": "^1.2.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA=="], + "browserslist": ["browserslist@4.28.8", "", { "dependencies": { "baseline-browser-mapping": "^2.11.12", "caniuse-lite": "^1.0.30001809", "electron-to-chromium": "^1.5.402", "node-releases": "^2.0.53", "update-browserslist-db": "^1.3.0" }, "bin": { "browserslist": "cli.js" } }, "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA=="], - "call-bind": ["call-bind@1.0.8", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww=="], + "call-bind": ["call-bind@1.0.9", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "get-intrinsic": "^1.3.0", "set-function-length": "^1.2.2" } }, "sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ=="], "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], @@ -533,7 +539,7 @@ "callsites": ["callsites@3.1.0", "", {}, "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="], - "caniuse-lite": ["caniuse-lite@1.0.30001766", "", {}, "sha512-4C0lfJ0/YPjJQHagaE9x2Elb69CIqEPZeG0anQt9SIvIoOH4a4uaRl73IavyO+0qZh6MDLH//DrXThEYKHkmYA=="], + "caniuse-lite": ["caniuse-lite@1.0.30001810", "", {}, "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg=="], "chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -547,7 +553,7 @@ "cli-spinners": ["cli-spinners@2.9.2", "", {}, "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg=="], - "cli-truncate": ["cli-truncate@5.1.1", "", { "dependencies": { "slice-ansi": "^7.1.0", "string-width": "^8.0.0" } }, "sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A=="], + "cli-truncate": ["cli-truncate@5.2.0", "", { "dependencies": { "slice-ansi": "^8.0.0", "string-width": "^8.2.0" } }, "sha512-xRwvIOMGrfOAnM1JYtqQImuaNtDEv9v6oIYAs4LIHwTiKee8uwvIi363igssOC0O5U04i4AlENs79LQLu9tEMw=="], "client-only": ["client-only@0.0.1", "", {}, "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA=="], @@ -565,6 +571,8 @@ "concat-map": ["concat-map@0.0.1", "", {}, "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="], + "content-type": ["content-type@2.1.0", "", {}, "sha512-mj7UPXE0jaqaOsukNZRUEfEi2AcL7C/vwmwcHV0O97eO1E1pxBZuyjlZrx5seTaNBg1U6+o35wpa35Qfcc+7ag=="], + "convert-source-map": ["convert-source-map@2.0.0", "", {}, "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg=="], "cosmiconfig": ["cosmiconfig@7.1.0", "", { "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", "parse-json": "^5.0.0", "path-type": "^4.0.0", "yaml": "^1.10.0" } }, "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA=="], @@ -575,7 +583,7 @@ "csstype": ["csstype@3.2.3", "", {}, "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="], - "daisyui": ["daisyui@5.5.19", "", {}, "sha512-pbFAkl1VCEh/MPCeclKL61I/MqRIFFhNU7yiXoDDRapXN4/qNCoMxeCCswyxEEhqL5eiTTfwHvucFtOE71C9sA=="], + "daisyui": ["daisyui@5.7.22", "", {}, "sha512-pYii+2NCN0+OIL6Lpuc054LK0QJeNv+GRK9UzN1GRmjdYhYO6WFl0QLoj5oPcitPD7o+okiiI0SKFkn641TxmA=="], "damerau-levenshtein": ["damerau-levenshtein@1.0.8", "", {}, "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA=="], @@ -589,8 +597,6 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "decimal.js": ["decimal.js@10.6.0", "", {}, "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg=="], - "deep-is": ["deep-is@0.1.4", "", {}, "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="], "define-data-property": ["define-data-property@1.1.4", "", { "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A=="], @@ -609,47 +615,49 @@ "duplexer": ["duplexer@0.1.2", "", {}, "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg=="], - "ejs": ["ejs@3.1.10", "", { "dependencies": { "jake": "^10.8.5" }, "bin": { "ejs": "bin/cli.js" } }, "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA=="], + "ejs": ["ejs@6.0.1", "", { "bin": { "ejs": "bin/cli.js" } }, "sha512-UaaM14yby8U3k02ihS1Bmj5Kz2d7CCQM1scxpgs4Mhkq8F1wR2gl3+Ts4h5Ne4Mnt7M9m4Dw7jsuMr3+xO4vZA=="], - "electron-to-chromium": ["electron-to-chromium@1.5.282", "", {}, "sha512-FCPkJtpst28UmFzd903iU7PdeVTfY0KAeJy+Lk0GLZRwgwYHn/irRcaCbQQOmr5Vytc/7rcavsYLvTM8RiHYhQ=="], + "electron-to-chromium": ["electron-to-chromium@1.5.415", "", {}, "sha512-958V+Kbhtgz+SxXeEVKBjrlKRBIDAYvUJfwhjxMZ5S6ut9jAl7l9ZKBkBrvjyjZE36PabLUo2L8kEeV5O4vgJg=="], "emoji-regex": ["emoji-regex@9.2.2", "", {}, "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg=="], - "enhanced-resolve": ["enhanced-resolve@5.21.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-QyL119InA+XXEkNLNTPCXPugSvOfhwv0JOlGNzvxs0hZaiHLNvXSpudUWsOlsXGWJh8G6ckCScEkVHfX3kw/2Q=="], + "enhanced-resolve": ["enhanced-resolve@5.24.5", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A=="], "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], "error-ex": ["error-ex@1.3.4", "", { "dependencies": { "is-arrayish": "^0.2.1" } }, "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ=="], - "es-abstract": ["es-abstract@1.24.1", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-zHXBLhP+QehSSbsS9Pt23Gg964240DPd6QCf8WpkqEXxQ7fhdZzYsocOr5u7apWonsS5EjZDmTF+/slGMyasvw=="], + "es-abstract": ["es-abstract@1.24.2", "", { "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.3.0", "get-proto": "^1.0.1", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-negative-zero": "^2.0.3", "is-regex": "^1.2.1", "is-set": "^2.0.3", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.1", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.4", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.4", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "stop-iteration-iterator": "^1.1.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.19" } }, "sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg=="], + + "es-abstract-get": ["es-abstract-get@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "es-object-atoms": "^1.1.2", "is-callable": "^1.2.7", "object-inspect": "^1.13.4" } }, "sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg=="], "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], - "es-iterator-helpers": ["es-iterator-helpers@1.2.2", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.1", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "safe-array-concat": "^1.1.3" } }, "sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w=="], + "es-iterator-helpers": ["es-iterator-helpers@1.4.0", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.1.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.3.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.5", "math-intrinsics": "^1.1.0" } }, "sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q=="], - "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], + "es-object-atoms": ["es-object-atoms@1.1.2", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw=="], "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], "es-shim-unscopables": ["es-shim-unscopables@1.1.0", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw=="], - "es-to-primitive": ["es-to-primitive@1.3.0", "", { "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g=="], + "es-to-primitive": ["es-to-primitive@1.3.4", "", { "dependencies": { "es-abstract-get": "^1.0.0", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "is-callable": "^1.2.7", "is-date-object": "^1.1.0", "is-symbol": "^1.1.1" } }, "sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-string-regexp": ["escape-string-regexp@4.0.0", "", {}, "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="], - "eslint": ["eslint@9.39.4", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.5", "@eslint/js": "9.39.4", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ=="], + "eslint": ["eslint@9.39.5", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.21.2", "@eslint/config-helpers": "^0.4.2", "@eslint/core": "^0.17.0", "@eslint/eslintrc": "^3.3.6", "@eslint/js": "9.39.5", "@eslint/plugin-kit": "^0.4.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "ajv": "^6.14.0", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.4.0", "eslint-visitor-keys": "^4.2.1", "espree": "^10.4.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.5", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "peerDependencies": { "jiti": "*" }, "optionalPeers": ["jiti"], "bin": { "eslint": "bin/eslint.js" } }, "sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw=="], "eslint-config-next": ["eslint-config-next@16.1.6", "", { "dependencies": { "@next/eslint-plugin-next": "16.1.6", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", "eslint-plugin-react-hooks": "^7.0.0", "globals": "16.4.0", "typescript-eslint": "^8.46.0" }, "peerDependencies": { "eslint": ">=9.0.0", "typescript": ">=3.3.1" }, "optionalPeers": ["typescript"] }, "sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA=="], - "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.9", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g=="], + "eslint-import-resolver-node": ["eslint-import-resolver-node@0.3.10", "", { "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.16.1", "resolve": "^2.0.0-next.6" } }, "sha512-tRrKqFyCaKict5hOd244sL6EQFNycnMQnBe+j8uqGNXYzsImGbGUU4ibtoaBmv5FLwJwcFJNeg1GeVjQfbMrDQ=="], "eslint-import-resolver-typescript": ["eslint-import-resolver-typescript@3.10.1", "", { "dependencies": { "@nolyfill/is-core-module": "1.0.39", "debug": "^4.4.0", "get-tsconfig": "^4.10.0", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.13", "unrs-resolver": "^1.6.2" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "optionalPeers": ["eslint-plugin-import", "eslint-plugin-import-x"] }, "sha512-A1rHYb06zjMGAxdLSkN2fXPBwuSaQ0iO5M/hdyS0Ajj1VBaRp0sPD3dn1FhME3c/JluGFbwSxyCfqdSbtQLAHQ=="], - "eslint-module-utils": ["eslint-module-utils@2.12.1", "", { "dependencies": { "debug": "^3.2.7" } }, "sha512-L8jSWTze7K2mTg0vos/RuLRS5soomksDPoJLXIslC7c8Wmut3bx7CPpJijDcBZtxQ5lrbUdM+s0OlNbz0DCDNw=="], + "eslint-module-utils": ["eslint-module-utils@2.14.0", "", { "dependencies": { "debug": "^3.2.7" }, "peerDependencies": { "eslint": "*" }, "optionalPeers": ["eslint"] }, "sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig=="], "eslint-plugin-import": ["eslint-plugin-import@2.32.0", "", { "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.9", "array.prototype.findlastindex": "^1.2.6", "array.prototype.flat": "^1.3.3", "array.prototype.flatmap": "^1.3.3", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.1", "hasown": "^2.0.2", "is-core-module": "^2.16.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.1", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.9", "tsconfig-paths": "^3.15.0" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA=="], @@ -657,7 +665,7 @@ "eslint-plugin-react": ["eslint-plugin-react@7.37.5", "", { "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA=="], - "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.0.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" } }, "sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA=="], + "eslint-plugin-react-hooks": ["eslint-plugin-react-hooks@7.1.1", "", { "dependencies": { "@babel/core": "^7.24.4", "@babel/parser": "^7.24.4", "hermes-parser": "^0.25.1", "zod": "^3.25.0 || ^4.0.0", "zod-validation-error": "^3.5.0 || ^4.0.0" }, "peerDependencies": { "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0" } }, "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g=="], "eslint-scope": ["eslint-scope@8.4.0", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg=="], @@ -675,7 +683,7 @@ "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], - "expect": ["expect@30.2.0", "", { "dependencies": { "@jest/expect-utils": "30.2.0", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.2.0", "jest-message-util": "30.2.0", "jest-mock": "30.2.0", "jest-util": "30.2.0" } }, "sha512-u/feCi0GPsI+988gU2FLcsHyAHTU0MX1Wg68NhAnN7z/+C5wqG+CY8J53N9ioe8RXgaoz0nBR/TYMf3AycUuPw=="], + "expect": ["expect@30.4.1", "", { "dependencies": { "@jest/expect-utils": "30.4.1", "@jest/get-type": "30.1.0", "jest-matcher-utils": "30.4.1", "jest-message-util": "30.4.1", "jest-mock": "30.4.1", "jest-util": "30.4.1" } }, "sha512-PMARsyh/JtqC20HoGqlFcIlQAyqUtW4PlI1rup1uhYJtKuwAjbvWi3GQMAn+STdHum/dk8xrKfUM1+5SAwpolA=="], "fast-average-color": ["fast-average-color@9.5.2", "", {}, "sha512-FbaU8iPTPljP7tmnVhXbCyASNw/zxnmaNDf88gn5pTXlNvejl9w4FapeWMh6UNDwIjhJJU28EPfQWwW032YgPA=="], @@ -693,8 +701,6 @@ "file-entry-cache": ["file-entry-cache@8.0.0", "", { "dependencies": { "flat-cache": "^4.0.0" } }, "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ=="], - "filelist": ["filelist@1.0.4", "", { "dependencies": { "minimatch": "^5.0.1" } }, "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="], - "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], "find-root": ["find-root@1.1.0", "", {}, "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="], @@ -703,19 +709,19 @@ "flat-cache": ["flat-cache@4.0.1", "", { "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw=="], - "flatted": ["flatted@3.3.3", "", {}, "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg=="], + "flatted": ["flatted@3.4.4", "", {}, "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q=="], "follow-redirects": ["follow-redirects@1.16.0", "", { "peerDependencies": { "debug": "*" }, "optionalPeers": ["debug"] }, "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw=="], "for-each": ["for-each@0.3.5", "", { "dependencies": { "is-callable": "^1.2.7" } }, "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg=="], - "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + "form-data": ["form-data@4.0.6", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.4", "mime-types": "^2.1.35" } }, "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ=="], - "framer-motion": ["framer-motion@12.38.0", "", { "dependencies": { "motion-dom": "^12.38.0", "motion-utils": "^12.36.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g=="], + "framer-motion": ["framer-motion@12.43.0", "", { "dependencies": { "motion-dom": "^12.43.0", "motion-utils": "^12.39.0", "tslib": "^2.4.0" }, "peerDependencies": { "@emotion/is-prop-valid": "*", "react": "^18.0.0 || ^19.0.0", "react-dom": "^18.0.0 || ^19.0.0" }, "optionalPeers": ["@emotion/is-prop-valid", "react", "react-dom"] }, "sha512-1eaL3RvR/kAlbG7UYcpMptEyzPoENO0c6w7ZnB3/hh2vSAz/6uGAFn6fdoqTBguNstf3MsFhJHsD/0DHiclG+g=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "function.prototype.name": ["function.prototype.name@1.1.8", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q=="], + "function.prototype.name": ["function.prototype.name@1.2.0", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2", "hasown": "^2.0.4", "is-callable": "^1.2.7", "is-document.all": "^1.0.0" } }, "sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew=="], "functions-have-names": ["functions-have-names@1.2.3", "", {}, "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ=="], @@ -723,7 +729,7 @@ "gensync": ["gensync@1.0.0-beta.2", "", {}, "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg=="], - "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], @@ -733,7 +739,7 @@ "get-symbol-description": ["get-symbol-description@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg=="], - "get-tsconfig": ["get-tsconfig@4.13.0", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-1VKTZJCwBrvbd+Wn3AOgQP/2Av+TfTCOlE4AcRJE72W1ksZXbAx8PPBR9RzgTeSPzlPMHrbANMH3LbltH73wxQ=="], + "get-tsconfig": ["get-tsconfig@4.14.3", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-++QEw4DIY7WGoukz+/+A/8dGYPT9l9yIadnmSgZ8Rjr3YVSVDipQSO9CdnJo9ePqFqUUqh+wk9uIaoiAwsiPkA=="], "glob-parent": ["glob-parent@6.0.2", "", { "dependencies": { "is-glob": "^4.0.3" } }, "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="], @@ -759,7 +765,7 @@ "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], + "hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="], "hermes-estree": ["hermes-estree@0.25.1", "", {}, "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw=="], @@ -773,7 +779,7 @@ "https-proxy-agent": ["https-proxy-agent@5.0.1", "", { "dependencies": { "agent-base": "6", "debug": "4" } }, "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA=="], - "icu-minify": ["icu-minify@4.12.0", "", { "dependencies": { "@formatjs/icu-messageformat-parser": "^3.4.0" } }, "sha512-zDmM05uav3t3+kxSfRrNlmyXOdj2b+uHA+p04CG32eJabtaHbugXujuL+YfRkwP9joAnf0Uh+RMGCKD5NLa5rQ=="], + "icu-minify": ["icu-minify@4.13.7", "", { "dependencies": { "@formatjs/icu-messageformat-parser": "^3.4.0" } }, "sha512-X9gLFtipsP4HHbmy9urh+palImTR9P6lyhvmgbP6iym8i0IwhcsS4Z6KMjkEoCU6O16OJT5JIZkd8xfDROYo/A=="], "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], @@ -785,7 +791,7 @@ "internal-slot": ["internal-slot@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw=="], - "intl-messageformat": ["intl-messageformat@11.1.1", "", { "dependencies": { "@formatjs/ecma402-abstract": "3.1.0", "@formatjs/fast-memoize": "3.1.0", "@formatjs/icu-messageformat-parser": "3.5.0", "tslib": "^2.8.1" } }, "sha512-vnrF2f4vfsdaFY6tuLZfzGcx1GZFMFAq6c7QdK3HSXNcGXEIQncNgbeAcnpjAOszQzq3Jbol2SwgshIGY08WyA=="], + "intl-messageformat": ["intl-messageformat@11.2.14", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.7", "@formatjs/icu-messageformat-parser": "3.5.17" } }, "sha512-9f2VD1HFuxUvMw0RxsaP8WmMns6JRTnsNB/zghTFrp11ZktiXWwVDeZBPQchBKEmo+Gx/ZhxI7Qht7YglFD4PA=="], "is-array-buffer": ["is-array-buffer@3.0.5", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A=="], @@ -801,13 +807,15 @@ "is-callable": ["is-callable@1.2.7", "", {}, "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA=="], - "is-core-module": ["is-core-module@2.16.1", "", { "dependencies": { "hasown": "^2.0.2" } }, "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w=="], + "is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="], "is-data-view": ["is-data-view@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw=="], "is-date-object": ["is-date-object@1.1.0", "", { "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg=="], - "is-docker": ["is-docker@2.2.1", "", { "bin": { "is-docker": "cli.js" } }, "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="], + "is-docker": ["is-docker@3.0.0", "", { "bin": { "is-docker": "cli.js" } }, "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="], + + "is-document.all": ["is-document.all@1.0.0", "", { "dependencies": { "call-bound": "^1.0.4" } }, "sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -819,6 +827,8 @@ "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-inside-container": ["is-inside-container@1.0.0", "", { "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" } }, "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="], + "is-map": ["is-map@2.0.3", "", {}, "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw=="], "is-negative-zero": ["is-negative-zero@2.0.3", "", {}, "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw=="], @@ -827,7 +837,7 @@ "is-number-object": ["is-number-object@1.1.1", "", { "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw=="], - "is-plain-object": ["is-plain-object@5.0.0", "", {}, "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="], + "is-plain-object": ["is-plain-object@5.1.0", "", {}, "sha512-bUi/yjmtKYcRVUtWRGr0UA6xEFh2I6zWUwMrUXB3s7bmYCaZ8a+0ZsTRkrawh/mzlSD1Y0Ph8bp/U+TvBpWDNw=="], "is-regex": ["is-regex@1.2.1", "", { "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g=="], @@ -847,7 +857,7 @@ "is-weakset": ["is-weakset@2.0.4", "", { "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ=="], - "is-wsl": ["is-wsl@2.2.0", "", { "dependencies": { "is-docker": "^2.0.0" } }, "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="], + "is-wsl": ["is-wsl@3.1.1", "", { "dependencies": { "is-inside-container": "^1.0.0" } }, "sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw=="], "isarray": ["isarray@2.0.5", "", {}, "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw=="], @@ -855,25 +865,23 @@ "iterator.prototype": ["iterator.prototype@1.1.5", "", { "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g=="], - "jake": ["jake@10.9.4", "", { "dependencies": { "async": "^3.2.6", "filelist": "^1.0.4", "picocolors": "^1.1.1" }, "bin": { "jake": "bin/cli.js" } }, "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA=="], + "jest-diff": ["jest-diff@30.4.1", "", { "dependencies": { "@jest/diff-sequences": "30.4.0", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.4.1" } }, "sha512-CRpFK0RtLriVDGcPPAnR6HMVI8bSR2jnUIgralhauzYQZIb4RH9AtEInTuQr65LmmGggGcRT6HIASxwqsVsmlA=="], - "jest-diff": ["jest-diff@30.2.0", "", { "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "pretty-format": "30.2.0" } }, "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A=="], + "jest-matcher-utils": ["jest-matcher-utils@30.4.1", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.4.1", "pretty-format": "30.4.1" } }, "sha512-zvYfX5CaeEkFrrLS9suWe9rvJrm9J1Iv3ua8kIBv9GEPzcnsfBf0bob37la7s67fs0nlBC3EuvkOLnXQKxtx4A=="], - "jest-matcher-utils": ["jest-matcher-utils@30.2.0", "", { "dependencies": { "@jest/get-type": "30.1.0", "chalk": "^4.1.2", "jest-diff": "30.2.0", "pretty-format": "30.2.0" } }, "sha512-dQ94Nq4dbzmUWkQ0ANAWS9tBRfqCrn0bV9AMYdOi/MHW726xn7eQmMeRTpX2ViC00bpNaWXq+7o4lIQ3AX13Hg=="], + "jest-message-util": ["jest-message-util@30.4.1", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.4.1", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "jest-util": "30.4.1", "picomatch": "^4.0.3", "pretty-format": "30.4.1", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-kwCKIvq0MCW1HzLoGola9Te6JUdzgV0loyKJ3Qghrkz9i5/RRIHsL95BMQc2HBBhlBKC4j22K9p11TGHH8RBpQ=="], - "jest-message-util": ["jest-message-util@30.2.0", "", { "dependencies": { "@babel/code-frame": "^7.27.1", "@jest/types": "30.2.0", "@types/stack-utils": "^2.0.3", "chalk": "^4.1.2", "graceful-fs": "^4.2.11", "micromatch": "^4.0.8", "pretty-format": "30.2.0", "slash": "^3.0.0", "stack-utils": "^2.0.6" } }, "sha512-y4DKFLZ2y6DxTWD4cDe07RglV88ZiNEdlRfGtqahfbIjfsw1nMCPx49Uev4IA/hWn3sDKyAnSPwoYSsAEdcimw=="], + "jest-mock": ["jest-mock@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "jest-util": "30.4.1" } }, "sha512-/i8SVb8/NSB7RfNi8gfqu8gxLV23KaL5EpAttyb9iz8qWRIqXRLflycz/32wXsYkOnaUlx8NAKnJYtpsmXUmfw=="], - "jest-mock": ["jest-mock@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "jest-util": "30.2.0" } }, "sha512-JNNNl2rj4b5ICpmAcq+WbLH83XswjPbjH4T7yvGzfAGCPh1rw+xVNbtk+FnRslvt9lkCcdn9i1oAoKUuFsOxRw=="], + "jest-regex-util": ["jest-regex-util@30.4.0", "", {}, "sha512-mWlvLviKIgIQ8VCuM1xRdD0TWp3zlzionlmDBjuXVBs+VkmXq6FgW9T4Emr7oGz/Rk6feDCGyiugolcQEyp3mg=="], - "jest-regex-util": ["jest-regex-util@30.0.1", "", {}, "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA=="], + "jest-util": ["jest-util@30.4.1", "", { "dependencies": { "@jest/types": "30.4.1", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.3" } }, "sha512-vjQb1sACEiv13DKJMDToJpzVW0joCsIQrmbg0fi7CyOOt+g9jTuQl2A216pWRBYhOVt53XbL/2LbMKg1BECWOw=="], - "jest-util": ["jest-util@30.2.0", "", { "dependencies": { "@jest/types": "30.2.0", "@types/node": "*", "chalk": "^4.1.2", "ci-info": "^4.2.0", "graceful-fs": "^4.2.11", "picomatch": "^4.0.2" } }, "sha512-QKNsM0o3Xe6ISQU869e+DhG+4CK/48aHYdJZGlFQVTjnbvgpcKyxpzk29fGiO7i/J8VENZ+d2iGnSsvmuHywlA=="], - - "jiti": ["jiti@2.6.1", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ=="], + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "js-yaml": ["js-yaml@4.1.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA=="], + "js-yaml": ["js-yaml@4.3.1", "", { "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "sha512-CY6crGq313MX8GkwvB7tzgp99vjQxY1++5y10/BKN/GUfHqWaOGQMNZkBvqSzsZKWk/ijwHlWzzkLulsGHhjWQ=="], "jsesc": ["jsesc@3.1.0", "", { "bin": { "jsesc": "bin/jsesc" } }, "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA=="], @@ -935,7 +943,7 @@ "loose-envify": ["loose-envify@1.4.0", "", { "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q=="], - "lru-cache": ["lru-cache@11.3.6", "", {}, "sha512-Gf/KoL3C/MlI7Bt0PGI9I+TeTC/I6r/csU58N4BSNc4lppLBeKsOdFYkK+dX0ABDUMJNfCHTyPpzwwO21Awd3A=="], + "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="], "lucide-react": ["lucide-react@0.563.0", "", { "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-8dXPB2GI4dI8jV4MgUDGBeLdGk8ekfqVZ0BdLcrRzocGgG75ltNEmWS+gE7uokKF/0oSUuczNDT+g9hFJ23FkA=="], @@ -959,31 +967,33 @@ "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "motion-dom": ["motion-dom@12.38.0", "", { "dependencies": { "motion-utils": "^12.36.0" } }, "sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA=="], + "motion-dom": ["motion-dom@12.43.0", "", { "dependencies": { "motion-utils": "^12.39.0" } }, "sha512-azKON4d9S65PEoFUiQTMTgPheEmzf2QngdRc50AKfJp9Q9mmcBVw22c8eMq9k8kxOFHdL7+WZY7N/5F/lwiDag=="], - "motion-utils": ["motion-utils@12.36.0", "", {}, "sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg=="], + "motion-utils": ["motion-utils@12.39.0", "", {}, "sha512-8nadJAJjTtqRkmRF36FoJTrywK9nnFmnPwnSMyxaOCU7GDjN9RTMJIxx9De8ErM+vpPhMccr/6fo5WciyQLnMQ=="], "mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], - "nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], + "nanoid": ["nanoid@3.3.18", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w=="], "napi-postinstall": ["napi-postinstall@0.3.4", "", { "bin": { "napi-postinstall": "lib/cli.js" } }, "sha512-PHI5f1O0EP5xJ9gQmFGMS6IZcrVvTjpXjz7Na41gTE7eE2hK11lg04CECCYEEjdc17EV4DO+fkGEtt7TpTaTiQ=="], "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], - "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], + "negotiator": ["negotiator@1.1.0", "", { "dependencies": { "content-type": "^2.1.0" } }, "sha512-NMPBRMJgiQHjbd8phG3Vebdx4kZ1H121rbl5IkMqeOsahptB9BKo/d7oJ3zTXqTgagn2bWlNSXkh0QUGM31RYg=="], "next": ["next@16.1.6", "", { "dependencies": { "@next/env": "16.1.6", "@swc/helpers": "0.5.15", "baseline-browser-mapping": "^2.8.3", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "optionalDependencies": { "@next/swc-darwin-arm64": "16.1.6", "@next/swc-darwin-x64": "16.1.6", "@next/swc-linux-arm64-gnu": "16.1.6", "@next/swc-linux-arm64-musl": "16.1.6", "@next/swc-linux-x64-gnu": "16.1.6", "@next/swc-linux-x64-musl": "16.1.6", "@next/swc-win32-arm64-msvc": "16.1.6", "@next/swc-win32-x64-msvc": "16.1.6", "sharp": "^0.34.4" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "optionalPeers": ["@opentelemetry/api", "@playwright/test", "babel-plugin-react-compiler", "sass"], "bin": { "next": "dist/bin/next" } }, "sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw=="], - "next-intl": ["next-intl@4.12.0", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.8.1", "@parcel/watcher": "^2.4.1", "@swc/core": "^1.15.2", "icu-minify": "^4.12.0", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "^4.12.0", "po-parser": "^2.1.1", "use-intl": "^4.12.0" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-v8KpppWG0yLLlChJ3Of6uoPew9LeRDBAtY6vpJmF7YJmBZlHEzzoEL4w1g1dAU+VleEPNoXNm9hg1eEsKWV5hw=="], + "next-intl": ["next-intl@4.13.7", "", { "dependencies": { "@formatjs/intl-localematcher": "^0.8.1", "@parcel/watcher": "^2.4.1", "@swc/core": "~1.15.47", "icu-minify": "^4.13.7", "negotiator": "^1.0.0", "next-intl-swc-plugin-extractor": "4.13.7", "po-parser": "^2.1.1", "use-intl": "^4.13.7" }, "peerDependencies": { "next": "^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0", "typescript": "*" }, "optionalPeers": ["typescript"] }, "sha512-j7KnGWt4Ih6TnW1x714R8bX3H+DYP25fqLTYTfUzAFXh0Od57WuQYM/Sf58yalvIXhE6y8sBYHlrCFmr0jPy3g=="], - "next-intl-swc-plugin-extractor": ["next-intl-swc-plugin-extractor@4.12.0", "", {}, "sha512-jUxVEu1Nryjt4YgaDktSys7ioOgQfcNPF/SF2dbPNxbVb6U+P1INRgHeCVN+EC59H2rnTFIQwbddmOCrUWFr3g=="], + "next-intl-swc-plugin-extractor": ["next-intl-swc-plugin-extractor@4.13.7", "", {}, "sha512-MxOUMGKncc/D6rofu0O80I6Ebr3gqlH8XiEb0Uu5TZmX7DqY3NVHs70Uy4bvtgWmHeDwsra6KU8EBtfRVGRv7Q=="], "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], - "node-releases": ["node-releases@2.0.27", "", {}, "sha512-nmh3lCkYZ3grZvqcCH+fjmQ7X+H0OeZgP40OierEaAptX4XofMh5kwNbWh7lBduUzCcV/8kZ+NDLCwm2iorIlA=="], + "node-exports-info": ["node-exports-info@1.6.2", "", { "dependencies": { "array.prototype.flatmap": "^1.3.3", "es-errors": "^1.3.0", "object.entries": "^1.1.9", "semver": "^6.3.1" } }, "sha512-kXs9Go0cah0qHVV2v389IXQLdLCeE1xfFtjOAF+iobu0OIoG1pje8At2vMHyaPMiPMnG/LWP50twML21eMcAag=="], + + "node-releases": ["node-releases@2.0.53", "", {}, "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], @@ -1007,7 +1017,7 @@ "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], - "own-keys": ["own-keys@1.0.1", "", { "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg=="], + "own-keys": ["own-keys@1.0.2", "", { "dependencies": { "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg=="], "p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], @@ -1027,17 +1037,19 @@ "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], - "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "picomatch": ["picomatch@4.0.7", "", {}, "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA=="], - "po-parser": ["po-parser@2.1.1", "", {}, "sha512-ECF4zHLbUItpUgE3OTtLKlPjeBN+fKEczj2zYjDfCGOzicNs0GK3Vg2IoAYwx7LH/XYw43fZQP6xnZ4TkNxSLQ=="], + "po-parser": ["po-parser@2.2.0", "", {}, "sha512-NdTrKgh0oO7+y+RFX8KKhOB438x/j94UGXEFzl/7pHH0JjWSn42iJ9tgmPksIO6n1JKDHmNDcejPJfKspljB9g=="], "possible-typed-array-names": ["possible-typed-array-names@1.1.0", "", {}, "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg=="], - "postcss": ["postcss@8.5.14", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg=="], + "postcss": ["postcss@8.5.26", "", { "dependencies": { "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ=="], + + "powershell-utils": ["powershell-utils@0.1.0", "", {}, "sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A=="], "prelude-ls": ["prelude-ls@1.2.1", "", {}, "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="], - "pretty-format": ["pretty-format@30.2.0", "", { "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", "react-is": "^18.3.1" } }, "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA=="], + "pretty-format": ["pretty-format@30.4.1", "", { "dependencies": { "@jest/schemas": "30.4.1", "ansi-styles": "^5.2.0", "react-is-18": "npm:react-is@^18.3.1", "react-is-19": "npm:react-is@^19.2.5" } }, "sha512-K6KiKMHTL4jjX4u3Kir2EW07nRfcqVTXIImx50wbjHQTcZPgg+gjVeNTIT3l3L1Rd4UefxfogquC9J37SoFyyw=="], "prism-react-renderer": ["prism-react-renderer@2.4.1", "", { "dependencies": { "@types/prismjs": "^1.26.0", "clsx": "^2.0.0" }, "peerDependencies": { "react": ">=16.0.0" } }, "sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig=="], @@ -1055,7 +1067,11 @@ "react-dom": ["react-dom@19.2.4", "", { "dependencies": { "scheduler": "^0.27.0" }, "peerDependencies": { "react": "^19.2.4" } }, "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ=="], - "react-is": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + "react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + + "react-is-18": ["react-is@18.3.1", "", {}, "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="], + + "react-is-19": ["react-is@19.2.8", "", {}, "sha512-s5un28nYxKJw5gvUHyW5PCC28CvBqLu9r3cWgzHT4Vo/5fqqkFcdRYsGcKf50WMPpjjFZS5d76fn3YCo2njKwQ=="], "react-select": ["react-select@5.10.2", "", { "dependencies": { "@babel/runtime": "^7.12.0", "@emotion/cache": "^11.4.0", "@emotion/react": "^11.8.1", "@floating-ui/dom": "^1.0.1", "@types/react-transition-group": "^4.4.0", "memoize-one": "^6.0.0", "prop-types": "^15.6.0", "react-transition-group": "^4.3.0", "use-isomorphic-layout-effect": "^1.2.0" }, "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" } }, "sha512-Z33nHdEFWq9tfnfVXaiM12rbJmk+QjFEztWLtmXqQhz6Al4UZZ9xc0wiatmGtUOCCnHN0WizL3tCMYRENX4rVQ=="], @@ -1071,7 +1087,7 @@ "regexp.prototype.flags": ["regexp.prototype.flags@1.5.4", "", { "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA=="], - "resolve": ["resolve@1.22.11", "", { "dependencies": { "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ=="], + "resolve": ["resolve@2.0.0-next.7", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.2", "node-exports-info": "^1.6.0", "object-keys": "^1.1.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-tqt+NBWwyaMgw3zDsnygx4CByWjQEJHOPMdslYhppaQSJUtL/D4JO9CcBBlhPoI8lz9oJIDXkwXfhF4aWqP8xQ=="], "resolve-from": ["resolve-from@4.0.0", "", {}, "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="], @@ -1085,7 +1101,7 @@ "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], - "safe-array-concat": ["safe-array-concat@1.1.3", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q=="], + "safe-array-concat": ["safe-array-concat@1.1.4", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "get-intrinsic": "^1.3.0", "has-symbols": "^1.1.0", "isarray": "^2.0.5" } }, "sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg=="], "safe-push-apply": ["safe-push-apply@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" } }, "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA=="], @@ -1093,7 +1109,7 @@ "scheduler": ["scheduler@0.27.0", "", {}, "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q=="], - "semver": ["semver@7.7.3", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q=="], + "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], "set-function-length": ["set-function-length@1.2.2", "", { "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg=="], @@ -1107,9 +1123,9 @@ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="], - "side-channel": ["side-channel@1.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw=="], + "side-channel": ["side-channel@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4", "side-channel-list": "^1.0.1", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ=="], - "side-channel-list": ["side-channel-list@1.0.0", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA=="], + "side-channel-list": ["side-channel-list@1.0.1", "", { "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.4" } }, "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w=="], "side-channel-map": ["side-channel-map@1.0.1", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA=="], @@ -1123,7 +1139,7 @@ "slash": ["slash@5.1.0", "", {}, "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg=="], - "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + "slice-ansi": ["slice-ansi@8.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg=="], "source-map": ["source-map@0.5.7", "", {}, "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ=="], @@ -1143,9 +1159,9 @@ "string.prototype.repeat": ["string.prototype.repeat@1.0.0", "", { "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w=="], - "string.prototype.trim": ["string.prototype.trim@1.2.10", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA=="], + "string.prototype.trim": ["string.prototype.trim@1.2.11", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.24.2", "es-object-atoms": "^1.1.2", "has-property-descriptors": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w=="], - "string.prototype.trimend": ["string.prototype.trimend@1.0.9", "", { "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ=="], + "string.prototype.trimend": ["string.prototype.trimend@1.0.10", "", { "dependencies": { "call-bind": "^1.0.9", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.2" } }, "sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw=="], "string.prototype.trimstart": ["string.prototype.trimstart@1.0.8", "", { "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg=="], @@ -1165,61 +1181,61 @@ "tailwind-scrollbar": ["tailwind-scrollbar@4.0.2", "", { "dependencies": { "prism-react-renderer": "^2.4.1" }, "peerDependencies": { "tailwindcss": "4.x" } }, "sha512-wAQiIxAPqk0MNTPptVe/xoyWi27y+NRGnTwvn4PQnbvB9kp8QUBiGl/wsfoVBHnQxTmhXJSNt9NHTmcz9EivFA=="], - "tailwindcss": ["tailwindcss@4.3.0", "", {}, "sha512-y6nxMGB1nMW9R6k96e5gdIFzcfL/gTJRNaqGes1YvkLnPVXzWgbqFF2yLC0T8G774n24cx3Pe8XrKoniCOAH+Q=="], + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], - "text-camel-case": ["text-camel-case@1.2.10", "", { "dependencies": { "text-pascal-case": "1.2.10" } }, "sha512-KNrWeZzQT+gh73V1LnmgTkjK7V+tMRjLCc6VrGwkqbiRdnGVIWBUgIvVnvnaVCxIvZ/2Ke8DCmgPirlQcCqD3Q=="], + "text-camel-case": ["text-camel-case@1.2.11", "", { "dependencies": { "text-pascal-case": "^1.2.11" } }, "sha512-2ZsM/gOlB1tyza+8lGLvs6gtPuZ9qEYuKPa+gwo38m65wkY4k323SK4hT7ku8r5wIKyspUYIWSk1aB9/Jjxr7A=="], - "text-capital-case": ["text-capital-case@1.2.10", "", { "dependencies": { "text-no-case": "1.2.10", "text-upper-case-first": "1.2.10" } }, "sha512-yvViUJKSSQcRO58je224bhPHg/Hij9MEY43zuKShtFzrPwW/fOAarUJ5UkTMSB81AOO1m8q+JiFdxMF4etKZbA=="], + "text-capital-case": ["text-capital-case@1.2.11", "", { "dependencies": { "text-no-case": "^1.2.11", "text-upper-case-first": "^1.2.11" } }, "sha512-30A7B7+VUvevEmPE0xWK1Z2z0ncl/JTjSUBLfjpoXrkwuPpmNTVbjHShRTN3cX9GIuZn/P3jvR+TO9JiTZcl8A=="], - "text-case": ["text-case@1.2.10", "", { "dependencies": { "text-camel-case": "1.2.10", "text-capital-case": "1.2.10", "text-constant-case": "1.2.10", "text-dot-case": "1.2.10", "text-header-case": "1.2.10", "text-is-lower-case": "1.2.10", "text-is-upper-case": "1.2.10", "text-kebab-case": "1.2.10", "text-lower-case": "1.2.10", "text-lower-case-first": "1.2.10", "text-no-case": "1.2.10", "text-param-case": "1.2.10", "text-pascal-case": "1.2.10", "text-path-case": "1.2.10", "text-sentence-case": "1.2.10", "text-snake-case": "1.2.10", "text-swap-case": "1.2.10", "text-title-case": "1.2.10", "text-upper-case": "1.2.10", "text-upper-case-first": "1.2.10" } }, "sha512-5bY3Ks/u7OJ5YO69iyXrG5Xf2wUZeyko7U78nPUnYoSeuNeAfA5uAix5hTspfkl6smm3yCBObrex+kFvzeIcJg=="], + "text-case": ["text-case@1.2.11", "", { "dependencies": { "text-camel-case": "^1.2.11", "text-capital-case": "^1.2.11", "text-constant-case": "^1.2.11", "text-dot-case": "^1.2.11", "text-header-case": "^1.2.11", "text-is-lower-case": "^1.2.11", "text-is-upper-case": "^1.2.11", "text-kebab-case": "^1.2.11", "text-lower-case": "^1.2.11", "text-lower-case-first": "^1.2.11", "text-no-case": "^1.2.11", "text-param-case": "^1.2.11", "text-pascal-case": "^1.2.11", "text-path-case": "^1.2.11", "text-sentence-case": "^1.2.11", "text-snake-case": "^1.2.11", "text-swap-case": "^1.2.11", "text-title-case": "^1.2.11", "text-upper-case": "^1.2.11", "text-upper-case-first": "^1.2.11" } }, "sha512-LbdWNQeuXWbfav+pxBxvaefkziffMYeSA53BHp52cgJa9rjiC0dkjum9AKrH8iQWoQJ4InGPSGexLeerGFaZ1Q=="], - "text-constant-case": ["text-constant-case@1.2.10", "", { "dependencies": { "text-no-case": "1.2.10", "text-upper-case": "1.2.10" } }, "sha512-/OfU798O2wrwKN9kQf71WhJeAlklGnbby0Tupp+Ez9NXymW+6oF9LWDRTkN+OreTmHucdvp4WQd6O5Rah5zj8A=="], + "text-constant-case": ["text-constant-case@1.2.11", "", { "dependencies": { "text-no-case": "^1.2.11", "text-upper-case": "^1.2.11" } }, "sha512-XnTBILsa7UpMWncUCchqIybZlg15FUcrlyNaWIJ8ybPy54qcoN513EXFswueyizuAgyJFXPCwwSFbSji6kw/Uw=="], - "text-dot-case": ["text-dot-case@1.2.10", "", { "dependencies": { "text-no-case": "1.2.10" } }, "sha512-vf4xguy5y6e39RlDZeWZFMDf2mNkR23VTSVb9e68dUSpfJscG9/1YWWpW3n8TinzQxBZlsn5sT5olL33MvvQXw=="], + "text-dot-case": ["text-dot-case@1.2.11", "", { "dependencies": { "text-no-case": "^1.2.11" } }, "sha512-7SLKiT45KZO0qad0+p+GvC0+F+6pZ851HJcTcBJiSF88HsK/e1qErlGLtVBT6hkTHIaAj48WfSyQr4lZRv1xJQ=="], - "text-header-case": ["text-header-case@1.2.10", "", { "dependencies": { "text-capital-case": "1.2.10" } }, "sha512-sVb1NY9bwxtu+Z7CVyWbr+I0AkWtF0kEHL/Zz5V2u/WdkjK5tKBwl5nXf0NGy9da4ZUYTBb+TmQpOIqihzvFMQ=="], + "text-header-case": ["text-header-case@1.2.11", "", { "dependencies": { "text-capital-case": "^1.2.11" } }, "sha512-7OBHd2g7X+aH6rXMC3cANFh6yvhXjXkyumw2NaRwJRIk343pP2e1SQCTCfowPDmmi8wkZVqz1fdWNq5LwvcBOQ=="], - "text-is-lower-case": ["text-is-lower-case@1.2.10", "", {}, "sha512-dMTeTgrdWWfYf3fKxvjMkDPuXWv96cWbd1Uym6Zjv9H855S1uHxjkFsGbTYJ2tEK0NvAylRySTQlI6axlcMc4w=="], + "text-is-lower-case": ["text-is-lower-case@1.2.11", "", {}, "sha512-dBqPAkNmX7eTM7ZbS3D/UBCQ5i9EXt5tujF2wIGGbZ1+aN8bY7Qda4mDpxgd6Hbzf/z10uQWRNzupl99wFQ8CQ=="], - "text-is-upper-case": ["text-is-upper-case@1.2.10", "", {}, "sha512-PGD/cXoXECGAY1HVZxDdmpJUW2ZUAKQ6DTamDfCHC9fc/z4epOz0pB/ThBnjJA3fz+d2ApkMjAfZDjuZFcodzg=="], + "text-is-upper-case": ["text-is-upper-case@1.2.11", "", {}, "sha512-MZeUIYEYfKZ2FSeg0vnHCH4mHXLgGzes+iz2K+4BYnhnkEa2svKA1nNjQAqTUiVNHOPqPCuzmUr1LsyQZ73uyA=="], - "text-kebab-case": ["text-kebab-case@1.2.10", "", { "dependencies": { "text-no-case": "1.2.10" } }, "sha512-3XZJAApx5JQpUO7eXo7GQ2TyRcGw3OVbqxz6QJb2h+N8PbLLbz3zJVeXdGrhTkoUIbkSZ6PmHx6LRDaHXTdMcA=="], + "text-kebab-case": ["text-kebab-case@1.2.11", "", { "dependencies": { "text-no-case": "^1.2.11" } }, "sha512-RIg9iN6VwH+JrX9dFdm1nd1efPGR9LjNc0CiQz496sQETeKGkDEzxES/ZzxbkerrAL2DFEMGdLXckzDz1OEDBQ=="], - "text-lower-case": ["text-lower-case@1.2.10", "", {}, "sha512-c9j5pIAN3ObAp1+4R7970e1bgtahTRF/5ZQdX2aJBuBngYTYZZIck0NwFXUKk5BnYpLGsre5KFHvpqvf4IYKgg=="], + "text-lower-case": ["text-lower-case@1.2.11", "", {}, "sha512-txTy6y0y8M23Lhf0mk8WcvXTqlf4OQ3AGnDsRB6o3uMNfIa0CJDol2s1PdKNa63rt5B2277zkZCCn6Xeq//big=="], - "text-lower-case-first": ["text-lower-case-first@1.2.10", "", {}, "sha512-Oro84jZPDLD9alfdZWmtFHYTvCaaSz2o4thPtjMsK4GAkTyVg9juYXWj0y0YFyjLYGH69muWsBe4/MR5S7iolw=="], + "text-lower-case-first": ["text-lower-case-first@1.2.11", "", {}, "sha512-QR483XLyuyIpq8tKu1ds3Q1jfsgfaa/p9rtoQKHe6Rv5ah9ic/SUzTGN0MQ7UIS9APADd8SUPn5TTh1Z2/ACyg=="], - "text-no-case": ["text-no-case@1.2.10", "", { "dependencies": { "text-lower-case": "1.2.10" } }, "sha512-4/m79pzQrywrwEG5lCULY1lQvFY+EKjhH9xSMT6caPK5plqzm9Y7rXyv+UXPd3s9qH6QODZnvsAYWW3M0JgxRA=="], + "text-no-case": ["text-no-case@1.2.11", "", { "dependencies": { "text-lower-case": "^1.2.11" } }, "sha512-wazS7FEq0Ct3aJzeE8MEMcSs0eW4+/X/fwdotv/rG66bLS+g1T0pa0gUsbBGjjLFs191AIXVIry+bYE0uaaBBQ=="], - "text-param-case": ["text-param-case@1.2.10", "", { "dependencies": { "text-dot-case": "1.2.10" } }, "sha512-hkavcLsRRzZcGryPAshct1AwIOMj/FexYjMaLpGZCYYBn1lcZEeyMzJZPSckzkOYpq35LYSQr3xZto9XU5OAsw=="], + "text-param-case": ["text-param-case@1.2.11", "", { "dependencies": { "text-dot-case": "^1.2.11" } }, "sha512-3EMMAMLSz/mJXOnATNnrS+dZAvghpq09VhOVYDOkUnbm5zlYc6iU5AZOKVDpiAVVllQ9P1h5IKVZzsEYrdIRGw=="], - "text-pascal-case": ["text-pascal-case@1.2.10", "", { "dependencies": { "text-no-case": "1.2.10" } }, "sha512-/kynZD8vTYOmm/RECjIDaz3qYEUZc/N/bnC79XuAFxwXjdNVjj/jGovKJLRzqsYK/39N22XpGcVmGg7yIrbk6w=="], + "text-pascal-case": ["text-pascal-case@1.2.11", "", { "dependencies": { "text-no-case": "^1.2.11" } }, "sha512-BNhQ1O/g/Q4dH5gPyLIJLDLDknl2dipBwV629ScsiZCKJaCLGXYhTXp23rp9Htg3O5OSSsiU3mqDKq+pBmwTSw=="], - "text-path-case": ["text-path-case@1.2.10", "", { "dependencies": { "text-dot-case": "1.2.10" } }, "sha512-vbKdRCaVEeOaW6sm24QP9NbH7TS9S4ZQ3u19H8eylDox7m2HtFwYIBjAPv+v3z4I/+VjrMy9LB54lNP1uEqRHw=="], + "text-path-case": ["text-path-case@1.2.11", "", { "dependencies": { "text-dot-case": "^1.2.11" } }, "sha512-FsJU4BmMdtLtmnBK/XRJPqTwLF8yFiTEClHjxlQjSAG5Xt9R4p6D1WNaM1CI2dG5Lr4rsFM4jiVC620m0AsRbw=="], "text-segmentation": ["text-segmentation@1.0.3", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="], - "text-sentence-case": ["text-sentence-case@1.2.10", "", { "dependencies": { "text-no-case": "1.2.10", "text-upper-case-first": "1.2.10" } }, "sha512-NO4MRlbfxFhl9QgQLuCL4xHmvE7PUWHVPWsZxQ5nzRtDjXOUllWvtsvl8CP5tBEvBmzg0kwfflxfhRtr5vBQGg=="], + "text-sentence-case": ["text-sentence-case@1.2.11", "", { "dependencies": { "text-no-case": "^1.2.11", "text-upper-case-first": "^1.2.11" } }, "sha512-ApiVsvdLy+Wb8x7mZRVuoy8VO12jJ22G2djVM3ZZbUhXVIkqGgHxmiXRwdhRPoWGojK9n53m7jviJgBVNdRn+g=="], - "text-snake-case": ["text-snake-case@1.2.10", "", { "dependencies": { "text-dot-case": "1.2.10" } }, "sha512-6ttMZ+B9jkHKun908HYr4xSvEtlbfJJ4MvpQ06JEKRGhwjMI0x8t2Wywp+MEzN6142O6E/zKhra18KyBL6cvXA=="], + "text-snake-case": ["text-snake-case@1.2.11", "", { "dependencies": { "text-dot-case": "^1.2.11" } }, "sha512-NOEQvjyyVABB41SS8dUx423Y6hWS+Z4TrAAJg1xzCkOD3q9y0JtdJjCvCA1FWI8oDu+HiIOp/N446uDM8j54XQ=="], - "text-swap-case": ["text-swap-case@1.2.10", "", {}, "sha512-vO3jwInIk0N77oEFakYZ2Hn/llTmRwf2c3RvkX/LfvmLWVp+3QcIc6bwUEtbqGQ5Xh2okjFhYrfkHZstVc3N4Q=="], + "text-swap-case": ["text-swap-case@1.2.11", "", {}, "sha512-PBmC5xvZdDZ4suikydpeXH0s4JV2XHelMj9/OEXEbA3oLpdV2A+B4BspVDWVw7C2Gi5eCareqk/7EE8I1/WwgQ=="], - "text-title-case": ["text-title-case@1.2.10", "", { "dependencies": { "text-no-case": "1.2.10", "text-upper-case-first": "1.2.10" } }, "sha512-bqA+WWexUMWu9A3fdNar+3GXXW+c5xOvMyuK5hOx/w0AlqhyQptyCrMFjGB8Fd9dxbryBNmJ+5rWtC1OBDxlaA=="], + "text-title-case": ["text-title-case@1.2.11", "", { "dependencies": { "text-no-case": "^1.2.11", "text-upper-case-first": "^1.2.11" } }, "sha512-V1GZy0XlqdkYUQm0tqm1jqtYlXJqFVMreBCTUReOaz8d/JbozTSpZrcakIeV8+1bN7LsvfhPFhA5zREiax6YIA=="], - "text-upper-case": ["text-upper-case@1.2.10", "", {}, "sha512-L1AtZ8R+jtSMTq0Ffma9R4Rzbrc3iuYW89BmWFH41AwnDfRmEBlBOllm1ZivRLQ/6pEu2p+3XKBHx9fsMl2CWg=="], + "text-upper-case": ["text-upper-case@1.2.11", "", {}, "sha512-BfTL7yB1YIRlVGNdZUvno013hOq2cRs07fDR2ApppOXRDuKrEmsLDEY82xXlDzQHELp0jexqkI+NeyPIl6MtMw=="], - "text-upper-case-first": ["text-upper-case-first@1.2.10", "", {}, "sha512-VXs7j7BbpKwvolDh5fwpYRmMrUHGkxbY8E90fhBzKUoKfadvWmPT/jFieoZ4UPLzr208pXvQEFbb2zO9Qzs9Fg=="], + "text-upper-case-first": ["text-upper-case-first@1.2.11", "", {}, "sha512-vgfbwKo8TEJbRsapR9LWWvIJRnv8u9aXVa6cyYOAQQmurCx54Cnt59x5fKdiq+hFaBJ51AbzCgMpbP3p65/pHQ=="], - "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + "tinyglobby": ["tinyglobby@0.2.17", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" } }, "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g=="], "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "totalist": ["totalist@3.0.1", "", {}, "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ=="], - "ts-api-utils": ["ts-api-utils@2.4.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-3TaVTaAv2gTiMB35i3FiGJaRfwb3Pyn/j3m/bfAvGe8FB7CF6u+LMYqYlDh7reQf7UNvoTvdfAqHGmPGOSsPmA=="], + "ts-api-utils": ["ts-api-utils@2.5.0", "", { "peerDependencies": { "typescript": ">=4.8.4" } }, "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA=="], "ts-to-zod": ["ts-to-zod@5.1.0", "", { "dependencies": { "@clack/prompts": "1.0.0-alpha.4", "@oclif/core": "^4.5.4", "@typescript/vfs": "^1.5.0", "chokidar": "^4.0.3", "listr2": "^9.0.4", "slash": "^5.1.0", "text-case": "^1.2.4", "tslib": "^2.3.1", "tsutils": "^3.21.0", "typescript": "^5.2.2", "zod": "^4.1.5" }, "bin": { "ts-to-zod": "bin/run" } }, "sha512-giqqlvRHunlJqG9tBL/KAO3wWIVZGF//mZiWLKm/fdQnKnz4EN2mtiK5cugN9slytBkdMEXQIaLvMzIScbhhFw=="], @@ -1239,23 +1255,23 @@ "typed-array-byte-offset": ["typed-array-byte-offset@1.0.4", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ=="], - "typed-array-length": ["typed-array-length@1.0.7", "", { "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg=="], + "typed-array-length": ["typed-array-length@1.0.8", "", { "dependencies": { "call-bind": "^1.0.9", "for-each": "^0.3.5", "gopd": "^1.2.0", "is-typed-array": "^1.1.15", "possible-typed-array-names": "^1.1.0", "reflect.getprototypeof": "^1.0.10" } }, "sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], - "typescript-eslint": ["typescript-eslint@8.54.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.54.0", "@typescript-eslint/parser": "8.54.0", "@typescript-eslint/typescript-estree": "8.54.0", "@typescript-eslint/utils": "8.54.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <6.0.0" } }, "sha512-CKsJ+g53QpsNPqbzUsfKVgd3Lny4yKZ1pP4qN3jdMOg/sisIDLGyDMezycquXLE5JsEU0wp3dGNdzig0/fmSVQ=="], + "typescript-eslint": ["typescript-eslint@8.68.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.68.0", "@typescript-eslint/parser": "8.68.0", "@typescript-eslint/typescript-estree": "8.68.0", "@typescript-eslint/utils": "8.68.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "sha512-MHy0Y0ynqeEbx/S45+i/bBssdy3X6KNBfmJAP35GrgtNxu2TQ5K5xsFDhAnmsq1jvpdoZOPG1LGtJo0HWqYCrQ=="], "unbox-primitive": ["unbox-primitive@1.1.0", "", { "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw=="], "undici-types": ["undici-types@7.24.6", "", {}, "sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg=="], - "unrs-resolver": ["unrs-resolver@1.11.1", "", { "dependencies": { "napi-postinstall": "^0.3.0" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.11.1", "@unrs/resolver-binding-android-arm64": "1.11.1", "@unrs/resolver-binding-darwin-arm64": "1.11.1", "@unrs/resolver-binding-darwin-x64": "1.11.1", "@unrs/resolver-binding-freebsd-x64": "1.11.1", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", "@unrs/resolver-binding-linux-x64-musl": "1.11.1", "@unrs/resolver-binding-wasm32-wasi": "1.11.1", "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" } }, "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg=="], + "unrs-resolver": ["unrs-resolver@1.12.2", "", { "dependencies": { "napi-postinstall": "^0.3.4" }, "optionalDependencies": { "@unrs/resolver-binding-android-arm-eabi": "1.12.2", "@unrs/resolver-binding-android-arm64": "1.12.2", "@unrs/resolver-binding-darwin-arm64": "1.12.2", "@unrs/resolver-binding-darwin-x64": "1.12.2", "@unrs/resolver-binding-freebsd-x64": "1.12.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.12.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.12.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.12.2", "@unrs/resolver-binding-linux-arm64-musl": "1.12.2", "@unrs/resolver-binding-linux-loong64-gnu": "1.12.2", "@unrs/resolver-binding-linux-loong64-musl": "1.12.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.12.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.12.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.12.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.12.2", "@unrs/resolver-binding-linux-x64-gnu": "1.12.2", "@unrs/resolver-binding-linux-x64-musl": "1.12.2", "@unrs/resolver-binding-openharmony-arm64": "1.12.2", "@unrs/resolver-binding-wasm32-wasi": "1.12.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.12.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.12.2", "@unrs/resolver-binding-win32-x64-msvc": "1.12.2" } }, "sha512-dmlRxBJJayXjqTwC+JtF1HhJmgf3ftQ3YejFcZrf4+KKtJv0qDsK1pjqaaVjG7wJ5NJ6UVP1OqRMQ71Z4C3rxQ=="], - "update-browserslist-db": ["update-browserslist-db@1.2.3", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w=="], + "update-browserslist-db": ["update-browserslist-db@1.3.1", "", { "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "peerDependencies": { "browserslist": ">= 4.21.0" }, "bin": { "update-browserslist-db": "cli.js" } }, "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ=="], "uri-js": ["uri-js@4.4.1", "", { "dependencies": { "punycode": "^2.1.0" } }, "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg=="], - "use-intl": ["use-intl@4.12.0", "", { "dependencies": { "@formatjs/fast-memoize": "^3.1.0", "@schummar/icu-type-parser": "1.21.5", "icu-minify": "^4.12.0", "intl-messageformat": "^11.1.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-r+qVb7UI1+kiOhjYsmsNUCY+jrnjVopwGeFlmMyQj4YInlwZzgMeMSv9n8MqnWWy77HL5BVM8K2WgX50SbtcpA=="], + "use-intl": ["use-intl@4.13.7", "", { "dependencies": { "@formatjs/fast-memoize": "^3.1.0", "@schummar/icu-type-parser": "1.21.5", "icu-minify": "^4.13.7", "intl-messageformat": "^11.1.0" }, "peerDependencies": { "react": "^17.0.0 || ^18.0.0 || >=19.0.0-rc <19.0.0 || ^19.0.0" } }, "sha512-vWapep/2GESovKEmkxaG1Bkt6AWwANCWrM4kwOYbMmvQ4IsBGJFx9l66h8DNCcU0jSOzNtSFyRXFcYvgAak/Cg=="], "use-isomorphic-layout-effect": ["use-isomorphic-layout-effect@1.2.1", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-tpZZ+EX0gaghDAiFR37hj5MgY6ZN55kLiPkJsKxBMZ6GZdOSPJXiOzPM984oPYZ5AnehYx5WQp1+ME8I/P/pRA=="], @@ -1271,7 +1287,7 @@ "which-collection": ["which-collection@1.0.2", "", { "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw=="], - "which-typed-array": ["which-typed-array@1.1.20", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-LYfpUkmqwl0h9A2HL09Mms427Q1RZWuOHsukfVcKRq9q95iQxdw0ix1JQrqbcDR9PH1QDwf5Qo8OZb5lksZ8Xg=="], + "which-typed-array": ["which-typed-array@1.1.22", "", { "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.9", "call-bound": "^1.0.4", "for-each": "^0.3.5", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw=="], "widest-line": ["widest-line@3.1.0", "", { "dependencies": { "string-width": "^4.0.0" } }, "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg=="], @@ -1281,11 +1297,13 @@ "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], - "ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="], + "ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], + + "wsl-utils": ["wsl-utils@0.4.0", "", { "dependencies": { "is-wsl": "^3.1.0", "powershell-utils": "^0.1.0" } }, "sha512-9YmF+2sFEd+T7TkwlmE337F0IVzfDvDknhtpBQxxXzEOfgPphGlFYpyx0cTuCIFj8/p+sqwBYAeGxOMNSzPPDA=="], "yallist": ["yallist@3.1.1", "", {}, "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="], - "yaml": ["yaml@1.10.2", "", {}, "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="], + "yaml": ["yaml@1.10.3", "", {}, "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA=="], "yocto-queue": ["yocto-queue@0.1.0", "", {}, "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="], @@ -1293,7 +1311,7 @@ "zod-validation-error": ["zod-validation-error@4.0.2", "", { "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } }, "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ=="], - "zustand": ["zustand@5.0.13", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ=="], + "zustand": ["zustand@5.0.15", "", { "peerDependencies": { "@types/react": ">=18.0.0", "immer": ">=9.0.6", "react": ">=18.0.0", "use-sync-external-store": ">=1.2.0" }, "optionalPeers": ["@types/react", "immer", "react", "use-sync-external-store"] }, "sha512-MpSEjRiBkA9crSYeOUH32rJC7SVqAbm0Fqcqge/bUi2PPoLcBWKOsG+C8mevmpr8TwXHBVkChbbJiyvkE+i/3A=="], "@babel/core/json5": ["json5@2.2.3", "", { "bin": { "json5": "lib/cli.js" } }, "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg=="], @@ -1309,39 +1327,39 @@ "@eslint/eslintrc/globals": ["globals@14.0.0", "", {}, "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ=="], - "@formatjs/ecma402-abstract/@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.0", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg=="], + "@jest/pattern/@types/node": ["@types/node@26.3.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw=="], - "@formatjs/ecma402-abstract/@formatjs/intl-localematcher": ["@formatjs/intl-localematcher@0.8.0", "", { "dependencies": { "@formatjs/fast-memoize": "3.1.0", "tslib": "^2.8.1" } }, "sha512-zgMYWdUlmEZpX2Io+v3LHrfq9xZ6khpQVf9UAw2xYWhGerGgI9XgH1HvL/A34jWiruUJpYlP5pk4g8nIcaDrXQ=="], + "@jest/types/@types/node": ["@types/node@26.3.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw=="], - "@jest/pattern/@types/node": ["@types/node@25.1.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA=="], - - "@jest/types/@types/node": ["@types/node@25.1.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA=="], - - "@oclif/core/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@oclif/core/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], "@oclif/core/supports-color": ["supports-color@8.1.1", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.10.0", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.1", "tslib": "^2.4.0" }, "bundled": true }, "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.3", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.3", "tslib": "^2.4.0" }, "bundled": true }, "sha512-zLpS5asjEb7lq8jYLq37N6XKaE41DIexlY1rF/z4/tIl3wo13Sqm28fRyfIsKZD+NZ8mM5RoKkpW/rBcuoSZSg=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA=="], - "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-ELEBe8PsLvvJ6QMr0zLt8ffvOHW/dc1m3CEzNMg7aJUv3bMaoDtw2TXyDAwkYBuroxxuHEwhRTLJSe5sya547g=="], "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.4", "", { "dependencies": { "@tybys/wasm-util": "^0.10.1" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow=="], - "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.6", "", {}, "sha512-BAg6QkE8W+TuQLrrw0Ugr7HegXduRuuj8/ti2kSOc+jz1dmx8/WNcjr6XGnq5YpDWxFwwaavqD0+jIUOKelTsw=="], - "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], + "@typescript-eslint/typescript-estree/minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="], - "browserslist/baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="], + "@typescript-eslint/visitor-keys/eslint-visitor-keys": ["eslint-visitor-keys@5.0.1", "", {}, "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA=="], + + "@unrs/resolver-binding-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.10.0", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA=="], + + "babel-plugin-macros/resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="], "chalk/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "cli-truncate/string-width": ["string-width@8.1.1", "", { "dependencies": { "get-east-asian-width": "^1.3.0", "strip-ansi": "^7.1.0" } }, "sha512-KpqHIdDL9KwYk22wEOg/VIqYbrnLeSApsKT/bSj6Ez7pn3CftUiLAv2Lccpq1ALcpLV9UX1Ppn92npZWu2w/aw=="], + "cli-truncate/string-width": ["string-width@8.2.2", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg=="], "eslint-import-resolver-node/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], @@ -1349,49 +1367,33 @@ "eslint-plugin-import/debug": ["debug@3.2.7", "", { "dependencies": { "ms": "^2.1.1" } }, "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ=="], - "eslint-plugin-import/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - "eslint-plugin-import/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "eslint-plugin-jsx-a11y/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-plugin-react/minimatch": ["minimatch@3.1.2", "", { "dependencies": { "brace-expansion": "^1.1.7" } }, "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="], - - "eslint-plugin-react/resolve": ["resolve@2.0.0-next.5", "", { "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA=="], - "eslint-plugin-react/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], - "eslint-plugin-react-hooks/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "fast-glob/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], - "filelist/minimatch": ["minimatch@5.1.6", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g=="], - - "hoist-non-react-statics/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], - - "intl-messageformat/@formatjs/fast-memoize": ["@formatjs/fast-memoize@3.1.0", "", { "dependencies": { "tslib": "^2.8.1" } }, "sha512-b5mvSWCI+XVKiz5WhnBCY3RJ4ZwfjAidU0yVlKa3d3MSgKmH1hC3tBGEAtYyN5mqL7N0G5x0BOUYyO8CEupWgg=="], - "jest-message-util/slash": ["slash@3.0.0", "", {}, "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="], - "jest-mock/@types/node": ["@types/node@25.1.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA=="], + "jest-mock/@types/node": ["@types/node@26.3.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw=="], - "jest-util/@types/node": ["@types/node@25.1.0", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-t7frlewr6+cbx+9Ohpl0NOTKXZNV9xHRmNOvql47BFJKcEG1CxtxlPEEe+gR9uhVWM4DwhnvTF110mIL4yP9RA=="], + "jest-util/@types/node": ["@types/node@26.3.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-L3fgrnchriRC2ExBflb8j4uZZURHZfQsmQeyVzhjcHW4kkwVyo8/0h1B2MVzMTrYUJYu6G7EWs14hW/L9putqw=="], "listr2/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "log-update/ansi-escapes": ["ansi-escapes@7.2.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw=="], + "log-update/ansi-escapes": ["ansi-escapes@7.3.0", "", { "dependencies": { "environment": "^1.0.0" } }, "sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg=="], - "log-update/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "log-update/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + + "log-update/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], "log-update/wrap-ansi": ["wrap-ansi@9.0.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "string-width": "^7.0.0", "strip-ansi": "^7.1.0" } }, "sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww=="], - "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - - "next/baseline-browser-mapping": ["baseline-browser-mapping@2.9.19", "", { "bin": { "baseline-browser-mapping": "dist/cli.js" } }, "sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg=="], + "micromatch/picomatch": ["picomatch@2.3.2", "", {}, "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA=="], "next/postcss": ["postcss@8.4.31", "", { "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ=="], - "prop-types/react-is": ["react-is@16.13.1", "", {}, "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="], + "node-exports-info/semver": ["semver@6.3.1", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA=="], "slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], @@ -1401,45 +1403,49 @@ "string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - "ts-to-zod/zod": ["zod@4.3.6", "", {}, "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg=="], - "tsutils/tslib": ["tslib@1.14.1", "", {}, "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="], "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], - "@jest/pattern/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "@jest/pattern/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], - "@jest/types/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "@jest/types/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], - "@oclif/core/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@oclif/core/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], - "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "cli-truncate/string-width/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - "filelist/minimatch/brace-expansion": ["brace-expansion@2.0.2", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ=="], + "jest-mock/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], - "jest-mock/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - - "jest-util/@types/node/undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], + "jest-util/@types/node/undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="], "listr2/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "listr2/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "listr2/wrap-ansi/strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="], + "listr2/wrap-ansi/strip-ansi": ["strip-ansi@7.2.0", "", { "dependencies": { "ansi-regex": "^6.2.2" } }, "sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w=="], - "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "log-update/slice-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], + + "log-update/slice-ansi/is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + + "log-update/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], "log-update/wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], "log-update/wrap-ansi/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], - "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "@oclif/core/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "@typescript-eslint/typescript-estree/minimatch/brace-expansion/balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="], + + "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], "listr2/wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], - "listr2/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.2.2", "", {}, "sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg=="], + "listr2/wrap-ansi/strip-ansi/ansi-regex": ["ansi-regex@6.3.0", "", {}, "sha512-WpDfL7NO6j7tH88IDBNVdUJxDh9nmCteAVW9dsep846XdwF4naCBK+/tGLX3KJgcpgMRXCFlTM2hKGoK9FsdrQ=="], "log-update/wrap-ansi/string-width/emoji-regex": ["emoji-regex@10.6.0", "", {}, "sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A=="], } diff --git a/data/as.json.br b/data/as.json.br index 0eb23b8..30fd1fe 100644 Binary files a/data/as.json.br and b/data/as.json.br differ diff --git a/data/avatar.json.br b/data/avatar.json.br index a9652f5..7b7eca0 100644 Binary files a/data/avatar.json.br and b/data/avatar.json.br differ diff --git a/data/lightcone.json.br b/data/lightcone.json.br index a1c400b..b42773a 100644 Binary files a/data/lightcone.json.br and b/data/lightcone.json.br differ diff --git a/data/metadata.json.br b/data/metadata.json.br index 870817b..bebf5dc 100644 Binary files a/data/metadata.json.br and b/data/metadata.json.br differ diff --git a/data/moc.json.br b/data/moc.json.br index 11b18dc..ba71ca3 100644 Binary files a/data/moc.json.br and b/data/moc.json.br differ diff --git a/data/monster.json.br b/data/monster.json.br index 87455c6..4f307a8 100644 Binary files a/data/monster.json.br and b/data/monster.json.br differ diff --git a/data/peak.json.br b/data/peak.json.br index bb1736b..f3e3853 100644 Binary files a/data/peak.json.br and b/data/peak.json.br differ diff --git a/data/pf.json.br b/data/pf.json.br index 1914b7b..879b332 100644 Binary files a/data/pf.json.br and b/data/pf.json.br differ diff --git a/data/relic.json.br b/data/relic.json.br index 5a98229..335c4b9 100644 Binary files a/data/relic.json.br and b/data/relic.json.br differ diff --git a/eslint.config.mjs b/eslint.config.mjs index 4e2cf76..e1c2327 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -6,6 +6,7 @@ const eslintConfig = [...nextCoreWebVitals, ...nextTypescript, { "node_modules/**", ".next/**", ".history/**", + ".agents/**", "out/**", "build/**", "next-env.d.ts", diff --git a/messages/de.json b/messages/de.json index 06e8660..f9012e8 100644 --- a/messages/de.json +++ b/messages/de.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Firefly-Tools von Firefly Shelter" - }, - "DataPage": { - "skillType": "Fähigkeitstyp", - "skillName": "Fähigkeitsname", - "character": "Charakter", - "id": "ID", - "path": "Pfad", - "rarity": "Seltenheit", - "element": "Element", - "technique": "Technik", - "talent": "Talent", - "basic": "Standardangriff", - "skill": "Fähigkeit", - "ultimate": "Ultimate", - "servant": "Diener", - "damage": "Schaden", - "type": "Typ", - "warrior": "Die Zerstörung", - "knight": "Die Bewahrung", - "mage": "Die Gelehrsamkeit", - "priest": "Der Überfluss", - "rogue": "Die Jagd", - "shaman": "Die Harmonie", - "warlock": "Die Nichtigkeit", - "memory": "Die Erinnerung", - "elation": "Die Freude", - "fire": "Feuer", - "ice": "Eis", - "imaginary": "Imaginär", - "physical": "Physisch", - "quantum": "Quanten", - "thunder": "Blitz", - "wind": "Wind", - "hp": "LP", - "atk": "ANG", - "speed": "GES", - "critRate": "Krit. Rate", - "critDmg": "Krit. SCH", - "breakEffect": "Brucheffekt", - "effectRes": "Effekt-WDS", - "energyRegenerationRate": "Energie-Regenerationsrate", - "effectHitRate": "Effekttrefferquote", - "outgoingHealingBoost": "Ausgehender Heilungsbonus", - "fireDmgBoost": "Feuer-SCH-Bonus", - "iceDmgBoost": "Eis-SCH-Bonus", - "imaginaryDmgBoost": "Imaginär-SCH-Bonus", - "physicalDmgBoost": "Physisch-SCH-Bonus", - "quantumDmgBoost": "Quanten-SCH-Bonus", - "thunderDmgBoost": "Blitz-SCH-Bonus", - "windDmgBoost": "Wind-SCH-Bonus", - "pursued": "Zusätzlicher Schaden", - "true damage": "Wahrer Schaden", - "elationdamage": "Freude-Schaden", - "follow-up": "Folgeangriff-Schaden", - "elemental damage": "Bruch- und Superbruch-Schaden", - "dot": "Schaden über Zeit", - "qte": "QTE-Fähigkeit", - "level": "Stufe", - "relics": "Relikte", - "eidolons": "Eidolons", - "lightcones": "Lichtkegel", - "loadData": "Daten laden", - "exportData": "Daten exportieren", - "connectSetting": "Verbindungseinstellungen", - "connected": "Verbunden", - "unconnected": "Nicht verbunden", - "psConnection": "PS-Verbindung", - "connectionType": "Verbindungstyp", - "status": "Status", - "connectPs": "Mit PS verbinden", - "disconnect": "Trennen", - "other": "Andere", - "freeSr": "FreeSR", - "database": "Datenbank", - "enka": "Enka", - "monsterSetting": "Monstereinstellungen", - "serverUrl": "Server-URL", - "privateType": "Privater Typ", - "local": "Lokal", - "server": "Server", - "username": "Benutzername", - "password": "Passwort", - "placeholderServerUrl": "Server-URL eingeben", - "placeholderUsername": "Benutzernamen eingeben", - "placeholderPassword": "Passwort eingeben", - "connectedSuccess": "Erfolgreich mit PS verbunden", - "connectedFailed": "Verbindung zu PS fehlgeschlagen", - "syncSuccess": "Daten erfolgreich mit PS synchronisiert", - "syncFailed": "Fehler beim Synchronisieren", - "sync": "Synchronisieren", - "importSetting": "Import-Einstellungen", - "profile": "Profil", - "default": "Standard", - "copyProfiles": "Profile kopieren", - "addNewProfile": "Neues Profil hinzufügen", - "createNewProfile": "Neues Profil erstellen", - "editProfile": "Profil bearbeiten", - "placeholderProfileName": "Profilnamen eingeben", - "profileName": "Profilname", - "create": "Erstellen", - "update": "Aktualisieren", - "characterInformation": "Charakterinformationen", - "skills": "Fähigkeiten", - "showcaseCard": "Showcase-Karte", - "comingSoon": "Demnächst", - "characterName": "Charaktername", - "placeholderCharacter": "Charakternamen eingeben", - "characterSettings": "Charaktereinstellungen", - "levelConfiguration": "Stufenkonfiguration", - "characterLevel": "Charakterstufe", - "max": "MAX", - "ultimateEnergy": "Ultimate-Energie", - "currentEnergy": "Aktuelle Energie", - "setTo50": "Auf 50% setzen", - "battleConfiguration": "Kampfkonfiguration", - "useTechnique": "Technik verwenden", - "techniqueNote": "Technikeffekte vor dem Kampf aktivieren", - "enhancement": "Verbesserung", - "enhancementLevel": "Verbesserungsstufe", - "origin": "Ursprung", - "enhancedNote": "Höhere Verbesserungen schalten Fähigkeiten frei", - "lightconeEquipment": "Lichtkegel-Ausrüstung", - "lightconeSettings": "Lichtkegel-Einstellungen", - "placeholderLevel": "Stufe eingeben", - "superimpositionRank": "Überlagerungsrang", - "ranksNote": "Höhere Ränge bieten stärkere Effekte", - "changeLightcone": "Lichtkegel wechseln", - "removeLightcone": "Lichtkegel entfernen", - "equipLightcone": "Lichtkegel ausrüsten", - "noLightconeEquipped": "Kein Lichtkegel ausgerüstet", - "equipLightconeNote": "Rüste einen Lichtkegel aus, um deinen Charakter zu stärken", - "filter": "Filter", - "selectedCharacters": "Ausgewählte Charaktere", - "selectedProfiles": "Ausgewählte Profile", - "clearAll": "Alles löschen", - "selectAll": "Alles auswählen", - "copy": "Kopieren", - "copied": "Kopiert", - "noAvatarSelected": "Kein Charakter ausgewählt", - "noAvatarToCopySelected": "Kein Charakter zum Kopieren ausgewählt", - "pleaseSelectAtLeastOneProfile": "Bitte wähle mindestens ein Profil aus", - "pleaseEnterUid": "Bitte UID eingeben", - "failedToFetchEnkaData": "Fehler beim Abrufen der Enka-Daten", - "pleaseSelectAtLeastOneCharacter": "Bitte wähle mindestens einen Charakter aus", - "noDataToImport": "Keine Daten zum Importieren", - "pleaseSelectAFile": "Bitte wähle eine Datei", - "fileMustBeAValidJsonFile": "Die Datei muss eine gültige JSON-Datei sein", - "importEnkaDataSuccess": "Enka-Daten erfolgreich importiert", - "importFreeSRDataSuccess": "FreeSR-Daten erfolgreich importiert", - "importDatabaseSuccess": "Datenbank erfolgreich importiert", - "getData": "Daten abrufen", - "import": "Importieren", - "freeSRImport": "FreeSR-Import", - "onlySupportFreeSRJsonFile": "Unterstützt nur FreeSR-JSON-Dateien", - "pickAFile": "Datei auswählen", - "lightConeSetting": "Lichtkegel-Einstellung", - "relicMaker": "Relikt-Ersteller", - "pleaseSelectAllOptions": "Bitte wähle alle Optionen", - "relicSavedSuccessfully": "Relikt erfolgreich gespeichert", - "mainSettings": "Haupteinstellungen", - "mainStat": "Hauptwert", - "set": "Set", - "pleaseSelectASet": "Bitte wähle ein Set", - "effectBonus": "Effektbonus", - "totalRoll": "Gesamte Aufwertungen", - "randomizeStats": "Werte zufällig", - "randomizeRolls": "Aufwertungen zufällig", - "selectASubStat": "Wähle einen Nebenwert", - "selectASet": "Wähle ein Set", - "selectAMainStat": "Wähle einen Hauptwert", - "save": "Speichern", - "reset": "Zurücksetzen", - "roll": "Aufwertung", - "step": "Schritt", - "memoryOfChaos": "Vergessene Halle", - "pureFiction": "Reine Fiktion", - "apocalypticShadow": "Apokalyptischer Schatten", - "customEnemy": "Benutzerdefinierter Feind", - "simulatedUniverse": "Universum-Simulation", - "floor": "Ebene", - "side": "Seite", - "wave": "Welle", - "stage": "Phase", - "useCycleCount": "Zyklen-Zählung verwenden?", - "useTurbulenceBuff": "Turbulenz-Buff verwenden?", - "firstHalfEnemies": "Gegner erste Hälfte", - "secondHalfEnemies": "Gegner zweite Hälfte", - "firstNodeEnemies": "Gegner Knoten 1", - "secondNodeEnemies": "Gegner Knoten 2", - "thirdNodeEnemies": "Gegner Knoten 3", - "firstNode": "Knoten 1", - "secondNode": "Knoten 2", - "thirdNode": "Knoten 3", - "listEnemies": "Gegnerliste", - "turbulenceBuff": "Turbulenz-Buff", - "noEventSelected": "Kein Ereignis ausgewählt", - "noTurbulenceBuff": "Kein Turbulenz-Buff", - "upper": "Oben", - "lower": "Unten", - "upperToLower": "Oben -> Unten", - "lowerToUpper": "Unten -> Oben", - "selectMOCEvent": "MOC-Ereignis wählen", - "selectPFEvent": "PF-Ereignis wählen", - "selectASEvent": "AS-Ereignis wählen", - "selectCEEvent": "CE-Ereignis wählen", - "selectEvent": "Ereignis wählen", - "selectFloor": "Ebene wählen", - "selectSide": "Seite wählen", - "selectBuff": "Buff wählen", - "selectStage": "Phase wählen", - "previous": "Zurück", - "next": "Weiter", - "noMonstersFound": "Keine Monster gefunden", - "addNewWave": "Neue Welle hinzufügen", - "searchStage": "Phase suchen...", - "noStageFound": "Keine Phase gefunden", - "searchMonster": "Monster suchen...", - "changeRelic": "Relikt wechseln", - "deleteRelic": "Relikt löschen", - "deleteRelicConfirm": "Möchtest du das Relikt auf diesem Platz wirklich löschen?", - "setEffects": "Effekte einstellen", - "details": "Details", - "normal": "Standardangriff", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Firefly-Tools von Firefly Shelter" + }, + "DataPage": { + "skillType": "Fähigkeitstyp", + "skillName": "Fähigkeitsname", + "character": "Charakter", + "id": "ID", + "path": "Pfad", + "rarity": "Seltenheit", + "element": "Element", + "technique": "Technik", + "talent": "Talent", + "basic": "Standardangriff", + "skill": "Fähigkeit", + "ultimate": "Ultimate", + "servant": "Diener", + "damage": "Schaden", + "type": "Typ", + "warrior": "Die Zerstörung", + "knight": "Die Bewahrung", + "mage": "Die Gelehrsamkeit", + "priest": "Der Überfluss", + "rogue": "Die Jagd", + "shaman": "Die Harmonie", + "warlock": "Die Nichtigkeit", + "memory": "Die Erinnerung", + "elation": "Die Freude", + "fire": "Feuer", + "ice": "Eis", + "imaginary": "Imaginär", + "physical": "Physisch", + "quantum": "Quanten", + "thunder": "Blitz", + "wind": "Wind", + "hp": "LP", + "atk": "ANG", + "speed": "GES", + "critRate": "Krit. Rate", + "critDmg": "Krit. SCH", + "breakEffect": "Brucheffekt", + "effectRes": "Effekt-WDS", + "energyRegenerationRate": "Energie-Regenerationsrate", + "effectHitRate": "Effekttrefferquote", + "outgoingHealingBoost": "Ausgehender Heilungsbonus", + "fireDmgBoost": "Feuer-SCH-Bonus", + "iceDmgBoost": "Eis-SCH-Bonus", + "imaginaryDmgBoost": "Imaginär-SCH-Bonus", + "physicalDmgBoost": "Physisch-SCH-Bonus", + "quantumDmgBoost": "Quanten-SCH-Bonus", + "thunderDmgBoost": "Blitz-SCH-Bonus", + "windDmgBoost": "Wind-SCH-Bonus", + "pursued": "Zusätzlicher Schaden", + "true damage": "Wahrer Schaden", + "elationdamage": "Freude-Schaden", + "follow-up": "Folgeangriff-Schaden", + "elemental damage": "Bruch- und Superbruch-Schaden", + "dot": "Schaden über Zeit", + "qte": "QTE-Fähigkeit", + "level": "Stufe", + "relics": "Relikte", + "eidolons": "Eidolons", + "lightcones": "Lichtkegel", + "loadData": "Daten laden", + "exportData": "Daten exportieren", + "connectSetting": "Verbindungseinstellungen", + "connected": "Verbunden", + "unconnected": "Nicht verbunden", + "psConnection": "PS-Verbindung", + "connectionType": "Verbindungstyp", + "status": "Status", + "connectPs": "Mit PS verbinden", + "disconnect": "Trennen", + "other": "Andere", + "freeSr": "FreeSR", + "database": "Datenbank", + "enka": "Enka", + "monsterSetting": "Monstereinstellungen", + "serverUrl": "Server-URL", + "privateType": "Privater Typ", + "local": "Lokal", + "server": "Server", + "username": "Benutzername", + "password": "Passwort", + "placeholderServerUrl": "Server-URL eingeben", + "placeholderUsername": "Benutzernamen eingeben", + "placeholderPassword": "Passwort eingeben", + "connectedSuccess": "Erfolgreich mit PS verbunden", + "connectedFailed": "Verbindung zu PS fehlgeschlagen", + "syncSuccess": "Daten erfolgreich mit PS synchronisiert", + "syncFailed": "Fehler beim Synchronisieren", + "sync": "Synchronisieren", + "importSetting": "Import-Einstellungen", + "profile": "Profil", + "default": "Standard", + "copyProfiles": "Profile kopieren", + "addNewProfile": "Neues Profil hinzufügen", + "createNewProfile": "Neues Profil erstellen", + "editProfile": "Profil bearbeiten", + "placeholderProfileName": "Profilnamen eingeben", + "profileName": "Profilname", + "create": "Erstellen", + "update": "Aktualisieren", + "characterInformation": "Charakterinformationen", + "skills": "Fähigkeiten", + "showcaseCard": "Showcase-Karte", + "comingSoon": "Demnächst", + "characterName": "Charaktername", + "placeholderCharacter": "Charakternamen eingeben", + "characterSettings": "Charaktereinstellungen", + "levelConfiguration": "Stufenkonfiguration", + "characterLevel": "Charakterstufe", + "max": "MAX", + "ultimateEnergy": "Ultimate-Energie", + "currentEnergy": "Aktuelle Energie", + "setTo50": "Auf 50% setzen", + "battleConfiguration": "Kampfkonfiguration", + "useTechnique": "Technik verwenden", + "techniqueNote": "Technikeffekte vor dem Kampf aktivieren", + "enhancement": "Verbesserung", + "enhancementLevel": "Verbesserungsstufe", + "origin": "Ursprung", + "enhancedNote": "Höhere Verbesserungen schalten Fähigkeiten frei", + "lightconeEquipment": "Lichtkegel-Ausrüstung", + "lightconeSettings": "Lichtkegel-Einstellungen", + "placeholderLevel": "Stufe eingeben", + "superimpositionRank": "Überlagerungsrang", + "ranksNote": "Höhere Ränge bieten stärkere Effekte", + "changeLightcone": "Lichtkegel wechseln", + "removeLightcone": "Lichtkegel entfernen", + "equipLightcone": "Lichtkegel ausrüsten", + "noLightconeEquipped": "Kein Lichtkegel ausgerüstet", + "equipLightconeNote": "Rüste einen Lichtkegel aus, um deinen Charakter zu stärken", + "filter": "Filter", + "selectedCharacters": "Ausgewählte Charaktere", + "selectedProfiles": "Ausgewählte Profile", + "clearAll": "Alles löschen", + "selectAll": "Alles auswählen", + "copy": "Kopieren", + "copied": "Kopiert", + "noAvatarSelected": "Kein Charakter ausgewählt", + "noAvatarToCopySelected": "Kein Charakter zum Kopieren ausgewählt", + "pleaseSelectAtLeastOneProfile": "Bitte wähle mindestens ein Profil aus", + "pleaseEnterUid": "Bitte UID eingeben", + "failedToFetchEnkaData": "Fehler beim Abrufen der Enka-Daten", + "pleaseSelectAtLeastOneCharacter": "Bitte wähle mindestens einen Charakter aus", + "noDataToImport": "Keine Daten zum Importieren", + "pleaseSelectAFile": "Bitte wähle eine Datei", + "fileMustBeAValidJsonFile": "Die Datei muss eine gültige JSON-Datei sein", + "importEnkaDataSuccess": "Enka-Daten erfolgreich importiert", + "importFreeSRDataSuccess": "FreeSR-Daten erfolgreich importiert", + "importDatabaseSuccess": "Datenbank erfolgreich importiert", + "getData": "Daten abrufen", + "import": "Importieren", + "freeSRImport": "FreeSR-Import", + "onlySupportFreeSRJsonFile": "Unterstützt nur FreeSR-JSON-Dateien", + "pickAFile": "Datei auswählen", + "lightConeSetting": "Lichtkegel-Einstellung", + "relicMaker": "Relikt-Ersteller", + "pleaseSelectAllOptions": "Bitte wähle alle Optionen", + "relicSavedSuccessfully": "Relikt erfolgreich gespeichert", + "mainSettings": "Haupteinstellungen", + "mainStat": "Hauptwert", + "set": "Set", + "pleaseSelectASet": "Bitte wähle ein Set", + "effectBonus": "Effektbonus", + "totalRoll": "Gesamte Aufwertungen", + "randomizeStats": "Werte zufällig", + "randomizeRolls": "Aufwertungen zufällig", + "selectASubStat": "Wähle einen Nebenwert", + "selectASet": "Wähle ein Set", + "selectAMainStat": "Wähle einen Hauptwert", + "save": "Speichern", + "reset": "Zurücksetzen", + "roll": "Aufwertung", + "step": "Schritt", + "memoryOfChaos": "Vergessene Halle", + "pureFiction": "Reine Fiktion", + "apocalypticShadow": "Apokalyptischer Schatten", + "customEnemy": "Benutzerdefinierter Feind", + "simulatedUniverse": "Universum-Simulation", + "floor": "Ebene", + "side": "Seite", + "wave": "Welle", + "stage": "Phase", + "useCycleCount": "Zyklen-Zählung verwenden?", + "useTurbulenceBuff": "Turbulenz-Buff verwenden?", + "firstHalfEnemies": "Gegner erste Hälfte", + "secondHalfEnemies": "Gegner zweite Hälfte", + "firstNodeEnemies": "Gegner Knoten 1", + "secondNodeEnemies": "Gegner Knoten 2", + "thirdNodeEnemies": "Gegner Knoten 3", + "firstNode": "Knoten 1", + "secondNode": "Knoten 2", + "thirdNode": "Knoten 3", + "listEnemies": "Gegnerliste", + "turbulenceBuff": "Turbulenz-Buff", + "noEventSelected": "Kein Ereignis ausgewählt", + "noTurbulenceBuff": "Kein Turbulenz-Buff", + "upper": "Oben", + "lower": "Unten", + "upperToLower": "Oben -> Unten", + "lowerToUpper": "Unten -> Oben", + "selectMOCEvent": "MOC-Ereignis wählen", + "selectPFEvent": "PF-Ereignis wählen", + "selectASEvent": "AS-Ereignis wählen", + "selectCEEvent": "CE-Ereignis wählen", + "selectEvent": "Ereignis wählen", + "selectFloor": "Ebene wählen", + "selectSide": "Seite wählen", + "selectBuff": "Buff wählen", + "selectStage": "Phase wählen", + "previous": "Zurück", + "next": "Weiter", + "noMonstersFound": "Keine Monster gefunden", + "addNewWave": "Neue Welle hinzufügen", + "searchStage": "Phase suchen...", + "noStageFound": "Keine Phase gefunden", + "searchMonster": "Monster suchen...", + "changeRelic": "Relikt wechseln", + "deleteRelic": "Relikt löschen", + "deleteRelicConfirm": "Möchtest du das Relikt auf diesem Platz wirklich löschen?", + "setEffects": "Effekte einstellen", + "details": "Details", + "normal": "Standardangriff", "bpskill": "Fähigkeit", "maze": "Technik", "ultra": "Ultimate", "assist": "Assist-Fähigkeit", "servantskill": "Memosprite-Fähigkeit", - "severaltalent": "Memosprite-Talent", - "singleattack": "Einzelangriff", - "enhance": "Verbessern", - "summon": "Beschwören", - "mazeattack": "Technik-Angriff", - "blast": "Explosion", - "restore": "Wiederherstellen", - "support": "Unterstützung", - "aoeattack": "Flächenangriff", - "impair": "Beeinträchtigen", - "bounce": "Abprallen", - "active": "Aktiv", - "defence": "Verteidigung", - "inactive": "Inaktiv", - "maxAll": "Alles maximieren", - "maxAllSuccess": "Fähigkeiten erfolgreich maximiert.", - "maxAllFailed": "Fehler beim Maximieren.", - "noRelicEquipped": "Kein Relikt ausgerüstet", - "anomalyArbitration": "Anomalie-Schiedsgericht", - "normalMode": "Normaler Modus", - "hardMode": "Schwerer Modus", - "selectPEAKEvent": "PEAK-Ereignis wählen", - "mode": "Modus", - "selectMode": "Modus wählen", - "rollBack": "Rückgängig", - "upRoll": "Aufwertung hoch", - "downRoll": "Aufwertung runter", - "actions": "Aktionen", - "avatars": "Avatare", - "quickView": "Schnellansicht", - "extraSetting": "Extra-Einstellungen", - "disableCensorship": "Zensur deaktivieren", - "hideUI": "UI verstecken", - "theoryCraftMode": "Theorycraft-Modus", - "cycleCount": "Zyklen-Anzahl", - "pleaseSelectAllSubStats": "Bitte alle Nebenwerte auswählen", - "subStatRollCountCannotBeZero": "Nebenwert-Aufwertungen dürfen nicht null sein", - "theoryCraft": "Theorycraft", - "multipathCharacter": "Mehrpfad-Charakter", - "mainPath": "Hauptpfad", - "march7Path": "Pfad 7. März", - "challenge": "Herausforderung", - "skipNode": "Knoten überspringen", - "disableSkip": "Überspringen deaktivieren", - "skipNode1": "Knoten 1 überspringen", - "skipNode2": "Knoten 2 überspringen", - "extraFeatures": "Zusatzfunktionen", - "detailTheoryCraft": "Ermöglicht die Anpassung der Zykluszahl und der Gegner-LP.", - "detailSkipNode": "Ermöglicht das Überspringen (Knoten 1/2) im Memory of Chaos oder Pure Fiction.", - "detailChallengePeak": "Ändert die Peak-Saison in der aktuellen Anomalie.", - "detailHiddenUi": "Versteckt die Spiel-Benutzeroberfläche.", - "detailDisableCensorship": "Deaktiviert die Zensur im Spiel.", - "detailMultipathCharacter": "Ermöglicht das Ändern des Pfades bestimmter Charaktere.", - "trailblazer": "Trailblazer", - "listExtraEffect": "Liste Zusatzeffekte", - "extra": "Extra", - "customLineup": "Benutzerdefinierte Aufstellung" - } + "severaltalent": "Memosprite-Talent", + "singleattack": "Einzelangriff", + "enhance": "Verbessern", + "summon": "Beschwören", + "mazeattack": "Technik-Angriff", + "blast": "Explosion", + "restore": "Wiederherstellen", + "support": "Unterstützung", + "aoeattack": "Flächenangriff", + "impair": "Beeinträchtigen", + "bounce": "Abprallen", + "active": "Aktiv", + "defence": "Verteidigung", + "inactive": "Inaktiv", + "maxAll": "Alles maximieren", + "maxAllSuccess": "Fähigkeiten erfolgreich maximiert.", + "maxAllFailed": "Fehler beim Maximieren.", + "noRelicEquipped": "Kein Relikt ausgerüstet", + "anomalyArbitration": "Anomalie-Schiedsgericht", + "normalMode": "Normaler Modus", + "hardMode": "Schwerer Modus", + "selectPEAKEvent": "PEAK-Ereignis wählen", + "mode": "Modus", + "selectMode": "Modus wählen", + "rollBack": "Rückgängig", + "upRoll": "Aufwertung hoch", + "downRoll": "Aufwertung runter", + "actions": "Aktionen", + "avatars": "Avatare", + "quickView": "Schnellansicht", + "extraSetting": "Extra-Einstellungen", + "disableCensorship": "Zensur deaktivieren", + "hideUI": "UI verstecken", + "theoryCraftMode": "Theorycraft-Modus", + "cycleCount": "Zyklen-Anzahl", + "pleaseSelectAllSubStats": "Bitte alle Nebenwerte auswählen", + "subStatRollCountCannotBeZero": "Nebenwert-Aufwertungen dürfen nicht null sein", + "theoryCraft": "Theorycraft", + "multipathCharacter": "Mehrpfad-Charakter", + "mainPath": "Hauptpfad", + "march7Path": "Pfad 7. März", + "challenge": "Herausforderung", + "skipNode": "Knoten überspringen", + "disableSkip": "Überspringen deaktivieren", + "skipNode1": "Knoten 1 überspringen", + "skipNode2": "Knoten 2 überspringen", + "extraFeatures": "Zusatzfunktionen", + "detailTheoryCraft": "Ermöglicht die Anpassung der Zykluszahl und der Gegner-LP.", + "detailSkipNode": "Ermöglicht das Überspringen (Knoten 1/2) im Memory of Chaos oder Pure Fiction.", + "detailChallengePeak": "Ändert die Peak-Saison in der aktuellen Anomalie.", + "detailHiddenUi": "Versteckt die Spiel-Benutzeroberfläche.", + "detailDisableCensorship": "Deaktiviert die Zensur im Spiel.", + "detailMultipathCharacter": "Ermöglicht das Ändern des Pfades bestimmter Charaktere.", + "trailblazer": "Trailblazer", + "listExtraEffect": "Liste Zusatzeffekte", + "extra": "Extra", + "customLineup": "Benutzerdefinierte Aufstellung", + "def": "VTD", + "language": "Sprache" + } } diff --git a/messages/en.json b/messages/en.json index 21bb26c..d6d13b1 100644 --- a/messages/en.json +++ b/messages/en.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Firefly tools by Firefly Shelter" - }, - "DataPage": { - "skillType": "Skill Type", - "skillName": "Skill Name", - "character": "Character", - "id": "Id", - "path": "Path", - "rarity": "Rarity", - "element": "Element", - "technique": "Technique", - "talent": "Talent", - "basic": "Basic Attack", - "skill": "Skill", - "ultimate": "Ultimate", - "servant": "Servant", - "damage": "Damage", - "type": "Type", - "warrior": "The Destruction", - "knight": "The Preservation", - "mage": "The Erudition", - "priest": "The Abundance", - "rogue": "The Hunt", - "shaman": "The Harmony", - "warlock": "The Nihility", - "memory": "The Remembrance", - "elation": "The Elation", - "fire": "Fire", - "ice": "Ice", - "imaginary": "Imaginary", - "physical": "Physical", - "quantum": "Quantum", - "thunder": "Thunder", - "wind": "Wind", - "hp": "Hp", - "atk": "Atk", - "speed": "Speed", - "critRate": "Crit Rate", - "critDmg": "Crit Dmg", - "breakEffect": "Break Effect", - "effectRes": "Effect Res", - "energyRegenerationRate": "Energy Regeneration Rate", - "effectHitRate": "Effect Hit Rate", - "outgoingHealingBoost": "Outgoing Healing Boost", - "fireDmgBoost": "Fire damage boost", - "iceDmgBoost": "Ice damage Boost", - "imaginaryDmgBoost": "Imaginary damage boost", - "physicalDmgBoost": "Physical damage boost", - "quantumDmgBoost": "Quantum damage boost", - "thunderDmgBoost": "Thunder damage boost", - "windDmgBoost": "Wind damage boost", - "pursued": "Additional damage", - "true damage": "True damage", - "elationdamage": "Elation damage", - "follow-up": "Follow-up Damage", - "elemental damage": "Break and Super break damage", - "dot": "Damage over time ", - "qte": "QTE Skill", - "level": "Level", - "relics": "Relics", - "eidolons": "Eidolons", - "lightcones": "Lightcones", - "loadData": "Load data", - "exportData": "Export data", - "connectSetting": "Connection Setting", - "connected": "Connected", - "unconnected": "Unconnected", - "psConnection": "PS Connection", - "connectionType": "Connection Type", - "status": "Status", - "connectPs": "Connect PS", - "disconnect": "Disconnect", - "other": "Other", - "freeSr": "FreeSR", - "database": "Database", - "enka": "Enka", - "monsterSetting": "Monster Setting", - "serverUrl": "Server URL", - "privateType": "Private Type", - "local": "Local", - "server": "Server", - "username": "Username", - "password": "Password", - "placeholderServerUrl": "Enter server URL", - "placeholderUsername": "Enter username", - "placeholderPassword": "Enter password", - "connectedSuccess": "Connected to PS successfully", - "connectedFailed": "Failed to connect to PS", - "syncSuccess": "Synced data to PS successfully", - "syncFailed": "Failed to sync data to PS", - "sync": "Sync", - "importSetting": "Import Setting", - "profile": "Profile", - "default": "Default", - "copyProfiles": "Copy profiles", - "addNewProfile": "Add new profile", - "createNewProfile": "Create new profile", - "editProfile": "Edit profile", - "placeholderProfileName": "Enter profile name", - "profileName": "Profile name", - "create": "Create", - "update": "Update", - "characterInformation": "Character Information", - "skills": "Skills", - "showcaseCard": "Showcase Card", - "comingSoon": "Coming soon", - "characterName": "Character name", - "placeholderCharacter": "Enter character name", - "characterSettings": "Character Settings", - "levelConfiguration": "Level Configuration", - "characterLevel": "Character Level", - "max": "MAX", - "ultimateEnergy": "Ultimate Energy", - "currentEnergy": "Current Energy", - "setTo50": "Set to 50%", - "battleConfiguration": "Battle Configuration", - "useTechnique": "Use Technique", - "techniqueNote": "Enable pre-battle technique effects", - "enhancement": "Enhancement", - "enhancementLevel": "Enhancement Level", - "origin": "Origin", - "enhancedNote": "Higher enhanced unlock additional abilities", - "lightconeEquipment": "Lightcone Equipment", - "lightconeSettings": "Lightcone Settings", - "placeholderLevel": "Enter level", - "superimpositionRank": "Superimposition Rank", - "ranksNote": "Higher ranks provide stronger effects", - "changeLightcone": "Change Lightcone", - "removeLightcone": "Remove Lightcone", - "equipLightcone": "Equip Lightcone", - "noLightconeEquipped": "No Lightcone Equipped", - "equipLightconeNote": "Equip a lightcone to enhance your character's abilities", - "filter": "Filter", - "selectedCharacters": "Selected Characters", - "selectedProfiles": "Selected Profiles", - "clearAll": "Clear All", - "selectAll": "Select All", - "copy": "Copy", - "copied": "Copied", - "noAvatarSelected": "No avatar selected", - "noAvatarToCopySelected": "No avatar to copy selected", - "pleaseSelectAtLeastOneProfile": "Please select at least one profile", - "pleaseEnterUid": "Please enter UID", - "failedToFetchEnkaData": "Failed to fetch enka data", - "pleaseSelectAtLeastOneCharacter": "Please select at least one character", - "noDataToImport": "No data to import", - "pleaseSelectAFile": "Please select a file", - "fileMustBeAValidJsonFile": "File must be a valid json file", - "importEnkaDataSuccess": "Import Enka data success", - "importFreeSRDataSuccess": "Import FreeSR data success", - "importDatabaseSuccess": "Import database success", - "getData": "Get Data", - "import": "Import", - "freeSRImport": "FreeSR Import", - "onlySupportFreeSRJsonFile": "Only support FreeSR json file", - "pickAFile": "Pick a file", - "lightConeSetting": "LightCone Setting", - "relicMaker": "Relic Maker", - "pleaseSelectAllOptions": "Please select all options", - "relicSavedSuccessfully": "Relic saved successfully", - "mainSettings": "Main Settings", - "mainStat": "Main Stat", - "set": "Set", - "pleaseSelectASet": "Please select a set", - "effectBonus": "Effect Bonus", - "totalRoll": "Total Roll", - "randomizeStats": "Randomize Stats", - "randomizeRolls": "Randomize Rolls", - "selectASubStat": "Select a sub stat", - "selectASet": "Select a set", - "selectAMainStat": "Select a main stat", - "save": "Save", - "reset": "Reset", - "roll": "Roll", - "step": "Step", - "memoryOfChaos": "Memory of Chaos", - "pureFiction": "Pure Fiction", - "apocalypticShadow": "Apocalyptic Shadow", - "customEnemy": "Custom Enemy", - "simulatedUniverse": "Simulated Universe", - "floor": "Floor", - "side": "Side", - "wave": "Wave", - "stage": "Stage", - "useCycleCount": "Use cycle count?", - "useTurbulenceBuff": "Use turbulence buff?", - "firstHalfEnemies": "First half enemies", - "secondHalfEnemies": "Second half enemies", - "firstNodeEnemies": "First node enemies", - "secondNodeEnemies": "Second node enemies", - "thirdNodeEnemies": "Third node enemies", - "firstNode": "First Node", - "secondNode": "Second Node", - "thirdNode": "Third Node", - "listEnemies": "List enemies", - "turbulenceBuff": "Turbulence Buff", - "noEventSelected": "No event selected", - "noTurbulenceBuff": "No Turbulence Buff", - "upper": "Upper", - "lower": "Lower", - "upperToLower": "Upper -> Lower", - "lowerToUpper": "Lower -> Upper", - "selectMOCEvent": "Select MOC Event", - "selectPFEvent": "Select PF Event", - "selectASEvent": "Select AS Event", - "selectCEEvent": "Select CE Event", - "selectEvent": "Select Event", - "selectFloor": "Select a Floor", - "selectSide": "Select a Side", - "selectBuff": "Select a Buff", - "selectStage": "Select a Stage", - "previous": "Previous", - "next": "Next", - "noMonstersFound": "No monsters found", - "addNewWave": "Add New Wave", - "searchStage": "Search stage...", - "noStageFound": "No stage found", - "searchMonster": "Search monster...", - "changeRelic": "Change relic", - "deleteRelic": "Delete relic", - "deleteRelicConfirm": "Are you sure you want to delete relic in slot", - "setEffects": "Set Effects", - "details": "Details", - "normal": "Basic ATK", - "bpskill": "Skill", - "maze": "Technique", - "ultra": "Ultimate", - "assist": "Assist Skill", - "servantskill": "Memosprite Skill", - "severaltalent": "Memosprite Talent", - "singleattack": "Single Attack", - "enhance": "Enhance", - "summon": "Summon", - "mazeattack": "Technique Attack", - "blast": "Blast", - "restore": "Restore", - "support": "Support", - "aoeattack": "AoE Attack", - "impair": "Impair", - "bounce": "Bounce", - "active": "Active", - "defence": "Defence", - "inactive": "Inactive", - "maxAll": "Max All", - "maxAllSuccess": "Successfully set skill level to max.", - "maxAllFailed": "Failed to set skill level to max.", - "noRelicEquipped": "No relic equipped", - "anomalyArbitration": "Anomaly Arbitration", - "normalMode": "Normal Mode", - "hardMode": "Hard Mode", - "selectPEAKEvent": "Select PEAK Event", - "mode": "Mode", - "selectMode": "Select a mode", - "rollBack": "Roll Back", - "upRoll": "Up Roll", - "downRoll": "Down Roll", - "actions": "Actions", - "avatars": "Avatars", - "quickView": "Quick View", - "extraSetting": "Extra Settings", - "disableCensorship": "Disable Censorship", - "hideUI": "Hide UI", - "theoryCraftMode": "Theorycraft Mode", - "cycleCount": "Cycle Count", - "pleaseSelectAllSubStats": "Please select all sub stats", - "subStatRollCountCannotBeZero": "Sub stat roll count cannot be zero", - "theoryCraft": "Theorycraft", - "multipathCharacter": "Multipath Character", - "mainPath": "Main Path", - "march7Path": "March 7 Path", - "challenge": "Challenge", - "skipNode": "Skip Node", - "disableSkip": "Disable skip", - "skipNode1": "Skip node 1", - "skipNode2": "Skip node 2", - "extraFeatures": "Extra Features", - "detailTheoryCraft": "Enabling this feature allows you to customize the cycle count and adjust enemy HP in the enemy settings.", - "detailSkipNode": "Enabling this feature allows you to skip (Node 1/Node 2) in Memory of Chaos or Pure Fiction.", - "detailChallengePeak": "Allows changing the Peak season in the current Anomaly.", - "detailHiddenUi": "Enabling this feature will hide the game UI.", - "detailDisableCensorship": "Enabling this feature will disable in-game censorship.", - "detailMultipathCharacter": "Allows changing the Path of certain characters.", - "trailblazer": "Trailblazer", - "listExtraEffect": "List Extra Effect", - "extra": "Extra", - "customLineup": "Custom Lineup" - } -} \ No newline at end of file +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Firefly tools by Firefly Shelter" + }, + "DataPage": { + "skillType": "Skill Type", + "skillName": "Skill Name", + "character": "Character", + "id": "Id", + "path": "Path", + "rarity": "Rarity", + "element": "Element", + "technique": "Technique", + "talent": "Talent", + "basic": "Basic Attack", + "skill": "Skill", + "ultimate": "Ultimate", + "servant": "Servant", + "damage": "Damage", + "type": "Type", + "warrior": "The Destruction", + "knight": "The Preservation", + "mage": "The Erudition", + "priest": "The Abundance", + "rogue": "The Hunt", + "shaman": "The Harmony", + "warlock": "The Nihility", + "memory": "The Remembrance", + "elation": "The Elation", + "fire": "Fire", + "ice": "Ice", + "imaginary": "Imaginary", + "physical": "Physical", + "quantum": "Quantum", + "thunder": "Thunder", + "wind": "Wind", + "hp": "Hp", + "atk": "Atk", + "def": "Def", + "speed": "Speed", + "critRate": "Crit Rate", + "critDmg": "Crit Dmg", + "breakEffect": "Break Effect", + "effectRes": "Effect Res", + "energyRegenerationRate": "Energy Regeneration Rate", + "effectHitRate": "Effect Hit Rate", + "outgoingHealingBoost": "Outgoing Healing Boost", + "fireDmgBoost": "Fire damage boost", + "iceDmgBoost": "Ice damage Boost", + "imaginaryDmgBoost": "Imaginary damage boost", + "physicalDmgBoost": "Physical damage boost", + "quantumDmgBoost": "Quantum damage boost", + "thunderDmgBoost": "Thunder damage boost", + "windDmgBoost": "Wind damage boost", + "pursued": "Additional damage", + "true damage": "True damage", + "elationdamage": "Elation damage", + "follow-up": "Follow-up Damage", + "elemental damage": "Break and Super break damage", + "dot": "Damage over time ", + "qte": "QTE Skill", + "level": "Level", + "relics": "Relics", + "eidolons": "Eidolons", + "lightcones": "Lightcones", + "loadData": "Load data", + "exportData": "Export data", + "connectSetting": "Connection Setting", + "connected": "Connected", + "unconnected": "Unconnected", + "psConnection": "PS Connection", + "connectionType": "Connection Type", + "status": "Status", + "connectPs": "Connect PS", + "disconnect": "Disconnect", + "other": "Other", + "freeSr": "FreeSR", + "database": "Database", + "enka": "Enka", + "monsterSetting": "Monster Setting", + "serverUrl": "Server URL", + "privateType": "Private Type", + "local": "Local", + "server": "Server", + "username": "Username", + "password": "Password", + "placeholderServerUrl": "Enter server URL", + "placeholderUsername": "Enter username", + "placeholderPassword": "Enter password", + "connectedSuccess": "Connected to PS successfully", + "connectedFailed": "Failed to connect to PS", + "syncSuccess": "Synced data to PS successfully", + "syncFailed": "Failed to sync data to PS", + "sync": "Sync", + "importSetting": "Import Setting", + "profile": "Profile", + "default": "Default", + "copyProfiles": "Copy profiles", + "addNewProfile": "Add new profile", + "createNewProfile": "Create new profile", + "editProfile": "Edit profile", + "placeholderProfileName": "Enter profile name", + "profileName": "Profile name", + "create": "Create", + "update": "Update", + "characterInformation": "Character Information", + "skills": "Skills", + "showcaseCard": "Showcase Card", + "comingSoon": "Coming soon", + "characterName": "Character name", + "placeholderCharacter": "Enter character name", + "characterSettings": "Character Settings", + "levelConfiguration": "Level Configuration", + "characterLevel": "Character Level", + "max": "MAX", + "ultimateEnergy": "Ultimate Energy", + "currentEnergy": "Current Energy", + "setTo50": "Set to 50%", + "battleConfiguration": "Battle Configuration", + "useTechnique": "Use Technique", + "techniqueNote": "Enable pre-battle technique effects", + "enhancement": "Enhancement", + "enhancementLevel": "Enhancement Level", + "origin": "Origin", + "enhancedNote": "Higher enhanced unlock additional abilities", + "lightconeEquipment": "Lightcone Equipment", + "lightconeSettings": "Lightcone Settings", + "placeholderLevel": "Enter level", + "superimpositionRank": "Superimposition Rank", + "ranksNote": "Higher ranks provide stronger effects", + "changeLightcone": "Change Lightcone", + "removeLightcone": "Remove Lightcone", + "equipLightcone": "Equip Lightcone", + "noLightconeEquipped": "No Lightcone Equipped", + "equipLightconeNote": "Equip a lightcone to enhance your character's abilities", + "filter": "Filter", + "selectedCharacters": "Selected Characters", + "selectedProfiles": "Selected Profiles", + "clearAll": "Clear All", + "selectAll": "Select All", + "copy": "Copy", + "copied": "Copied", + "noAvatarSelected": "No avatar selected", + "noAvatarToCopySelected": "No avatar to copy selected", + "pleaseSelectAtLeastOneProfile": "Please select at least one profile", + "pleaseEnterUid": "Please enter UID", + "failedToFetchEnkaData": "Failed to fetch enka data", + "pleaseSelectAtLeastOneCharacter": "Please select at least one character", + "noDataToImport": "No data to import", + "pleaseSelectAFile": "Please select a file", + "fileMustBeAValidJsonFile": "File must be a valid json file", + "importEnkaDataSuccess": "Import Enka data success", + "importFreeSRDataSuccess": "Import FreeSR data success", + "importDatabaseSuccess": "Import database success", + "getData": "Get Data", + "import": "Import", + "freeSRImport": "FreeSR Import", + "onlySupportFreeSRJsonFile": "Only support FreeSR json file", + "pickAFile": "Pick a file", + "lightConeSetting": "LightCone Setting", + "relicMaker": "Relic Maker", + "pleaseSelectAllOptions": "Please select all options", + "relicSavedSuccessfully": "Relic saved successfully", + "mainSettings": "Main Settings", + "mainStat": "Main Stat", + "set": "Set", + "pleaseSelectASet": "Please select a set", + "effectBonus": "Effect Bonus", + "totalRoll": "Total Roll", + "randomizeStats": "Randomize Stats", + "randomizeRolls": "Randomize Rolls", + "selectASubStat": "Select a sub stat", + "selectASet": "Select a set", + "selectAMainStat": "Select a main stat", + "save": "Save", + "reset": "Reset", + "roll": "Roll", + "step": "Step", + "memoryOfChaos": "Memory of Chaos", + "pureFiction": "Pure Fiction", + "apocalypticShadow": "Apocalyptic Shadow", + "customEnemy": "Custom Enemy", + "simulatedUniverse": "Simulated Universe", + "floor": "Floor", + "side": "Side", + "wave": "Wave", + "stage": "Stage", + "useCycleCount": "Use cycle count?", + "useTurbulenceBuff": "Use turbulence buff?", + "firstHalfEnemies": "First half enemies", + "secondHalfEnemies": "Second half enemies", + "firstNodeEnemies": "First node enemies", + "secondNodeEnemies": "Second node enemies", + "thirdNodeEnemies": "Third node enemies", + "firstNode": "First Node", + "secondNode": "Second Node", + "thirdNode": "Third Node", + "listEnemies": "List enemies", + "turbulenceBuff": "Turbulence Buff", + "noEventSelected": "No event selected", + "noTurbulenceBuff": "No Turbulence Buff", + "upper": "Upper", + "lower": "Lower", + "upperToLower": "Upper -> Lower", + "lowerToUpper": "Lower -> Upper", + "selectMOCEvent": "Select MOC Event", + "selectPFEvent": "Select PF Event", + "selectASEvent": "Select AS Event", + "selectCEEvent": "Select CE Event", + "selectEvent": "Select Event", + "selectFloor": "Select a Floor", + "selectSide": "Select a Side", + "selectBuff": "Select a Buff", + "selectStage": "Select a Stage", + "previous": "Previous", + "next": "Next", + "noMonstersFound": "No monsters found", + "addNewWave": "Add New Wave", + "searchStage": "Search stage...", + "noStageFound": "No stage found", + "searchMonster": "Search monster...", + "changeRelic": "Change relic", + "deleteRelic": "Delete relic", + "deleteRelicConfirm": "Are you sure you want to delete relic in slot", + "setEffects": "Set Effects", + "details": "Details", + "normal": "Basic ATK", + "bpskill": "Skill", + "maze": "Technique", + "ultra": "Ultimate", + "assist": "Assist Skill", + "servantskill": "Memosprite Skill", + "severaltalent": "Memosprite Talent", + "singleattack": "Single Attack", + "enhance": "Enhance", + "summon": "Summon", + "mazeattack": "Technique Attack", + "blast": "Blast", + "restore": "Restore", + "support": "Support", + "aoeattack": "AoE Attack", + "impair": "Impair", + "bounce": "Bounce", + "active": "Active", + "defence": "Defence", + "inactive": "Inactive", + "maxAll": "Max All", + "maxAllSuccess": "Successfully set skill level to max.", + "maxAllFailed": "Failed to set skill level to max.", + "noRelicEquipped": "No relic equipped", + "anomalyArbitration": "Anomaly Arbitration", + "normalMode": "Normal Mode", + "hardMode": "Hard Mode", + "selectPEAKEvent": "Select PEAK Event", + "mode": "Mode", + "selectMode": "Select a mode", + "rollBack": "Roll Back", + "upRoll": "Up Roll", + "downRoll": "Down Roll", + "actions": "Actions", + "avatars": "Avatars", + "quickView": "Quick View", + "extraSetting": "Extra Settings", + "disableCensorship": "Disable Censorship", + "hideUI": "Hide UI", + "theoryCraftMode": "Theorycraft Mode", + "cycleCount": "Cycle Count", + "pleaseSelectAllSubStats": "Please select all sub stats", + "subStatRollCountCannotBeZero": "Sub stat roll count cannot be zero", + "theoryCraft": "Theorycraft", + "multipathCharacter": "Multipath Character", + "mainPath": "Main Path", + "march7Path": "March 7 Path", + "challenge": "Challenge", + "skipNode": "Skip Node", + "disableSkip": "Disable skip", + "skipNode1": "Skip node 1", + "skipNode2": "Skip node 2", + "extraFeatures": "Extra Features", + "detailTheoryCraft": "Enabling this feature allows you to customize the cycle count and adjust enemy HP in the enemy settings.", + "detailSkipNode": "Enabling this feature allows you to skip (Node 1/Node 2) in Memory of Chaos or Pure Fiction.", + "detailChallengePeak": "Allows changing the Peak season in the current Anomaly.", + "detailHiddenUi": "Enabling this feature will hide the game UI.", + "detailDisableCensorship": "Enabling this feature will disable in-game censorship.", + "detailMultipathCharacter": "Allows changing the Path of certain characters.", + "trailblazer": "Trailblazer", + "listExtraEffect": "List Extra Effect", + "extra": "Extra", + "customLineup": "Custom Lineup", + "language": "Language" + } +} diff --git a/messages/es.json b/messages/es.json index 724d117..b94b77b 100644 --- a/messages/es.json +++ b/messages/es.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Herramientas Firefly por Firefly Shelter" - }, - "DataPage": { - "skillType": "Tipo de habilidad", - "skillName": "Nombre de la habilidad", - "character": "Personaje", - "id": "Id", - "path": "Vía", - "rarity": "Rareza", - "element": "Elemento", - "technique": "Técnica", - "talent": "Talento", - "basic": "Ataque Básico", - "skill": "Habilidad", - "ultimate": "Habilidad Definitiva", - "servant": "Mnemoduende", - "damage": "Daño", - "type": "Tipo", - "warrior": "La Destrucción", - "knight": "La Conservación", - "mage": "La Erudición", - "priest": "La Abundancia", - "rogue": "La Cacería", - "shaman": "La Armonía", - "warlock": "La Nihilidad", - "memory": "La Reminiscencia", - "elation": "La Exultación", - "fire": "Fuego", - "ice": "Hielo", - "imaginary": "Imaginario", - "physical": "Físico", - "quantum": "Cuántico", - "thunder": "Rayo", - "wind": "Viento", - "hp": "PV", - "atk": "ATQ", - "speed": "VEL", - "critRate": "Prob. CRIT", - "critDmg": "Daño CRIT", - "breakEffect": "Efecto de Ruptura", - "effectRes": "RES a Efecto", - "energyRegenerationRate": "Recuperación de Energía", - "effectHitRate": "Acierto de Efecto", - "outgoingHealingBoost": "Bono de Curación", - "fireDmgBoost": "Aumento de Daño de Fuego", - "iceDmgBoost": "Aumento de Daño de Hielo", - "imaginaryDmgBoost": "Aumento de Daño Imaginario", - "physicalDmgBoost": "Aumento de Daño Físico", - "quantumDmgBoost": "Aumento de Daño Cuántico", - "thunderDmgBoost": "Aumento de Daño de Rayo", - "windDmgBoost": "Aumento de Daño de Viento", - "pursued": "Daño adicional", - "true damage": "Daño verdadero", - "elationdamage": "Daño de Exultación", - "follow-up": "Daño de Ataque Adicional", - "elemental damage": "Daño de Ruptura y Superruptura", - "dot": "Daño con el tiempo", - "qte": "Habilidad QTE", - "level": "Nivel", - "relics": "Artefactos", - "eidolons": "Eidolones", - "lightcones": "Conos de Luz", - "loadData": "Cargar datos", - "exportData": "Exportar datos", - "connectSetting": "Ajustes de conexión", - "connected": "Conectado", - "unconnected": "Desconectado", - "psConnection": "Conexión PS", - "connectionType": "Tipo de conexión", - "status": "Estado", - "connectPs": "Conectar PS", - "disconnect": "Desconectar", - "other": "Otro", - "freeSr": "FreeSR", - "database": "Base de datos", - "enka": "Enka", - "monsterSetting": "Ajuste de Monstruos", - "serverUrl": "URL del Servidor", - "privateType": "Tipo privado", - "local": "Local", - "server": "Servidor", - "username": "Usuario", - "password": "Contraseña", - "placeholderServerUrl": "Introducir URL del servidor", - "placeholderUsername": "Introducir usuario", - "placeholderPassword": "Introducir contraseña", - "connectedSuccess": "Conectado a PS exitosamente", - "connectedFailed": "Fallo al conectar a PS", - "syncSuccess": "Datos sincronizados a PS exitosamente", - "syncFailed": "Fallo al sincronizar datos a PS", - "sync": "Sincronizar", - "importSetting": "Ajustes de Importación", - "profile": "Perfil", - "default": "Por defecto", - "copyProfiles": "Copiar perfiles", - "addNewProfile": "Añadir nuevo perfil", - "createNewProfile": "Crear nuevo perfil", - "editProfile": "Editar perfil", - "placeholderProfileName": "Introducir nombre de perfil", - "profileName": "Nombre del perfil", - "create": "Crear", - "update": "Actualizar", - "characterInformation": "Información del personaje", - "skills": "Habilidades", - "showcaseCard": "Tarjeta de presentación del personaje", - "comingSoon": "Próximamente", - "characterName": "Nombre del personaje", - "placeholderCharacter": "Introducir nombre del personaje", - "characterSettings": "Ajustes del Personaje", - "levelConfiguration": "Configuración de Nivel", - "characterLevel": "Nivel de Personaje", - "max": "MÁX", - "ultimateEnergy": "Energía de Habilidad Definitiva", - "currentEnergy": "Energía al inicio del combate", - "setTo50": "Ajustar al 50%", - "battleConfiguration": "Configuración de Batalla", - "useTechnique": "Usar Técnica", - "techniqueNote": "Activar efectos de técnica pre-batalla", - "enhancement": "Mejora", - "enhancementLevel": "Nivel de Mejora", - "origin": "Original", - "enhancedNote": "Niveles superiores desbloquean más habilidades", - "lightconeEquipment": "Equipamiento de Cono de Luz", - "lightconeSettings": "Ajustes de Cono de Luz", - "placeholderLevel": "Introducir nivel", - "superimpositionRank": "Rango de Superposición", - "ranksNote": "Rangos mayores ofrecen efectos más fuertes", - "changeLightcone": "Cambiar Cono de Luz", - "removeLightcone": "Quitar Cono de Luz", - "equipLightcone": "Equipar Cono de Luz", - "noLightconeEquipped": "Sin Cono de Luz", - "equipLightconeNote": "Equipa un cono de luz para mejorar tu personaje", - "filter": "Filtro", - "selectedCharacters": "Personajes Seleccionados", - "selectedProfiles": "Perfiles Seleccionados", - "clearAll": "Limpiar Todo", - "selectAll": "Seleccionar Todo", - "copy": "Copiar", - "copied": "Copiado", - "noAvatarSelected": "Ningún personaje seleccionado", - "noAvatarToCopySelected": "Ningún personaje seleccionado para copiar", - "pleaseSelectAtLeastOneProfile": "Por favor, selecciona al menos un perfil", - "pleaseEnterUid": "Por favor, introduce UID", - "failedToFetchEnkaData": "Fallo al obtener datos de Enka", - "pleaseSelectAtLeastOneCharacter": "Por favor, selecciona al menos un personaje", - "noDataToImport": "Sin datos para importar", - "pleaseSelectAFile": "Por favor, selecciona un archivo", - "fileMustBeAValidJsonFile": "El archivo debe ser un JSON válido", - "importEnkaDataSuccess": "Datos de Enka importados con éxito", - "importFreeSRDataSuccess": "Datos de FreeSR importados con éxito", - "importDatabaseSuccess": "Base de datos importada con éxito", - "getData": "Obtener Datos", - "import": "Importar", - "freeSRImport": "Importar FreeSR", - "onlySupportFreeSRJsonFile": "Solo soporta archivos JSON de FreeSR", - "pickAFile": "Elegir un archivo", - "lightConeSetting": "Ajuste de Cono de Luz", - "relicMaker": "Creador de Artefactos", - "pleaseSelectAllOptions": "Por favor selecciona todas las opciones", - "relicSavedSuccessfully": "Artefacto guardado exitosamente", - "mainSettings": "Ajustes Principales", - "mainStat": "Estadística Principal", - "set": "Conjunto", - "pleaseSelectASet": "Por favor, selecciona un conjunto", - "effectBonus": "Bono de Efecto", - "totalRoll": "Total de Mejoras", - "randomizeStats": "Estadísticas Aleatorias", - "randomizeRolls": "Mejoras Aleatorias", - "selectASubStat": "Seleccionar estadística secundaria", - "selectASet": "Seleccionar conjunto", - "selectAMainStat": "Seleccionar estadística principal", - "save": "Guardar", - "reset": "Reiniciar", - "roll": "Mejora", - "step": "Paso", - "memoryOfChaos": "Memoria del Caos", - "pureFiction": "Pura Ficción", - "apocalypticShadow": "Sombra Apocalíptica", - "customEnemy": "Enemigo Personalizado", - "simulatedUniverse": "Universo Simulado", - "floor": "Piso", - "side": "Lado", - "wave": "Oleada", - "stage": "Etapa", - "useCycleCount": "¿Usar conteo de ciclos?", - "useTurbulenceBuff": "¿Usar buff de turbulencia?", - "firstHalfEnemies": "Enemigos primera mitad", - "secondHalfEnemies": "Enemigos segunda mitad", - "firstNodeEnemies": "Enemigos del nodo 1", - "secondNodeEnemies": "Enemigos del nodo 2", - "thirdNodeEnemies": "Enemigos del nodo 3", - "firstNode": "Nodo 1", - "secondNode": "Nodo 2", - "thirdNode": "Nodo 3", - "listEnemies": "Lista de enemigos", - "turbulenceBuff": "Buff de Turbulencia", - "noEventSelected": "Ningún evento seleccionado", - "noTurbulenceBuff": "Sin Buff de Turbulencia", - "upper": "Superior", - "lower": "Inferior", - "upperToLower": "Superior -> Inferior", - "lowerToUpper": "Inferior -> Superior", - "selectMOCEvent": "Seleccionar evento de MOC", - "selectPFEvent": "Seleccionar evento de PF", - "selectASEvent": "Seleccionar evento de AS", - "selectCEEvent": "Seleccionar evento de CE", - "selectEvent": "Seleccionar Evento", - "selectFloor": "Seleccionar Piso", - "selectSide": "Seleccionar Lado", - "selectBuff": "Seleccionar Buff", - "selectStage": "Seleccionar Etapa", - "previous": "Anterior", - "next": "Siguiente", - "noMonstersFound": "No se encontraron monstruos", - "addNewWave": "Añadir Nueva Oleada", - "searchStage": "Buscar etapa...", - "noStageFound": "No se encontró etapa", - "searchMonster": "Buscar monstruo...", - "changeRelic": "Cambiar artefacto", - "deleteRelic": "Borrar artefacto", - "deleteRelicConfirm": "¿Seguro que quieres borrar el artefacto en este espacio?", - "setEffects": "Configurar Efectos", - "details": "Detalles", - "normal": "Ataque Básico", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Herramientas Firefly por Firefly Shelter" + }, + "DataPage": { + "skillType": "Tipo de habilidad", + "skillName": "Nombre de la habilidad", + "character": "Personaje", + "id": "Id", + "path": "Vía", + "rarity": "Rareza", + "element": "Elemento", + "technique": "Técnica", + "talent": "Talento", + "basic": "Ataque Básico", + "skill": "Habilidad", + "ultimate": "Habilidad Definitiva", + "servant": "Mnemoduende", + "damage": "Daño", + "type": "Tipo", + "warrior": "La Destrucción", + "knight": "La Conservación", + "mage": "La Erudición", + "priest": "La Abundancia", + "rogue": "La Cacería", + "shaman": "La Armonía", + "warlock": "La Nihilidad", + "memory": "La Reminiscencia", + "elation": "La Exultación", + "fire": "Fuego", + "ice": "Hielo", + "imaginary": "Imaginario", + "physical": "Físico", + "quantum": "Cuántico", + "thunder": "Rayo", + "wind": "Viento", + "hp": "PV", + "atk": "ATQ", + "speed": "VEL", + "critRate": "Prob. CRIT", + "critDmg": "Daño CRIT", + "breakEffect": "Efecto de Ruptura", + "effectRes": "RES a Efecto", + "energyRegenerationRate": "Recuperación de Energía", + "effectHitRate": "Acierto de Efecto", + "outgoingHealingBoost": "Bono de Curación", + "fireDmgBoost": "Aumento de Daño de Fuego", + "iceDmgBoost": "Aumento de Daño de Hielo", + "imaginaryDmgBoost": "Aumento de Daño Imaginario", + "physicalDmgBoost": "Aumento de Daño Físico", + "quantumDmgBoost": "Aumento de Daño Cuántico", + "thunderDmgBoost": "Aumento de Daño de Rayo", + "windDmgBoost": "Aumento de Daño de Viento", + "pursued": "Daño adicional", + "true damage": "Daño verdadero", + "elationdamage": "Daño de Exultación", + "follow-up": "Daño de Ataque Adicional", + "elemental damage": "Daño de Ruptura y Superruptura", + "dot": "Daño con el tiempo", + "qte": "Habilidad QTE", + "level": "Nivel", + "relics": "Artefactos", + "eidolons": "Eidolones", + "lightcones": "Conos de Luz", + "loadData": "Cargar datos", + "exportData": "Exportar datos", + "connectSetting": "Ajustes de conexión", + "connected": "Conectado", + "unconnected": "Desconectado", + "psConnection": "Conexión PS", + "connectionType": "Tipo de conexión", + "status": "Estado", + "connectPs": "Conectar PS", + "disconnect": "Desconectar", + "other": "Otro", + "freeSr": "FreeSR", + "database": "Base de datos", + "enka": "Enka", + "monsterSetting": "Ajuste de Monstruos", + "serverUrl": "URL del Servidor", + "privateType": "Tipo privado", + "local": "Local", + "server": "Servidor", + "username": "Usuario", + "password": "Contraseña", + "placeholderServerUrl": "Introducir URL del servidor", + "placeholderUsername": "Introducir usuario", + "placeholderPassword": "Introducir contraseña", + "connectedSuccess": "Conectado a PS exitosamente", + "connectedFailed": "Fallo al conectar a PS", + "syncSuccess": "Datos sincronizados a PS exitosamente", + "syncFailed": "Fallo al sincronizar datos a PS", + "sync": "Sincronizar", + "importSetting": "Ajustes de Importación", + "profile": "Perfil", + "default": "Por defecto", + "copyProfiles": "Copiar perfiles", + "addNewProfile": "Añadir nuevo perfil", + "createNewProfile": "Crear nuevo perfil", + "editProfile": "Editar perfil", + "placeholderProfileName": "Introducir nombre de perfil", + "profileName": "Nombre del perfil", + "create": "Crear", + "update": "Actualizar", + "characterInformation": "Información del personaje", + "skills": "Habilidades", + "showcaseCard": "Tarjeta de presentación del personaje", + "comingSoon": "Próximamente", + "characterName": "Nombre del personaje", + "placeholderCharacter": "Introducir nombre del personaje", + "characterSettings": "Ajustes del Personaje", + "levelConfiguration": "Configuración de Nivel", + "characterLevel": "Nivel de Personaje", + "max": "MÁX", + "ultimateEnergy": "Energía de Habilidad Definitiva", + "currentEnergy": "Energía al inicio del combate", + "setTo50": "Ajustar al 50%", + "battleConfiguration": "Configuración de Batalla", + "useTechnique": "Usar Técnica", + "techniqueNote": "Activar efectos de técnica pre-batalla", + "enhancement": "Mejora", + "enhancementLevel": "Nivel de Mejora", + "origin": "Original", + "enhancedNote": "Niveles superiores desbloquean más habilidades", + "lightconeEquipment": "Equipamiento de Cono de Luz", + "lightconeSettings": "Ajustes de Cono de Luz", + "placeholderLevel": "Introducir nivel", + "superimpositionRank": "Rango de Superposición", + "ranksNote": "Rangos mayores ofrecen efectos más fuertes", + "changeLightcone": "Cambiar Cono de Luz", + "removeLightcone": "Quitar Cono de Luz", + "equipLightcone": "Equipar Cono de Luz", + "noLightconeEquipped": "Sin Cono de Luz", + "equipLightconeNote": "Equipa un cono de luz para mejorar tu personaje", + "filter": "Filtro", + "selectedCharacters": "Personajes Seleccionados", + "selectedProfiles": "Perfiles Seleccionados", + "clearAll": "Limpiar Todo", + "selectAll": "Seleccionar Todo", + "copy": "Copiar", + "copied": "Copiado", + "noAvatarSelected": "Ningún personaje seleccionado", + "noAvatarToCopySelected": "Ningún personaje seleccionado para copiar", + "pleaseSelectAtLeastOneProfile": "Por favor, selecciona al menos un perfil", + "pleaseEnterUid": "Por favor, introduce UID", + "failedToFetchEnkaData": "Fallo al obtener datos de Enka", + "pleaseSelectAtLeastOneCharacter": "Por favor, selecciona al menos un personaje", + "noDataToImport": "Sin datos para importar", + "pleaseSelectAFile": "Por favor, selecciona un archivo", + "fileMustBeAValidJsonFile": "El archivo debe ser un JSON válido", + "importEnkaDataSuccess": "Datos de Enka importados con éxito", + "importFreeSRDataSuccess": "Datos de FreeSR importados con éxito", + "importDatabaseSuccess": "Base de datos importada con éxito", + "getData": "Obtener Datos", + "import": "Importar", + "freeSRImport": "Importar FreeSR", + "onlySupportFreeSRJsonFile": "Solo soporta archivos JSON de FreeSR", + "pickAFile": "Elegir un archivo", + "lightConeSetting": "Ajuste de Cono de Luz", + "relicMaker": "Creador de Artefactos", + "pleaseSelectAllOptions": "Por favor selecciona todas las opciones", + "relicSavedSuccessfully": "Artefacto guardado exitosamente", + "mainSettings": "Ajustes Principales", + "mainStat": "Estadística Principal", + "set": "Conjunto", + "pleaseSelectASet": "Por favor, selecciona un conjunto", + "effectBonus": "Bono de Efecto", + "totalRoll": "Total de Mejoras", + "randomizeStats": "Estadísticas Aleatorias", + "randomizeRolls": "Mejoras Aleatorias", + "selectASubStat": "Seleccionar estadística secundaria", + "selectASet": "Seleccionar conjunto", + "selectAMainStat": "Seleccionar estadística principal", + "save": "Guardar", + "reset": "Reiniciar", + "roll": "Mejora", + "step": "Paso", + "memoryOfChaos": "Memoria del Caos", + "pureFiction": "Pura Ficción", + "apocalypticShadow": "Sombra Apocalíptica", + "customEnemy": "Enemigo Personalizado", + "simulatedUniverse": "Universo Simulado", + "floor": "Piso", + "side": "Lado", + "wave": "Oleada", + "stage": "Etapa", + "useCycleCount": "¿Usar conteo de ciclos?", + "useTurbulenceBuff": "¿Usar buff de turbulencia?", + "firstHalfEnemies": "Enemigos primera mitad", + "secondHalfEnemies": "Enemigos segunda mitad", + "firstNodeEnemies": "Enemigos del nodo 1", + "secondNodeEnemies": "Enemigos del nodo 2", + "thirdNodeEnemies": "Enemigos del nodo 3", + "firstNode": "Nodo 1", + "secondNode": "Nodo 2", + "thirdNode": "Nodo 3", + "listEnemies": "Lista de enemigos", + "turbulenceBuff": "Buff de Turbulencia", + "noEventSelected": "Ningún evento seleccionado", + "noTurbulenceBuff": "Sin Buff de Turbulencia", + "upper": "Superior", + "lower": "Inferior", + "upperToLower": "Superior -> Inferior", + "lowerToUpper": "Inferior -> Superior", + "selectMOCEvent": "Seleccionar evento de MOC", + "selectPFEvent": "Seleccionar evento de PF", + "selectASEvent": "Seleccionar evento de AS", + "selectCEEvent": "Seleccionar evento de CE", + "selectEvent": "Seleccionar Evento", + "selectFloor": "Seleccionar Piso", + "selectSide": "Seleccionar Lado", + "selectBuff": "Seleccionar Buff", + "selectStage": "Seleccionar Etapa", + "previous": "Anterior", + "next": "Siguiente", + "noMonstersFound": "No se encontraron monstruos", + "addNewWave": "Añadir Nueva Oleada", + "searchStage": "Buscar etapa...", + "noStageFound": "No se encontró etapa", + "searchMonster": "Buscar monstruo...", + "changeRelic": "Cambiar artefacto", + "deleteRelic": "Borrar artefacto", + "deleteRelicConfirm": "¿Seguro que quieres borrar el artefacto en este espacio?", + "setEffects": "Configurar Efectos", + "details": "Detalles", + "normal": "Ataque Básico", "bpskill": "Habilidad", "maze": "Técnica", "ultra": "Habilidad Definitiva", "assist": "Habilidad de asistencia", "servantskill": "Habilidad de Mnemoduende", - "severaltalent": "Talento de Mnemoduende", - "singleattack": "Ataque Individual", - "enhance": "Mejorar", - "summon": "Invocar", - "mazeattack": "Ataque de Técnica", - "blast": "Ráfaga", - "restore": "Restaurar", - "support": "Soporte", - "aoeattack": "Ataque en Área", - "impair": "Debilitación", - "bounce": "Rebote", - "active": "Activo", - "defence": "Defensa", - "inactive": "Inactivo", - "maxAll": "Maximizar Todo", - "maxAllSuccess": "Habilidades maximizadas con éxito.", - "maxAllFailed": "Fallo al maximizar habilidades.", - "noRelicEquipped": "Sin artefacto equipado", - "anomalyArbitration": "Arbitraje Atípico", - "normalMode": "Modo Normal", - "hardMode": "Modo Difícil", - "selectPEAKEvent": "Seleccionar evento PEAK", - "mode": "Modo", - "selectMode": "Seleccionar un modo", - "rollBack": "Retroceder", - "upRoll": "Subir Mejora", - "downRoll": "Bajar Mejora", - "actions": "Acciones", - "avatars": "Avatares", - "quickView": "Vista Rápida", - "extraSetting": "Ajustes Extra", - "disableCensorship": "Desactivar Censura", - "hideUI": "Ocultar UI", - "theoryCraftMode": "Modo Theorycraft", - "cycleCount": "Conteo de Ciclos", - "pleaseSelectAllSubStats": "Por favor selecciona todas las sub-estadísticas", - "subStatRollCountCannotBeZero": "El conteo de mejoras no puede ser cero", - "theoryCraft": "Theorycraft", - "multipathCharacter": "Personaje Multivía", - "mainPath": "Vía Principal", - "march7Path": "Vía de Siete de Marzo", - "challenge": "Desafío", - "skipNode": "Saltar Nodo", - "disableSkip": "Desactivar salto", - "skipNode1": "Saltar nodo 1", - "skipNode2": "Saltar nodo 2", - "extraFeatures": "Características Extra", - "detailTheoryCraft": "Permite personalizar los ciclos y la vida del enemigo en los ajustes.", - "detailSkipNode": "Permite saltar el Nodo 1 o 2 en Memoria del Caos o Pura Ficción.", - "detailChallengePeak": "Permite cambiar la temporada actual de Arbitraje Atípico.", - "detailHiddenUi": "Oculta la interfaz del juego.", - "detailDisableCensorship": "Desactiva la censura dentro del juego.", - "detailMultipathCharacter": "Permite cambiar la Vía de algunos personajes.", - "trailblazer": "Trazacaminos", - "listExtraEffect": "Lista de Efectos Extra", - "extra": "Extra", - "customLineup": "Alineación de equipo personalizada" - } + "severaltalent": "Talento de Mnemoduende", + "singleattack": "Ataque Individual", + "enhance": "Mejorar", + "summon": "Invocar", + "mazeattack": "Ataque de Técnica", + "blast": "Ráfaga", + "restore": "Restaurar", + "support": "Soporte", + "aoeattack": "Ataque en Área", + "impair": "Debilitación", + "bounce": "Rebote", + "active": "Activo", + "defence": "Defensa", + "inactive": "Inactivo", + "maxAll": "Maximizar Todo", + "maxAllSuccess": "Habilidades maximizadas con éxito.", + "maxAllFailed": "Fallo al maximizar habilidades.", + "noRelicEquipped": "Sin artefacto equipado", + "anomalyArbitration": "Arbitraje Atípico", + "normalMode": "Modo Normal", + "hardMode": "Modo Difícil", + "selectPEAKEvent": "Seleccionar evento PEAK", + "mode": "Modo", + "selectMode": "Seleccionar un modo", + "rollBack": "Retroceder", + "upRoll": "Subir Mejora", + "downRoll": "Bajar Mejora", + "actions": "Acciones", + "avatars": "Avatares", + "quickView": "Vista Rápida", + "extraSetting": "Ajustes Extra", + "disableCensorship": "Desactivar Censura", + "hideUI": "Ocultar UI", + "theoryCraftMode": "Modo Theorycraft", + "cycleCount": "Conteo de Ciclos", + "pleaseSelectAllSubStats": "Por favor selecciona todas las sub-estadísticas", + "subStatRollCountCannotBeZero": "El conteo de mejoras no puede ser cero", + "theoryCraft": "Theorycraft", + "multipathCharacter": "Personaje Multivía", + "mainPath": "Vía Principal", + "march7Path": "Vía de Siete de Marzo", + "challenge": "Desafío", + "skipNode": "Saltar Nodo", + "disableSkip": "Desactivar salto", + "skipNode1": "Saltar nodo 1", + "skipNode2": "Saltar nodo 2", + "extraFeatures": "Características Extra", + "detailTheoryCraft": "Permite personalizar los ciclos y la vida del enemigo en los ajustes.", + "detailSkipNode": "Permite saltar el Nodo 1 o 2 en Memoria del Caos o Pura Ficción.", + "detailChallengePeak": "Permite cambiar la temporada actual de Arbitraje Atípico.", + "detailHiddenUi": "Oculta la interfaz del juego.", + "detailDisableCensorship": "Desactiva la censura dentro del juego.", + "detailMultipathCharacter": "Permite cambiar la Vía de algunos personajes.", + "trailblazer": "Trazacaminos", + "listExtraEffect": "Lista de Efectos Extra", + "extra": "Extra", + "customLineup": "Alineación de equipo personalizada", + "def": "DEF", + "language": "Idioma" + } } diff --git a/messages/fr.json b/messages/fr.json index 57fca61..b4d48c8 100644 --- a/messages/fr.json +++ b/messages/fr.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Outils Firefly par Firefly Shelter" - }, - "DataPage": { - "skillType": "Type de Compétence", - "skillName": "Nom de Compétence", - "character": "Personnage", - "id": "Id", - "path": "Voie", - "rarity": "Rareté", - "element": "Élément", - "technique": "Technique", - "talent": "Talent", - "basic": "Attaque Normale", - "skill": "Compétence", - "ultimate": "Ultime", - "servant": "Serviteur", - "damage": "Dégâts", - "type": "Type", - "warrior": "La Destruction", - "knight": "La Préservation", - "mage": "L'Érudition", - "priest": "L'Abondance", - "rogue": "La Chasse", - "shaman": "L'Harmonie", - "warlock": "La Nihilité", - "memory": "Le Souvenir", - "elation": "L'Allégresse", - "fire": "Feu", - "ice": "Glace", - "imaginary": "Imaginaire", - "physical": "Physique", - "quantum": "Quantique", - "thunder": "Foudre", - "wind": "Vent", - "hp": "PV", - "atk": "ATQ", - "speed": "VIT", - "critRate": "Taux CRIT", - "critDmg": "DGT CRIT", - "breakEffect": "Effet de Rupture", - "effectRes": "RÉS aux effets", - "energyRegenerationRate": "Taux de régénération d'énergie", - "effectHitRate": "Chances d'application d'effets", - "outgoingHealingBoost": "Augmentation des soins", - "fireDmgBoost": "Bonus de dégâts de Feu", - "iceDmgBoost": "Bonus de dégâts de Glace", - "imaginaryDmgBoost": "Bonus de dégâts Imaginaire", - "physicalDmgBoost": "Bonus de dégâts Physique", - "quantumDmgBoost": "Bonus de dégâts Quantique", - "thunderDmgBoost": "Bonus de dégâts de Foudre", - "windDmgBoost": "Bonus de dégâts de Vent", - "pursued": "Dégâts additionnels", - "true damage": "Dégâts bruts", - "elationdamage": "Dégâts d'Allégresse", - "follow-up": "Dégâts d'attaque de suivi", - "elemental damage": "Dégâts de Rupture et Super Rupture", - "dot": "Dégâts sur la durée", - "qte": "Compétence QTE", - "level": "Niveau", - "relics": "Reliques", - "eidolons": "Eidolons", - "lightcones": "Cônes de Lumière", - "loadData": "Charger les données", - "exportData": "Exporter les données", - "connectSetting": "Paramètres de connexion", - "connected": "Connecté", - "unconnected": "Déconnecté", - "psConnection": "Connexion PS", - "connectionType": "Type de connexion", - "status": "Statut", - "connectPs": "Connecter PS", - "disconnect": "Déconnecter", - "other": "Autre", - "freeSr": "FreeSR", - "database": "Base de données", - "enka": "Enka", - "monsterSetting": "Paramètre de monstres", - "serverUrl": "URL du Serveur", - "privateType": "Type privé", - "local": "Local", - "server": "Serveur", - "username": "Nom d'utilisateur", - "password": "Mot de passe", - "placeholderServerUrl": "Entrer l'URL du serveur", - "placeholderUsername": "Entrer le nom d'utilisateur", - "placeholderPassword": "Entrer le mot de passe", - "connectedSuccess": "Connecté au PS avec succès", - "connectedFailed": "Échec de connexion au PS", - "syncSuccess": "Données synchronisées au PS avec succès", - "syncFailed": "Échec de synchronisation au PS", - "sync": "Synchroniser", - "importSetting": "Paramètres d'importation", - "profile": "Profil", - "default": "Défaut", - "copyProfiles": "Copier les profils", - "addNewProfile": "Ajouter un nouveau profil", - "createNewProfile": "Créer un nouveau profil", - "editProfile": "Éditer le profil", - "placeholderProfileName": "Entrer le nom du profil", - "profileName": "Nom du profil", - "create": "Créer", - "update": "Mettre à jour", - "characterInformation": "Informations du personnage", - "skills": "Compétences", - "showcaseCard": "Carte de présentation", - "comingSoon": "Bientôt disponible", - "characterName": "Nom du personnage", - "placeholderCharacter": "Entrer le nom du personnage", - "characterSettings": "Paramètres du personnage", - "levelConfiguration": "Configuration de niveau", - "characterLevel": "Niveau du personnage", - "max": "MAX", - "ultimateEnergy": "Énergie de l'Ultime", - "currentEnergy": "Énergie actuelle", - "setTo50": "Régler sur 50%", - "battleConfiguration": "Configuration de combat", - "useTechnique": "Utiliser Technique", - "techniqueNote": "Activer les effets de technique avant le combat", - "enhancement": "Amélioration", - "enhancementLevel": "Niveau d'amélioration", - "origin": "Origine", - "enhancedNote": "Les améliorations élevées débloquent des compétences", - "lightconeEquipment": "Équipement de Cône de Lumière", - "lightconeSettings": "Paramètres de Cône de Lumière", - "placeholderLevel": "Entrer le niveau", - "superimpositionRank": "Rang de Superposition", - "ranksNote": "Les rangs élevés offrent des effets plus forts", - "changeLightcone": "Changer de Cône de Lumière", - "removeLightcone": "Retirer le Cône de Lumière", - "equipLightcone": "Équiper un Cône de Lumière", - "noLightconeEquipped": "Aucun Cône de Lumière", - "equipLightconeNote": "Équipez un cône pour renforcer votre personnage", - "filter": "Filtre", - "selectedCharacters": "Personnages sélectionnés", - "selectedProfiles": "Profils sélectionnés", - "clearAll": "Tout effacer", - "selectAll": "Tout sélectionner", - "copy": "Copier", - "copied": "Copié", - "noAvatarSelected": "Aucun personnage sélectionné", - "noAvatarToCopySelected": "Aucun personnage à copier sélectionné", - "pleaseSelectAtLeastOneProfile": "Veuillez sélectionner au moins un profil", - "pleaseEnterUid": "Veuillez entrer un UID", - "failedToFetchEnkaData": "Échec de récupération des données Enka", - "pleaseSelectAtLeastOneCharacter": "Veuillez sélectionner au moins un personnage", - "noDataToImport": "Aucune donnée à importer", - "pleaseSelectAFile": "Veuillez sélectionner un fichier", - "fileMustBeAValidJsonFile": "Le fichier doit être un JSON valide", - "importEnkaDataSuccess": "Importation Enka réussie", - "importFreeSRDataSuccess": "Importation FreeSR réussie", - "importDatabaseSuccess": "Importation de base de données réussie", - "getData": "Obtenir des données", - "import": "Importer", - "freeSRImport": "Importation FreeSR", - "onlySupportFreeSRJsonFile": "Supporte uniquement les fichiers JSON FreeSR", - "pickAFile": "Choisir un fichier", - "lightConeSetting": "Paramètre de Cône de Lumière", - "relicMaker": "Créateur de Reliques", - "pleaseSelectAllOptions": "Veuillez sélectionner toutes les options", - "relicSavedSuccessfully": "Relique sauvegardée avec succès", - "mainSettings": "Paramètres principaux", - "mainStat": "Statistique principale", - "set": "Set", - "pleaseSelectASet": "Veuillez sélectionner un set", - "effectBonus": "Bonus d'effet", - "totalRoll": "Total d'améliorations", - "randomizeStats": "Statistiques aléatoires", - "randomizeRolls": "Améliorations aléatoires", - "selectASubStat": "Sélectionner une stat secondaire", - "selectASet": "Sélectionner un set", - "selectAMainStat": "Sélectionner une stat principale", - "save": "Sauvegarder", - "reset": "Réinitialiser", - "roll": "Amélioration", - "step": "Étape", - "memoryOfChaos": "Mémoire du Chaos", - "pureFiction": "Pure Fiction", - "apocalypticShadow": "Ombre Apocalyptique", - "customEnemy": "Ennemi personnalisé", - "simulatedUniverse": "Univers Simulé", - "floor": "Étage", - "side": "Côté", - "wave": "Vague", - "stage": "Niveau", - "useCycleCount": "Utiliser le compteur de cycles ?", - "useTurbulenceBuff": "Utiliser le buff de turbulence ?", - "firstHalfEnemies": "Ennemis première moitié", - "secondHalfEnemies": "Ennemis deuxième moitié", - "firstNodeEnemies": "Ennemis du nœud 1", - "secondNodeEnemies": "Ennemis du nœud 2", - "thirdNodeEnemies": "Ennemis du nœud 3", - "firstNode": "Nœud 1", - "secondNode": "Nœud 2", - "thirdNode": "Nœud 3", - "listEnemies": "Liste des ennemis", - "turbulenceBuff": "Buff de Turbulence", - "noEventSelected": "Aucun événement sélectionné", - "noTurbulenceBuff": "Aucun Buff de Turbulence", - "upper": "Supérieur", - "lower": "Inférieur", - "upperToLower": "Supérieur -> Inférieur", - "lowerToUpper": "Inférieur -> Supérieur", - "selectMOCEvent": "Sélectionner un événement MOC", - "selectPFEvent": "Sélectionner un événement PF", - "selectASEvent": "Sélectionner un événement AS", - "selectCEEvent": "Sélectionner un événement CE", - "selectEvent": "Sélectionner un événement", - "selectFloor": "Sélectionner un étage", - "selectSide": "Sélectionner un côté", - "selectBuff": "Sélectionner un buff", - "selectStage": "Sélectionner un niveau", - "previous": "Précédent", - "next": "Suivant", - "noMonstersFound": "Aucun monstre trouvé", - "addNewWave": "Ajouter une nouvelle vague", - "searchStage": "Chercher un niveau...", - "noStageFound": "Aucun niveau trouvé", - "searchMonster": "Chercher un monstre...", - "changeRelic": "Changer de relique", - "deleteRelic": "Supprimer la relique", - "deleteRelicConfirm": "Êtes-vous sûr de vouloir supprimer la relique de cet emplacement ?", - "setEffects": "Définir les effets", - "details": "Détails", - "normal": "Attaque Normale", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Outils Firefly par Firefly Shelter" + }, + "DataPage": { + "skillType": "Type de Compétence", + "skillName": "Nom de Compétence", + "character": "Personnage", + "id": "Id", + "path": "Voie", + "rarity": "Rareté", + "element": "Élément", + "technique": "Technique", + "talent": "Talent", + "basic": "Attaque Normale", + "skill": "Compétence", + "ultimate": "Ultime", + "servant": "Serviteur", + "damage": "Dégâts", + "type": "Type", + "warrior": "La Destruction", + "knight": "La Préservation", + "mage": "L'Érudition", + "priest": "L'Abondance", + "rogue": "La Chasse", + "shaman": "L'Harmonie", + "warlock": "La Nihilité", + "memory": "Le Souvenir", + "elation": "L'Allégresse", + "fire": "Feu", + "ice": "Glace", + "imaginary": "Imaginaire", + "physical": "Physique", + "quantum": "Quantique", + "thunder": "Foudre", + "wind": "Vent", + "hp": "PV", + "atk": "ATQ", + "speed": "VIT", + "critRate": "Taux CRIT", + "critDmg": "DGT CRIT", + "breakEffect": "Effet de Rupture", + "effectRes": "RÉS aux effets", + "energyRegenerationRate": "Taux de régénération d'énergie", + "effectHitRate": "Chances d'application d'effets", + "outgoingHealingBoost": "Augmentation des soins", + "fireDmgBoost": "Bonus de dégâts de Feu", + "iceDmgBoost": "Bonus de dégâts de Glace", + "imaginaryDmgBoost": "Bonus de dégâts Imaginaire", + "physicalDmgBoost": "Bonus de dégâts Physique", + "quantumDmgBoost": "Bonus de dégâts Quantique", + "thunderDmgBoost": "Bonus de dégâts de Foudre", + "windDmgBoost": "Bonus de dégâts de Vent", + "pursued": "Dégâts additionnels", + "true damage": "Dégâts bruts", + "elationdamage": "Dégâts d'Allégresse", + "follow-up": "Dégâts d'attaque de suivi", + "elemental damage": "Dégâts de Rupture et Super Rupture", + "dot": "Dégâts sur la durée", + "qte": "Compétence QTE", + "level": "Niveau", + "relics": "Reliques", + "eidolons": "Eidolons", + "lightcones": "Cônes de Lumière", + "loadData": "Charger les données", + "exportData": "Exporter les données", + "connectSetting": "Paramètres de connexion", + "connected": "Connecté", + "unconnected": "Déconnecté", + "psConnection": "Connexion PS", + "connectionType": "Type de connexion", + "status": "Statut", + "connectPs": "Connecter PS", + "disconnect": "Déconnecter", + "other": "Autre", + "freeSr": "FreeSR", + "database": "Base de données", + "enka": "Enka", + "monsterSetting": "Paramètre de monstres", + "serverUrl": "URL du Serveur", + "privateType": "Type privé", + "local": "Local", + "server": "Serveur", + "username": "Nom d'utilisateur", + "password": "Mot de passe", + "placeholderServerUrl": "Entrer l'URL du serveur", + "placeholderUsername": "Entrer le nom d'utilisateur", + "placeholderPassword": "Entrer le mot de passe", + "connectedSuccess": "Connecté au PS avec succès", + "connectedFailed": "Échec de connexion au PS", + "syncSuccess": "Données synchronisées au PS avec succès", + "syncFailed": "Échec de synchronisation au PS", + "sync": "Synchroniser", + "importSetting": "Paramètres d'importation", + "profile": "Profil", + "default": "Défaut", + "copyProfiles": "Copier les profils", + "addNewProfile": "Ajouter un nouveau profil", + "createNewProfile": "Créer un nouveau profil", + "editProfile": "Éditer le profil", + "placeholderProfileName": "Entrer le nom du profil", + "profileName": "Nom du profil", + "create": "Créer", + "update": "Mettre à jour", + "characterInformation": "Informations du personnage", + "skills": "Compétences", + "showcaseCard": "Carte de présentation", + "comingSoon": "Bientôt disponible", + "characterName": "Nom du personnage", + "placeholderCharacter": "Entrer le nom du personnage", + "characterSettings": "Paramètres du personnage", + "levelConfiguration": "Configuration de niveau", + "characterLevel": "Niveau du personnage", + "max": "MAX", + "ultimateEnergy": "Énergie de l'Ultime", + "currentEnergy": "Énergie actuelle", + "setTo50": "Régler sur 50%", + "battleConfiguration": "Configuration de combat", + "useTechnique": "Utiliser Technique", + "techniqueNote": "Activer les effets de technique avant le combat", + "enhancement": "Amélioration", + "enhancementLevel": "Niveau d'amélioration", + "origin": "Origine", + "enhancedNote": "Les améliorations élevées débloquent des compétences", + "lightconeEquipment": "Équipement de Cône de Lumière", + "lightconeSettings": "Paramètres de Cône de Lumière", + "placeholderLevel": "Entrer le niveau", + "superimpositionRank": "Rang de Superposition", + "ranksNote": "Les rangs élevés offrent des effets plus forts", + "changeLightcone": "Changer de Cône de Lumière", + "removeLightcone": "Retirer le Cône de Lumière", + "equipLightcone": "Équiper un Cône de Lumière", + "noLightconeEquipped": "Aucun Cône de Lumière", + "equipLightconeNote": "Équipez un cône pour renforcer votre personnage", + "filter": "Filtre", + "selectedCharacters": "Personnages sélectionnés", + "selectedProfiles": "Profils sélectionnés", + "clearAll": "Tout effacer", + "selectAll": "Tout sélectionner", + "copy": "Copier", + "copied": "Copié", + "noAvatarSelected": "Aucun personnage sélectionné", + "noAvatarToCopySelected": "Aucun personnage à copier sélectionné", + "pleaseSelectAtLeastOneProfile": "Veuillez sélectionner au moins un profil", + "pleaseEnterUid": "Veuillez entrer un UID", + "failedToFetchEnkaData": "Échec de récupération des données Enka", + "pleaseSelectAtLeastOneCharacter": "Veuillez sélectionner au moins un personnage", + "noDataToImport": "Aucune donnée à importer", + "pleaseSelectAFile": "Veuillez sélectionner un fichier", + "fileMustBeAValidJsonFile": "Le fichier doit être un JSON valide", + "importEnkaDataSuccess": "Importation Enka réussie", + "importFreeSRDataSuccess": "Importation FreeSR réussie", + "importDatabaseSuccess": "Importation de base de données réussie", + "getData": "Obtenir des données", + "import": "Importer", + "freeSRImport": "Importation FreeSR", + "onlySupportFreeSRJsonFile": "Supporte uniquement les fichiers JSON FreeSR", + "pickAFile": "Choisir un fichier", + "lightConeSetting": "Paramètre de Cône de Lumière", + "relicMaker": "Créateur de Reliques", + "pleaseSelectAllOptions": "Veuillez sélectionner toutes les options", + "relicSavedSuccessfully": "Relique sauvegardée avec succès", + "mainSettings": "Paramètres principaux", + "mainStat": "Statistique principale", + "set": "Set", + "pleaseSelectASet": "Veuillez sélectionner un set", + "effectBonus": "Bonus d'effet", + "totalRoll": "Total d'améliorations", + "randomizeStats": "Statistiques aléatoires", + "randomizeRolls": "Améliorations aléatoires", + "selectASubStat": "Sélectionner une stat secondaire", + "selectASet": "Sélectionner un set", + "selectAMainStat": "Sélectionner une stat principale", + "save": "Sauvegarder", + "reset": "Réinitialiser", + "roll": "Amélioration", + "step": "Étape", + "memoryOfChaos": "Mémoire du Chaos", + "pureFiction": "Pure Fiction", + "apocalypticShadow": "Ombre Apocalyptique", + "customEnemy": "Ennemi personnalisé", + "simulatedUniverse": "Univers Simulé", + "floor": "Étage", + "side": "Côté", + "wave": "Vague", + "stage": "Niveau", + "useCycleCount": "Utiliser le compteur de cycles ?", + "useTurbulenceBuff": "Utiliser le buff de turbulence ?", + "firstHalfEnemies": "Ennemis première moitié", + "secondHalfEnemies": "Ennemis deuxième moitié", + "firstNodeEnemies": "Ennemis du nœud 1", + "secondNodeEnemies": "Ennemis du nœud 2", + "thirdNodeEnemies": "Ennemis du nœud 3", + "firstNode": "Nœud 1", + "secondNode": "Nœud 2", + "thirdNode": "Nœud 3", + "listEnemies": "Liste des ennemis", + "turbulenceBuff": "Buff de Turbulence", + "noEventSelected": "Aucun événement sélectionné", + "noTurbulenceBuff": "Aucun Buff de Turbulence", + "upper": "Supérieur", + "lower": "Inférieur", + "upperToLower": "Supérieur -> Inférieur", + "lowerToUpper": "Inférieur -> Supérieur", + "selectMOCEvent": "Sélectionner un événement MOC", + "selectPFEvent": "Sélectionner un événement PF", + "selectASEvent": "Sélectionner un événement AS", + "selectCEEvent": "Sélectionner un événement CE", + "selectEvent": "Sélectionner un événement", + "selectFloor": "Sélectionner un étage", + "selectSide": "Sélectionner un côté", + "selectBuff": "Sélectionner un buff", + "selectStage": "Sélectionner un niveau", + "previous": "Précédent", + "next": "Suivant", + "noMonstersFound": "Aucun monstre trouvé", + "addNewWave": "Ajouter une nouvelle vague", + "searchStage": "Chercher un niveau...", + "noStageFound": "Aucun niveau trouvé", + "searchMonster": "Chercher un monstre...", + "changeRelic": "Changer de relique", + "deleteRelic": "Supprimer la relique", + "deleteRelicConfirm": "Êtes-vous sûr de vouloir supprimer la relique de cet emplacement ?", + "setEffects": "Définir les effets", + "details": "Détails", + "normal": "Attaque Normale", "bpskill": "Compétence", "maze": "Technique", "ultra": "Ultime", "assist": "Compétence d'assistance", "servantskill": "Compétence de Mémolutin", - "severaltalent": "Talent de Mémolutin", - "singleattack": "Attaque à cible unique", - "enhance": "Renforcement", - "summon": "Invocation", - "mazeattack": "Attaque de Technique", - "blast": "Diffusion", - "restore": "Restauration", - "support": "Soutien", - "aoeattack": "Attaque de zone", - "impair": "Malus", - "bounce": "Rebond", - "active": "Actif", - "defence": "Défense", - "inactive": "Inactif", - "maxAll": "Tout maximiser", - "maxAllSuccess": "Compétences maximisées avec succès.", - "maxAllFailed": "Échec de maximisation.", - "noRelicEquipped": "Aucune relique équipée", - "anomalyArbitration": "Arbitrage d'Anomalie", - "normalMode": "Mode Normal", - "hardMode": "Mode Difficile", - "selectPEAKEvent": "Sélectionner un événement PEAK", - "mode": "Mode", - "selectMode": "Sélectionner un mode", - "rollBack": "Annuler l'étape", - "upRoll": "Augmenter l'amélioration", - "downRoll": "Diminuer l'amélioration", - "actions": "Actions", - "avatars": "Avatars", - "quickView": "Aperçu rapide", - "extraSetting": "Paramètres supplémentaires", - "disableCensorship": "Désactiver la censure", - "hideUI": "Cacher l'UI", - "theoryCraftMode": "Mode Theorycraft", - "cycleCount": "Nombre de cycles", - "pleaseSelectAllSubStats": "Veuillez sélectionner toutes les stats secondaires", - "subStatRollCountCannotBeZero": "Les améliorations de stat secondaire ne peuvent être à zéro", - "theoryCraft": "Theorycraft", - "multipathCharacter": "Personnage Multi-Voies", - "mainPath": "Voie Principale", - "march7Path": "Voie de March 7th", - "challenge": "Défi", - "skipNode": "Passer le nœud", - "disableSkip": "Désactiver le passage", - "skipNode1": "Passer le nœud 1", - "skipNode2": "Passer le nœud 2", - "extraFeatures": "Fonctionnalités supplémentaires", - "detailTheoryCraft": "Permet de personnaliser le nombre de cycles et d'ajuster les PV ennemis.", - "detailSkipNode": "Permet de passer le nœud (1 ou 2) dans Mémoire du Chaos ou Pure Fiction.", - "detailChallengePeak": "Permet de changer la saison de Peak dans l'anomalie actuelle.", - "detailHiddenUi": "Cachera l'interface du jeu.", - "detailDisableCensorship": "Désactivera la censure du jeu.", - "detailMultipathCharacter": "Permet de changer la Voie de certains personnages.", - "trailblazer": "Pionnier", - "listExtraEffect": "Liste des effets supplémentaires", - "extra": "Extra", - "customLineup": "Composition personnalisée" - } + "severaltalent": "Talent de Mémolutin", + "singleattack": "Attaque à cible unique", + "enhance": "Renforcement", + "summon": "Invocation", + "mazeattack": "Attaque de Technique", + "blast": "Diffusion", + "restore": "Restauration", + "support": "Soutien", + "aoeattack": "Attaque de zone", + "impair": "Malus", + "bounce": "Rebond", + "active": "Actif", + "defence": "Défense", + "inactive": "Inactif", + "maxAll": "Tout maximiser", + "maxAllSuccess": "Compétences maximisées avec succès.", + "maxAllFailed": "Échec de maximisation.", + "noRelicEquipped": "Aucune relique équipée", + "anomalyArbitration": "Arbitrage d'Anomalie", + "normalMode": "Mode Normal", + "hardMode": "Mode Difficile", + "selectPEAKEvent": "Sélectionner un événement PEAK", + "mode": "Mode", + "selectMode": "Sélectionner un mode", + "rollBack": "Annuler l'étape", + "upRoll": "Augmenter l'amélioration", + "downRoll": "Diminuer l'amélioration", + "actions": "Actions", + "avatars": "Avatars", + "quickView": "Aperçu rapide", + "extraSetting": "Paramètres supplémentaires", + "disableCensorship": "Désactiver la censure", + "hideUI": "Cacher l'UI", + "theoryCraftMode": "Mode Theorycraft", + "cycleCount": "Nombre de cycles", + "pleaseSelectAllSubStats": "Veuillez sélectionner toutes les stats secondaires", + "subStatRollCountCannotBeZero": "Les améliorations de stat secondaire ne peuvent être à zéro", + "theoryCraft": "Theorycraft", + "multipathCharacter": "Personnage Multi-Voies", + "mainPath": "Voie Principale", + "march7Path": "Voie de March 7th", + "challenge": "Défi", + "skipNode": "Passer le nœud", + "disableSkip": "Désactiver le passage", + "skipNode1": "Passer le nœud 1", + "skipNode2": "Passer le nœud 2", + "extraFeatures": "Fonctionnalités supplémentaires", + "detailTheoryCraft": "Permet de personnaliser le nombre de cycles et d'ajuster les PV ennemis.", + "detailSkipNode": "Permet de passer le nœud (1 ou 2) dans Mémoire du Chaos ou Pure Fiction.", + "detailChallengePeak": "Permet de changer la saison de Peak dans l'anomalie actuelle.", + "detailHiddenUi": "Cachera l'interface du jeu.", + "detailDisableCensorship": "Désactivera la censure du jeu.", + "detailMultipathCharacter": "Permet de changer la Voie de certains personnages.", + "trailblazer": "Pionnier", + "listExtraEffect": "Liste des effets supplémentaires", + "extra": "Extra", + "customLineup": "Composition personnalisée", + "def": "DÉF", + "language": "Langue" + } } diff --git a/messages/id.json b/messages/id.json index 336819d..f074106 100644 --- a/messages/id.json +++ b/messages/id.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Alat Firefly oleh Firefly Shelter" - }, - "DataPage": { - "skillType": "Tipe Skill", - "skillName": "Nama Skill", - "character": "Karakter", - "id": "Id", - "path": "Path", - "rarity": "Rarity", - "element": "Elemen", - "technique": "Technique", - "talent": "Talent", - "basic": "Basic Attack", - "skill": "Skill", - "ultimate": "Ultimate", - "servant": "Servant", - "damage": "Damage", - "type": "Tipe", - "warrior": "The Destruction", - "knight": "The Preservation", - "mage": "The Erudition", - "priest": "The Abundance", - "rogue": "The Hunt", - "shaman": "The Harmony", - "warlock": "The Nihility", - "memory": "The Remembrance", - "elation": "The Elation", - "fire": "Fire", - "ice": "Ice", - "imaginary": "Imaginary", - "physical": "Physical", - "quantum": "Quantum", - "thunder": "Lightning", - "wind": "Wind", - "hp": "HP", - "atk": "ATK", - "speed": "SPD", - "critRate": "CRIT Rate", - "critDmg": "CRIT DMG", - "breakEffect": "Break Effect", - "effectRes": "Effect RES", - "energyRegenerationRate": "Energy Regeneration Rate", - "effectHitRate": "Effect Hit Rate", - "outgoingHealingBoost": "Outgoing Healing Boost", - "fireDmgBoost": "Fire DMG Boost", - "iceDmgBoost": "Ice DMG Boost", - "imaginaryDmgBoost": "Imaginary DMG Boost", - "physicalDmgBoost": "Physical DMG Boost", - "quantumDmgBoost": "Quantum DMG Boost", - "thunderDmgBoost": "Lightning DMG Boost", - "windDmgBoost": "Wind DMG Boost", - "pursued": "Additional Damage", - "true damage": "True Damage", - "elationdamage": "Elation Damage", - "follow-up": "Follow-up Attack Damage", - "elemental damage": "Break dan Super Break Damage", - "dot": "Damage Over Time", - "qte": "QTE Skill", - "level": "Level", - "relics": "Relic", - "eidolons": "Eidolon", - "lightcones": "Light Cone", - "loadData": "Muat data", - "exportData": "Ekspor data", - "connectSetting": "Pengaturan Koneksi", - "connected": "Terhubung", - "unconnected": "Tidak terhubung", - "psConnection": "Koneksi PS", - "connectionType": "Tipe Koneksi", - "status": "Status", - "connectPs": "Hubungkan PS", - "disconnect": "Putuskan sambungan", - "other": "Lainnya", - "freeSr": "FreeSR", - "database": "Database", - "enka": "Enka", - "monsterSetting": "Pengaturan Monster", - "serverUrl": "URL Server", - "privateType": "Tipe Private", - "local": "Lokal", - "server": "Server", - "username": "Username", - "password": "Password", - "placeholderServerUrl": "Masukkan URL server", - "placeholderUsername": "Masukkan username", - "placeholderPassword": "Masukkan password", - "connectedSuccess": "Berhasil terhubung ke PS", - "connectedFailed": "Gagal terhubung ke PS", - "syncSuccess": "Berhasil sinkronisasi data ke PS", - "syncFailed": "Gagal sinkronisasi data ke PS", - "sync": "Sinkronisasi", - "importSetting": "Pengaturan Impor", - "profile": "Profil", - "default": "Default", - "copyProfiles": "Salin profil", - "addNewProfile": "Tambah profil baru", - "createNewProfile": "Buat profil baru", - "editProfile": "Edit profil", - "placeholderProfileName": "Masukkan nama profil", - "profileName": "Nama profil", - "create": "Buat", - "update": "Perbarui", - "characterInformation": "Informasi Karakter", - "skills": "Skill", - "showcaseCard": "Showcase Card", - "comingSoon": "Segera hadir", - "characterName": "Nama Karakter", - "placeholderCharacter": "Masukkan nama karakter", - "characterSettings": "Pengaturan Karakter", - "levelConfiguration": "Konfigurasi Level", - "characterLevel": "Level Karakter", - "max": "MAX", - "ultimateEnergy": "Energy Ultimate", - "currentEnergy": "Energy Saat Ini", - "setTo50": "Atur ke 50%", - "battleConfiguration": "Konfigurasi Pertempuran", - "useTechnique": "Gunakan Technique", - "techniqueNote": "Aktifkan efek technique sebelum pertempuran", - "enhancement": "Enhancement", - "enhancementLevel": "Level Enhancement", - "origin": "Asli", - "enhancedNote": "Enhancement lebih tinggi membuka kemampuan tambahan", - "lightconeEquipment": "Peralatan Light Cone", - "lightconeSettings": "Pengaturan Light Cone", - "placeholderLevel": "Masukkan level", - "superimpositionRank": "Superimposition Rank", - "ranksNote": "Rank lebih tinggi memberikan efek lebih kuat", - "changeLightcone": "Ganti Light Cone", - "removeLightcone": "Lepas Light Cone", - "equipLightcone": "Pakai Light Cone", - "noLightconeEquipped": "Tidak Ada Light Cone", - "equipLightconeNote": "Pakai light cone untuk memperkuat karaktermu", - "filter": "Filter", - "selectedCharacters": "Karakter Dipilih", - "selectedProfiles": "Profil Dipilih", - "clearAll": "Bersihkan Semua", - "selectAll": "Pilih Semua", - "copy": "Salin", - "copied": "Tersalin", - "noAvatarSelected": "Tidak ada karakter dipilih", - "noAvatarToCopySelected": "Tidak ada karakter untuk disalin", - "pleaseSelectAtLeastOneProfile": "Pilih setidaknya satu profil", - "pleaseEnterUid": "Silakan masukkan UID", - "failedToFetchEnkaData": "Gagal mengambil data Enka", - "pleaseSelectAtLeastOneCharacter": "Pilih setidaknya satu karakter", - "noDataToImport": "Tidak ada data untuk diimpor", - "pleaseSelectAFile": "Silakan pilih file", - "fileMustBeAValidJsonFile": "File harus berupa file JSON yang valid", - "importEnkaDataSuccess": "Impor data Enka berhasil", - "importFreeSRDataSuccess": "Impor data FreeSR berhasil", - "importDatabaseSuccess": "Impor database berhasil", - "getData": "Dapatkan Data", - "import": "Impor", - "freeSRImport": "Impor FreeSR", - "onlySupportFreeSRJsonFile": "Hanya mendukung file JSON FreeSR", - "pickAFile": "Pilih sebuah file", - "lightConeSetting": "Pengaturan Light Cone", - "relicMaker": "Pembuat Relic", - "pleaseSelectAllOptions": "Silakan pilih semua opsi", - "relicSavedSuccessfully": "Relic berhasil disimpan", - "mainSettings": "Pengaturan Utama", - "mainStat": "Statistik Utama", - "set": "Set", - "pleaseSelectASet": "Pilih sebuah set", - "effectBonus": "Bonus Efek", - "totalRoll": "Total Roll", - "randomizeStats": "Acak Statistik", - "randomizeRolls": "Acak Roll", - "selectASubStat": "Pilih sub stat", - "selectASet": "Pilih sebuah set", - "selectAMainStat": "Pilih stat utama", - "save": "Simpan", - "reset": "Reset", - "roll": "Roll", - "step": "Langkah", - "memoryOfChaos": "Memory of Chaos", - "pureFiction": "Pure Fiction", - "apocalypticShadow": "Apocalyptic Shadow", - "customEnemy": "Musuh Kustom", - "simulatedUniverse": "Simulated Universe", - "floor": "Lantai", - "side": "Sisi", - "wave": "Gelombang", - "stage": "Tahap", - "useCycleCount": "Gunakan hitungan siklus?", - "useTurbulenceBuff": "Gunakan buff turbulence?", - "firstHalfEnemies": "Musuh paruh pertama", - "secondHalfEnemies": "Musuh paruh kedua", - "firstNodeEnemies": "Musuh Node 1", - "secondNodeEnemies": "Musuh Node 2", - "thirdNodeEnemies": "Musuh Node 3", - "firstNode": "Node 1", - "secondNode": "Node 2", - "thirdNode": "Node 3", - "listEnemies": "Daftar musuh", - "turbulenceBuff": "Turbulence Buff", - "noEventSelected": "Tidak ada event dipilih", - "noTurbulenceBuff": "Tanpa Turbulence Buff", - "upper": "Atas", - "lower": "Bawah", - "upperToLower": "Atas -> Bawah", - "lowerToUpper": "Bawah -> Atas", - "selectMOCEvent": "Pilih Event MOC", - "selectPFEvent": "Pilih Event PF", - "selectASEvent": "Pilih Event AS", - "selectCEEvent": "Pilih Event CE", - "selectEvent": "Pilih Event", - "selectFloor": "Pilih Lantai", - "selectSide": "Pilih Sisi", - "selectBuff": "Pilih Buff", - "selectStage": "Pilih Tahap", - "previous": "Sebelumnya", - "next": "Selanjutnya", - "noMonstersFound": "Tidak ada monster ditemukan", - "addNewWave": "Tambah Gelombang Baru", - "searchStage": "Cari tahap...", - "noStageFound": "Tahap tidak ditemukan", - "searchMonster": "Cari monster...", - "changeRelic": "Ganti relic", - "deleteRelic": "Hapus relic", - "deleteRelicConfirm": "Yakin ingin menghapus relic di slot ini?", - "setEffects": "Atur Efek", - "details": "Detail", - "normal": "Basic ATK", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Alat Firefly oleh Firefly Shelter" + }, + "DataPage": { + "skillType": "Tipe Skill", + "skillName": "Nama Skill", + "character": "Karakter", + "id": "Id", + "path": "Path", + "rarity": "Rarity", + "element": "Elemen", + "technique": "Technique", + "talent": "Talent", + "basic": "Basic Attack", + "skill": "Skill", + "ultimate": "Ultimate", + "servant": "Servant", + "damage": "Damage", + "type": "Tipe", + "warrior": "The Destruction", + "knight": "The Preservation", + "mage": "The Erudition", + "priest": "The Abundance", + "rogue": "The Hunt", + "shaman": "The Harmony", + "warlock": "The Nihility", + "memory": "The Remembrance", + "elation": "The Elation", + "fire": "Fire", + "ice": "Ice", + "imaginary": "Imaginary", + "physical": "Physical", + "quantum": "Quantum", + "thunder": "Lightning", + "wind": "Wind", + "hp": "HP", + "atk": "ATK", + "speed": "SPD", + "critRate": "CRIT Rate", + "critDmg": "CRIT DMG", + "breakEffect": "Break Effect", + "effectRes": "Effect RES", + "energyRegenerationRate": "Energy Regeneration Rate", + "effectHitRate": "Effect Hit Rate", + "outgoingHealingBoost": "Outgoing Healing Boost", + "fireDmgBoost": "Fire DMG Boost", + "iceDmgBoost": "Ice DMG Boost", + "imaginaryDmgBoost": "Imaginary DMG Boost", + "physicalDmgBoost": "Physical DMG Boost", + "quantumDmgBoost": "Quantum DMG Boost", + "thunderDmgBoost": "Lightning DMG Boost", + "windDmgBoost": "Wind DMG Boost", + "pursued": "Additional Damage", + "true damage": "True Damage", + "elationdamage": "Elation Damage", + "follow-up": "Follow-up Attack Damage", + "elemental damage": "Break dan Super Break Damage", + "dot": "Damage Over Time", + "qte": "QTE Skill", + "level": "Level", + "relics": "Relic", + "eidolons": "Eidolon", + "lightcones": "Light Cone", + "loadData": "Muat data", + "exportData": "Ekspor data", + "connectSetting": "Pengaturan Koneksi", + "connected": "Terhubung", + "unconnected": "Tidak terhubung", + "psConnection": "Koneksi PS", + "connectionType": "Tipe Koneksi", + "status": "Status", + "connectPs": "Hubungkan PS", + "disconnect": "Putuskan sambungan", + "other": "Lainnya", + "freeSr": "FreeSR", + "database": "Database", + "enka": "Enka", + "monsterSetting": "Pengaturan Monster", + "serverUrl": "URL Server", + "privateType": "Tipe Private", + "local": "Lokal", + "server": "Server", + "username": "Username", + "password": "Password", + "placeholderServerUrl": "Masukkan URL server", + "placeholderUsername": "Masukkan username", + "placeholderPassword": "Masukkan password", + "connectedSuccess": "Berhasil terhubung ke PS", + "connectedFailed": "Gagal terhubung ke PS", + "syncSuccess": "Berhasil sinkronisasi data ke PS", + "syncFailed": "Gagal sinkronisasi data ke PS", + "sync": "Sinkronisasi", + "importSetting": "Pengaturan Impor", + "profile": "Profil", + "default": "Default", + "copyProfiles": "Salin profil", + "addNewProfile": "Tambah profil baru", + "createNewProfile": "Buat profil baru", + "editProfile": "Edit profil", + "placeholderProfileName": "Masukkan nama profil", + "profileName": "Nama profil", + "create": "Buat", + "update": "Perbarui", + "characterInformation": "Informasi Karakter", + "skills": "Skill", + "showcaseCard": "Showcase Card", + "comingSoon": "Segera hadir", + "characterName": "Nama Karakter", + "placeholderCharacter": "Masukkan nama karakter", + "characterSettings": "Pengaturan Karakter", + "levelConfiguration": "Konfigurasi Level", + "characterLevel": "Level Karakter", + "max": "MAX", + "ultimateEnergy": "Energy Ultimate", + "currentEnergy": "Energy Saat Ini", + "setTo50": "Atur ke 50%", + "battleConfiguration": "Konfigurasi Pertempuran", + "useTechnique": "Gunakan Technique", + "techniqueNote": "Aktifkan efek technique sebelum pertempuran", + "enhancement": "Enhancement", + "enhancementLevel": "Level Enhancement", + "origin": "Asli", + "enhancedNote": "Enhancement lebih tinggi membuka kemampuan tambahan", + "lightconeEquipment": "Peralatan Light Cone", + "lightconeSettings": "Pengaturan Light Cone", + "placeholderLevel": "Masukkan level", + "superimpositionRank": "Superimposition Rank", + "ranksNote": "Rank lebih tinggi memberikan efek lebih kuat", + "changeLightcone": "Ganti Light Cone", + "removeLightcone": "Lepas Light Cone", + "equipLightcone": "Pakai Light Cone", + "noLightconeEquipped": "Tidak Ada Light Cone", + "equipLightconeNote": "Pakai light cone untuk memperkuat karaktermu", + "filter": "Filter", + "selectedCharacters": "Karakter Dipilih", + "selectedProfiles": "Profil Dipilih", + "clearAll": "Bersihkan Semua", + "selectAll": "Pilih Semua", + "copy": "Salin", + "copied": "Tersalin", + "noAvatarSelected": "Tidak ada karakter dipilih", + "noAvatarToCopySelected": "Tidak ada karakter untuk disalin", + "pleaseSelectAtLeastOneProfile": "Pilih setidaknya satu profil", + "pleaseEnterUid": "Silakan masukkan UID", + "failedToFetchEnkaData": "Gagal mengambil data Enka", + "pleaseSelectAtLeastOneCharacter": "Pilih setidaknya satu karakter", + "noDataToImport": "Tidak ada data untuk diimpor", + "pleaseSelectAFile": "Silakan pilih file", + "fileMustBeAValidJsonFile": "File harus berupa file JSON yang valid", + "importEnkaDataSuccess": "Impor data Enka berhasil", + "importFreeSRDataSuccess": "Impor data FreeSR berhasil", + "importDatabaseSuccess": "Impor database berhasil", + "getData": "Dapatkan Data", + "import": "Impor", + "freeSRImport": "Impor FreeSR", + "onlySupportFreeSRJsonFile": "Hanya mendukung file JSON FreeSR", + "pickAFile": "Pilih sebuah file", + "lightConeSetting": "Pengaturan Light Cone", + "relicMaker": "Pembuat Relic", + "pleaseSelectAllOptions": "Silakan pilih semua opsi", + "relicSavedSuccessfully": "Relic berhasil disimpan", + "mainSettings": "Pengaturan Utama", + "mainStat": "Statistik Utama", + "set": "Set", + "pleaseSelectASet": "Pilih sebuah set", + "effectBonus": "Bonus Efek", + "totalRoll": "Total Roll", + "randomizeStats": "Acak Statistik", + "randomizeRolls": "Acak Roll", + "selectASubStat": "Pilih sub stat", + "selectASet": "Pilih sebuah set", + "selectAMainStat": "Pilih stat utama", + "save": "Simpan", + "reset": "Reset", + "roll": "Roll", + "step": "Langkah", + "memoryOfChaos": "Memory of Chaos", + "pureFiction": "Pure Fiction", + "apocalypticShadow": "Apocalyptic Shadow", + "customEnemy": "Musuh Kustom", + "simulatedUniverse": "Simulated Universe", + "floor": "Lantai", + "side": "Sisi", + "wave": "Gelombang", + "stage": "Tahap", + "useCycleCount": "Gunakan hitungan siklus?", + "useTurbulenceBuff": "Gunakan buff turbulence?", + "firstHalfEnemies": "Musuh paruh pertama", + "secondHalfEnemies": "Musuh paruh kedua", + "firstNodeEnemies": "Musuh Node 1", + "secondNodeEnemies": "Musuh Node 2", + "thirdNodeEnemies": "Musuh Node 3", + "firstNode": "Node 1", + "secondNode": "Node 2", + "thirdNode": "Node 3", + "listEnemies": "Daftar musuh", + "turbulenceBuff": "Turbulence Buff", + "noEventSelected": "Tidak ada event dipilih", + "noTurbulenceBuff": "Tanpa Turbulence Buff", + "upper": "Atas", + "lower": "Bawah", + "upperToLower": "Atas -> Bawah", + "lowerToUpper": "Bawah -> Atas", + "selectMOCEvent": "Pilih Event MOC", + "selectPFEvent": "Pilih Event PF", + "selectASEvent": "Pilih Event AS", + "selectCEEvent": "Pilih Event CE", + "selectEvent": "Pilih Event", + "selectFloor": "Pilih Lantai", + "selectSide": "Pilih Sisi", + "selectBuff": "Pilih Buff", + "selectStage": "Pilih Tahap", + "previous": "Sebelumnya", + "next": "Selanjutnya", + "noMonstersFound": "Tidak ada monster ditemukan", + "addNewWave": "Tambah Gelombang Baru", + "searchStage": "Cari tahap...", + "noStageFound": "Tahap tidak ditemukan", + "searchMonster": "Cari monster...", + "changeRelic": "Ganti relic", + "deleteRelic": "Hapus relic", + "deleteRelicConfirm": "Yakin ingin menghapus relic di slot ini?", + "setEffects": "Atur Efek", + "details": "Detail", + "normal": "Basic ATK", "bpskill": "Skill", "maze": "Technique", "ultra": "Ultimate", "assist": "Skill Bantuan", "servantskill": "Skill Memosprite", - "severaltalent": "Talent Memosprite", - "singleattack": "Single Attack", - "enhance": "Enhance", - "summon": "Summon", - "mazeattack": "Technique Attack", - "blast": "Blast", - "restore": "Restore", - "support": "Support", - "aoeattack": "AoE Attack", - "impair": "Impair", - "bounce": "Bounce", - "active": "Aktif", - "defence": "Defence", - "inactive": "Nonaktif", - "maxAll": "Maksimalkan Semua", - "maxAllSuccess": "Berhasil memaksimalkan level skill.", - "maxAllFailed": "Gagal memaksimalkan level skill.", - "noRelicEquipped": "Tidak ada relic dipakai", - "anomalyArbitration": "Anomaly Arbitration", - "normalMode": "Mode Normal", - "hardMode": "Mode Sulit", - "selectPEAKEvent": "Pilih Event PEAK", - "mode": "Mode", - "selectMode": "Pilih Mode", - "rollBack": "Roll Back", - "upRoll": "Up Roll", - "downRoll": "Down Roll", - "actions": "Aksi", - "avatars": "Avatar", - "quickView": "Tampilan Cepat", - "extraSetting": "Pengaturan Ekstra", - "disableCensorship": "Nonaktifkan Sensor", - "hideUI": "Sembunyikan UI", - "theoryCraftMode": "Mode Theorycraft", - "cycleCount": "Hitungan Siklus", - "pleaseSelectAllSubStats": "Pilih semua sub statistik", - "subStatRollCountCannotBeZero": "Hitungan roll sub stat tidak boleh nol", - "theoryCraft": "Theorycraft", - "multipathCharacter": "Karakter Multipath", - "mainPath": "Path Utama", - "march7Path": "Path March 7th", - "challenge": "Tantangan", - "skipNode": "Lewati Node", - "disableSkip": "Nonaktifkan lewati", - "skipNode1": "Lewati node 1", - "skipNode2": "Lewati node 2", - "extraFeatures": "Fitur Ekstra", - "detailTheoryCraft": "Mengaktifkan fitur ini memungkinkan Anda menyesuaikan jumlah siklus dan menyesuaikan HP musuh.", - "detailSkipNode": "Memungkinkan Anda melewati (Node 1/Node 2) di Memory of Chaos atau Pure Fiction.", - "detailChallengePeak": "Memungkinkan perubahan musim Peak dalam Anomaly saat ini.", - "detailHiddenUi": "Mengaktifkan fitur ini akan menyembunyikan UI game.", - "detailDisableCensorship": "Mengaktifkan fitur ini akan mematikan sensor dalam game.", - "detailMultipathCharacter": "Memungkinkan perubahan Path untuk karakter tertentu.", - "trailblazer": "Trailblazer", - "listExtraEffect": "Daftar Efek Ekstra", - "extra": "Ekstra", - "customLineup": "Lineup Kustom" - } + "severaltalent": "Talent Memosprite", + "singleattack": "Single Attack", + "enhance": "Enhance", + "summon": "Summon", + "mazeattack": "Technique Attack", + "blast": "Blast", + "restore": "Restore", + "support": "Support", + "aoeattack": "AoE Attack", + "impair": "Impair", + "bounce": "Bounce", + "active": "Aktif", + "defence": "Defence", + "inactive": "Nonaktif", + "maxAll": "Maksimalkan Semua", + "maxAllSuccess": "Berhasil memaksimalkan level skill.", + "maxAllFailed": "Gagal memaksimalkan level skill.", + "noRelicEquipped": "Tidak ada relic dipakai", + "anomalyArbitration": "Anomaly Arbitration", + "normalMode": "Mode Normal", + "hardMode": "Mode Sulit", + "selectPEAKEvent": "Pilih Event PEAK", + "mode": "Mode", + "selectMode": "Pilih Mode", + "rollBack": "Roll Back", + "upRoll": "Up Roll", + "downRoll": "Down Roll", + "actions": "Aksi", + "avatars": "Avatar", + "quickView": "Tampilan Cepat", + "extraSetting": "Pengaturan Ekstra", + "disableCensorship": "Nonaktifkan Sensor", + "hideUI": "Sembunyikan UI", + "theoryCraftMode": "Mode Theorycraft", + "cycleCount": "Hitungan Siklus", + "pleaseSelectAllSubStats": "Pilih semua sub statistik", + "subStatRollCountCannotBeZero": "Hitungan roll sub stat tidak boleh nol", + "theoryCraft": "Theorycraft", + "multipathCharacter": "Karakter Multipath", + "mainPath": "Path Utama", + "march7Path": "Path March 7th", + "challenge": "Tantangan", + "skipNode": "Lewati Node", + "disableSkip": "Nonaktifkan lewati", + "skipNode1": "Lewati node 1", + "skipNode2": "Lewati node 2", + "extraFeatures": "Fitur Ekstra", + "detailTheoryCraft": "Mengaktifkan fitur ini memungkinkan Anda menyesuaikan jumlah siklus dan menyesuaikan HP musuh.", + "detailSkipNode": "Memungkinkan Anda melewati (Node 1/Node 2) di Memory of Chaos atau Pure Fiction.", + "detailChallengePeak": "Memungkinkan perubahan musim Peak dalam Anomaly saat ini.", + "detailHiddenUi": "Mengaktifkan fitur ini akan menyembunyikan UI game.", + "detailDisableCensorship": "Mengaktifkan fitur ini akan mematikan sensor dalam game.", + "detailMultipathCharacter": "Memungkinkan perubahan Path untuk karakter tertentu.", + "trailblazer": "Trailblazer", + "listExtraEffect": "Daftar Efek Ekstra", + "extra": "Ekstra", + "customLineup": "Lineup Kustom", + "def": "DEF", + "language": "Bahasa" + } } diff --git a/messages/ja.json b/messages/ja.json index 91e8037..d7b5f3a 100644 --- a/messages/ja.json +++ b/messages/ja.json @@ -1,290 +1,292 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Firefly tools by Firefly Shelter" - }, - "DataPage": { - "skillType": "スキルタイプ", - "skillName": "スキル名", - "character": "キャラクター", - "id": "ID", - "path": "運命", - "rarity": "レアリティ", - "element": "属性", - "technique": "秘技", - "talent": "天賦", - "basic": "通常攻撃", - "skill": "スキル", - "ultimate": "アルティメット", - "servant": "サーバント", - "damage": "ダメージ", - "type": "タイプ", - "warrior": "壊滅", - "knight": "存護", - "mage": "知恵", - "priest": "豊穣", - "rogue": "巡狩", - "shaman": "調和", - "warlock": "虚無", - "memory": "記憶", - "elation": "愉悦", - "fire": "火", - "ice": "氷", - "imaginary": "虚数", - "physical": "物理", - "quantum": "量子", - "thunder": "雷", - "wind": "風", - "hp": "HP", - "atk": "攻撃", - "speed": "速度", - "critRate": "会心率", - "critDmg": "会心ダメージ", - "breakEffect": "撃破特効", - "effectRes": "効果抵抗", - "energyRegenerationRate": "EP回復効率", - "effectHitRate": "効果命中率", - "outgoingHealingBoost": "回復増加", - "fireDmgBoost": "火属性ダメージ強化", - "iceDmgBoost": "氷属性ダメージ強化", - "imaginaryDmgBoost": "幻影ダメージ強化", - "physicalDmgBoost": "物理ダメージ強化", - "quantumDmgBoost": "量子ダメージ強化", - "thunderDmgBoost": "雷属性ダメージ強化", - "windDmgBoost": "風属性ダメージ強化", - "pursued": "追加ダメージ", - "true damage": "確定ダメージ", - "elationdamage": "愉悦ダメージ", - "follow-up": "追撃ダメージ", - "elemental damage": "属性ダメージ", - "dot": "継続ダメージ", - "qte": "QTEスキル", - "level": "レベル", - "relics": "遺物", - "eidolons": "エイドロン", - "lightcones": "光円錐", - "loadData": "データ読み込み", - "exportData": "データ出力", - "connectSetting": "接続設定", - "connected": "接続済み", - "unconnected": "未接続", - "psConnection": "PS接続", - "connectionType": "接続タイプ", - "status": "ステータス", - "connectPs": "PS接続", - "disconnect": "切断", - "other": "その他", - "freeSr": "FreeSR", - "database": "データベース", - "enka": "Enka", - "monsterSetting": "モンスター設定", - "serverUrl": "サーバー URL", - "privateType": "プライベートタイプ", - "local": "ローカル", - "server": "サーバー", - "username": "ユーザー名", - "password": "パスワード", - "placeholderServerUrl": "サーバー URL を入力", - "placeholderUsername": "ユーザー名を入力", - "placeholderPassword": "パスワードを入力", - "connectedSuccess": "PS接続成功", - "connectedFailed": "PS接続失敗", - "syncSuccess": "PSへのデータ同期に成功", - "syncFailed": "PSへのデータ同期に失敗", - "sync": "同期", - "importSetting": "インポート設定", - "profile": "プロファイル", - "default": "デフォルト", - "copyProfiles": "プロファイルをコピー", - "addNewProfile": "プロファイルを追加", - "createNewProfile": "新しいプロファイルを作成", - "editProfile": "プロファイル編集", - "placeholderProfileName": "プロファイル名を入力", - "profileName": "プロファイル名", - "create": "作成", - "update": "更新", - "characterInformation": "キャラクター情報", - "skills": "スキル", - "showcaseCard": "ショーケースカード", - "comingSoon": "近日公開", - "characterName": "キャラクター名", - "placeholderCharacter": "キャラクター名を入力", - "characterSettings": "キャラクター設定", - "levelConfiguration": "レベル構成", - "characterLevel": "キャラクターレベル", - "max": "最大", - "ultimateEnergy": "アルティメットエネルギー", - "currentEnergy": "現在のエネルギー", - "setTo50": "50%に設定", - "battleConfiguration": "バトル構成", - "useTechnique": "秘技を使用", - "techniqueNote": "バトル前に秘技効果を有効化", - "enhancement": "強化", - "enhancementLevel": "強化レベル", - "origin": "由来", - "enhancedNote": "強化レベルに応じて追加スキル解放", - "lightconeEquipment": "光円錐装備", - "lightconeSettings": "光円錐の設定", - "placeholderLevel": "レベルを入力", - "superimpositionRank": "重ねランク", - "ranksNote": "ランクが高いほど効果強化", - "changeLightcone": "光円錐を変更", - "removeLightcone": "光円錐を外す", - "equipLightcone": "光円錐を装備", - "noLightconeEquipped": "光円錐が装備されていません", - "equipLightconeNote": "強化のため光円錐を装備してください", - "filter": "フィルター", - "selectedCharacters": "選択中のキャラクター", - "selectedProfiles": "選択中のプロファイル", - "clearAll": "全てクリア", - "selectAll": "全て選択", - "copy": "コピー", - "copied": "コピー済み", - "noAvatarSelected": "キャラクターが選択されていません", - "noAvatarToCopySelected": "コピーするキャラクター選択されていません", - "pleaseSelectAtLeastOneProfile": "プロファイルを少なくとも1つ選んでください", - "pleaseEnterUid": "UIDを入力してください", - "failedToFetchEnkaData": "Enka のデータ取得に失敗", - "pleaseSelectAtLeastOneCharacter": "キャラクターを最低1つ選択してください", - "noDataToImport": "インポートするデータがありません", - "pleaseSelectAFile": "ファイルを選択してください", - "fileMustBeAValidJsonFile": "有効な JSON ファイルである必要があります", - "importEnkaDataSuccess": "Enka データのインポート成功", - "importFreeSRDataSuccess": "FreeSR データのインポート成功", - "importDatabaseSuccess": "データベースのインポート成功", - "getData": "データ取得", - "import": "インポート", - "freeSRImport": "FreeSR インポート", - "onlySupportFreeSRJsonFile": "FreeSR JSON ファイルのみ対応", - "pickAFile": "ファイル選択", - "lightConeSetting": "ライトコーン設定", - "relicMaker": "遺物製作", - "pleaseSelectAllOptions": "すべてのオプションを選択してください", - "relicSavedSuccessfully": "遺物の保存に成功しました", - "mainSettings": "メイン設定", - "mainStat": "メインステータス", - "set": "セット", - "pleaseSelectASet": "セットを選択してください", - "effectBonus": "効果ボーナス", - "totalRoll": "総ロール数", - "randomizeStats": "ステータスランダム化", - "randomizeRolls": "ロール回数ランダム化", - "selectASubStat": "サブステータスを選択", - "selectASet": "セットを選択", - "selectAMainStat": "メインステータスを選んでください", - "save": "保存", - "reset": "リセット", - "roll": "ロール", - "step": "ステップ", - "memoryOfChaos": "混沌の記憶", - "pureFiction": "虚構叙事", - "apocalypticShadow": "末日の幻影", - "customEnemy": "カスタム敵", - "simulatedUniverse": "模擬宇宙", - "floor": "階層", - "side": "前半/後半", - "wave": "ウェーブ", - "stage": "ステージ", - "useCycleCount": "サイクル数を使用しますか?", - "useTurbulenceBuff": "乱気流バフを使用しますか?", - "firstHalfEnemies": "前半の敵", - "secondHalfEnemies": "後半の敵", - "firstNodeEnemies": "ノード 1 の敵", - "secondNodeEnemies": "ノード 2 の敵", - "thirdNodeEnemies": "ノード 3 の敵", - "firstNode": "ノード 1", - "secondNode": "ノード 2", - "thirdNode": "ノード 3", - "turbulenceBuff": "乱気流バフ", - "noEventSelected": "イベントが選択されていません", - "noTurbulenceBuff": "乱気流バフがありません", - "upper": "上半", - "lower": "下半", - "upperToLower": "上半 -> 下半", - "lowerToUpper": "下半 -> 上半", - "selectMOCEvent": "MOC イベントを選択", - "selectPFEvent": "PF イベントを選択", - "selectASEvent": "AS イベントを選択", - "selectCEEvent": "CE イベントを選択", - "selectEvent": "イベントを選択", - "selectFloor": "階層を選択", - "selectSide": "前半/後半を選択", - "selectBuff": "バフを選択", - "selectStage": "ステージを選択", - "previous": "前へ", - "next": "次へ", - "noMonstersFound": "敵が見つかりません", - "addNewWave": "新しいウェーブを追加", - "searchStage": "ステージを検索...", - "noStageFound": "ステージが見つかりません", - "searchMonster": "敵を検索...", - "changeRelic": "遺物を変更", - "deleteRelic": "遺物を削除", - "deleteRelicConfirm": "この遺物を削除してもよろしいですか?", - "setEffects": "効果を設定", - "details": "詳細", - "normal": "通常攻撃", - "bpskill": "戦闘スキル", - "assist": "アシストスキル", - "maze": "秘技", - "ultra": "必殺技", - "servantskill": "メモスプライトスキル", - "severaltalent": "メモスプライトの才能", - "singleattack": "単体攻撃", - "enhance": "強化", - "summon": "召喚", - "blast": "爆発", - "restore": "回復", - "support": "支援", - "aoeattack": "範囲攻撃", - "mazeattack": "迷宮秘技", - "impair": "弱体化", - "bounce": "弾跳", - "active": "アクティブ", - "inactive": "非アクティブ", - "defence": "防御", - "maxAll": "すべて最大化", - "maxAllSuccess": "スキルレベルを最大に設定しました。", - "maxAllFailed": "スキルレベルの最大設定に失敗しました。", - "noRelicEquipped": "遺物が装備されていません", - "anomalyArbitration": "異相の仲裁", - "normalMode": "通常モード", - "hardMode": "困難モード", - "selectPEAKEvent": "PEAK イベントを選択", - "mode": "モード", - "selectMode": "モードを選択", - "rollBack": "前の状態に戻る", - "upRoll": "サブステータスを増やす", - "downRoll": "サブステータスを減らす", - "actions": "アクション", - "avatars": "アバター", - "quickView": "クイックビュー", - "extraSetting": "追加設定", - "disableCensorship": "検閲を無効化", - "hideUI": "UIを非表示", - "theoryCraftMode": "シアリークラフトモード", - "cycleCount": "サイクル数", - "pleaseSelectAllSubStats": "すべてのサブステータスを選択してください", - "subStatRollCountCannotBeZero": "サブステータスの行数は0にできません", - "theoryCraft": "シアリークラフト", - "multipathCharacter": "複数運命キャラ", - "mainPath": "主人公の運命", - "march7Path": "三月なのかの運命", - "challenge": "挑戦", - "skipNode": "ノードをスキップ", - "disableSkip": "スキップ無効", - "skipNode1": "ノード1をスキップ", - "skipNode2": "ノード2をスキップ", - "extraFeatures": "追加機能", - "detailTheoryCraft": "この機能を有効にすると、サイクル数の調整や敵設定でHPの調整が可能になります。", - "detailSkipNode": "この機能を有効にすると、混沌の記憶または虚構叙事の(ノード1/ノード2)をスキップできます。", - "detailChallengePeak": "現在の異相における「頂」のシーズンを変更できます。", - "detailHiddenUi": "この機能を有効にすると、ゲームのUIを非表示にします。", - "detailDisableCensorship": "この機能を有効にすると、ゲーム内の検閲を無効にします。", - "detailMultipathCharacter": "一部キャラクターの運命を変更できます。", - "trailblazer": "開拓者", - "listExtraEffect": "追加効果一覧", - "extra": "追加", - "customLineup": "カスタム編成" - } -} \ No newline at end of file +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Firefly tools by Firefly Shelter" + }, + "DataPage": { + "skillType": "スキルタイプ", + "skillName": "スキル名", + "character": "キャラクター", + "id": "ID", + "path": "運命", + "rarity": "レアリティ", + "element": "属性", + "technique": "秘技", + "talent": "天賦", + "basic": "通常攻撃", + "skill": "スキル", + "ultimate": "アルティメット", + "servant": "サーバント", + "damage": "ダメージ", + "type": "タイプ", + "warrior": "壊滅", + "knight": "存護", + "mage": "知恵", + "priest": "豊穣", + "rogue": "巡狩", + "shaman": "調和", + "warlock": "虚無", + "memory": "記憶", + "elation": "愉悦", + "fire": "火", + "ice": "氷", + "imaginary": "虚数", + "physical": "物理", + "quantum": "量子", + "thunder": "雷", + "wind": "風", + "hp": "HP", + "atk": "攻撃", + "speed": "速度", + "critRate": "会心率", + "critDmg": "会心ダメージ", + "breakEffect": "撃破特効", + "effectRes": "効果抵抗", + "energyRegenerationRate": "EP回復効率", + "effectHitRate": "効果命中率", + "outgoingHealingBoost": "回復増加", + "fireDmgBoost": "火属性ダメージ強化", + "iceDmgBoost": "氷属性ダメージ強化", + "imaginaryDmgBoost": "幻影ダメージ強化", + "physicalDmgBoost": "物理ダメージ強化", + "quantumDmgBoost": "量子ダメージ強化", + "thunderDmgBoost": "雷属性ダメージ強化", + "windDmgBoost": "風属性ダメージ強化", + "pursued": "追加ダメージ", + "true damage": "確定ダメージ", + "elationdamage": "愉悦ダメージ", + "follow-up": "追撃ダメージ", + "elemental damage": "属性ダメージ", + "dot": "継続ダメージ", + "qte": "QTEスキル", + "level": "レベル", + "relics": "遺物", + "eidolons": "エイドロン", + "lightcones": "光円錐", + "loadData": "データ読み込み", + "exportData": "データ出力", + "connectSetting": "接続設定", + "connected": "接続済み", + "unconnected": "未接続", + "psConnection": "PS接続", + "connectionType": "接続タイプ", + "status": "ステータス", + "connectPs": "PS接続", + "disconnect": "切断", + "other": "その他", + "freeSr": "FreeSR", + "database": "データベース", + "enka": "Enka", + "monsterSetting": "モンスター設定", + "serverUrl": "サーバー URL", + "privateType": "プライベートタイプ", + "local": "ローカル", + "server": "サーバー", + "username": "ユーザー名", + "password": "パスワード", + "placeholderServerUrl": "サーバー URL を入力", + "placeholderUsername": "ユーザー名を入力", + "placeholderPassword": "パスワードを入力", + "connectedSuccess": "PS接続成功", + "connectedFailed": "PS接続失敗", + "syncSuccess": "PSへのデータ同期に成功", + "syncFailed": "PSへのデータ同期に失敗", + "sync": "同期", + "importSetting": "インポート設定", + "profile": "プロファイル", + "default": "デフォルト", + "copyProfiles": "プロファイルをコピー", + "addNewProfile": "プロファイルを追加", + "createNewProfile": "新しいプロファイルを作成", + "editProfile": "プロファイル編集", + "placeholderProfileName": "プロファイル名を入力", + "profileName": "プロファイル名", + "create": "作成", + "update": "更新", + "characterInformation": "キャラクター情報", + "skills": "スキル", + "showcaseCard": "ショーケースカード", + "comingSoon": "近日公開", + "characterName": "キャラクター名", + "placeholderCharacter": "キャラクター名を入力", + "characterSettings": "キャラクター設定", + "levelConfiguration": "レベル構成", + "characterLevel": "キャラクターレベル", + "max": "最大", + "ultimateEnergy": "アルティメットエネルギー", + "currentEnergy": "現在のエネルギー", + "setTo50": "50%に設定", + "battleConfiguration": "バトル構成", + "useTechnique": "秘技を使用", + "techniqueNote": "バトル前に秘技効果を有効化", + "enhancement": "強化", + "enhancementLevel": "強化レベル", + "origin": "由来", + "enhancedNote": "強化レベルに応じて追加スキル解放", + "lightconeEquipment": "光円錐装備", + "lightconeSettings": "光円錐の設定", + "placeholderLevel": "レベルを入力", + "superimpositionRank": "重ねランク", + "ranksNote": "ランクが高いほど効果強化", + "changeLightcone": "光円錐を変更", + "removeLightcone": "光円錐を外す", + "equipLightcone": "光円錐を装備", + "noLightconeEquipped": "光円錐が装備されていません", + "equipLightconeNote": "強化のため光円錐を装備してください", + "filter": "フィルター", + "selectedCharacters": "選択中のキャラクター", + "selectedProfiles": "選択中のプロファイル", + "clearAll": "全てクリア", + "selectAll": "全て選択", + "copy": "コピー", + "copied": "コピー済み", + "noAvatarSelected": "キャラクターが選択されていません", + "noAvatarToCopySelected": "コピーするキャラクター選択されていません", + "pleaseSelectAtLeastOneProfile": "プロファイルを少なくとも1つ選んでください", + "pleaseEnterUid": "UIDを入力してください", + "failedToFetchEnkaData": "Enka のデータ取得に失敗", + "pleaseSelectAtLeastOneCharacter": "キャラクターを最低1つ選択してください", + "noDataToImport": "インポートするデータがありません", + "pleaseSelectAFile": "ファイルを選択してください", + "fileMustBeAValidJsonFile": "有効な JSON ファイルである必要があります", + "importEnkaDataSuccess": "Enka データのインポート成功", + "importFreeSRDataSuccess": "FreeSR データのインポート成功", + "importDatabaseSuccess": "データベースのインポート成功", + "getData": "データ取得", + "import": "インポート", + "freeSRImport": "FreeSR インポート", + "onlySupportFreeSRJsonFile": "FreeSR JSON ファイルのみ対応", + "pickAFile": "ファイル選択", + "lightConeSetting": "ライトコーン設定", + "relicMaker": "遺物製作", + "pleaseSelectAllOptions": "すべてのオプションを選択してください", + "relicSavedSuccessfully": "遺物の保存に成功しました", + "mainSettings": "メイン設定", + "mainStat": "メインステータス", + "set": "セット", + "pleaseSelectASet": "セットを選択してください", + "effectBonus": "効果ボーナス", + "totalRoll": "総ロール数", + "randomizeStats": "ステータスランダム化", + "randomizeRolls": "ロール回数ランダム化", + "selectASubStat": "サブステータスを選択", + "selectASet": "セットを選択", + "selectAMainStat": "メインステータスを選んでください", + "save": "保存", + "reset": "リセット", + "roll": "ロール", + "step": "ステップ", + "memoryOfChaos": "混沌の記憶", + "pureFiction": "虚構叙事", + "apocalypticShadow": "末日の幻影", + "customEnemy": "カスタム敵", + "simulatedUniverse": "模擬宇宙", + "floor": "階層", + "side": "前半/後半", + "wave": "ウェーブ", + "stage": "ステージ", + "useCycleCount": "サイクル数を使用しますか?", + "useTurbulenceBuff": "乱気流バフを使用しますか?", + "firstHalfEnemies": "前半の敵", + "secondHalfEnemies": "後半の敵", + "firstNodeEnemies": "ノード 1 の敵", + "secondNodeEnemies": "ノード 2 の敵", + "thirdNodeEnemies": "ノード 3 の敵", + "firstNode": "ノード 1", + "secondNode": "ノード 2", + "thirdNode": "ノード 3", + "turbulenceBuff": "乱気流バフ", + "noEventSelected": "イベントが選択されていません", + "noTurbulenceBuff": "乱気流バフがありません", + "upper": "上半", + "lower": "下半", + "upperToLower": "上半 -> 下半", + "lowerToUpper": "下半 -> 上半", + "selectMOCEvent": "MOC イベントを選択", + "selectPFEvent": "PF イベントを選択", + "selectASEvent": "AS イベントを選択", + "selectCEEvent": "CE イベントを選択", + "selectEvent": "イベントを選択", + "selectFloor": "階層を選択", + "selectSide": "前半/後半を選択", + "selectBuff": "バフを選択", + "selectStage": "ステージを選択", + "previous": "前へ", + "next": "次へ", + "noMonstersFound": "敵が見つかりません", + "addNewWave": "新しいウェーブを追加", + "searchStage": "ステージを検索...", + "noStageFound": "ステージが見つかりません", + "searchMonster": "敵を検索...", + "changeRelic": "遺物を変更", + "deleteRelic": "遺物を削除", + "deleteRelicConfirm": "この遺物を削除してもよろしいですか?", + "setEffects": "効果を設定", + "details": "詳細", + "normal": "通常攻撃", + "bpskill": "戦闘スキル", + "assist": "アシストスキル", + "maze": "秘技", + "ultra": "必殺技", + "servantskill": "メモスプライトスキル", + "severaltalent": "メモスプライトの才能", + "singleattack": "単体攻撃", + "enhance": "強化", + "summon": "召喚", + "blast": "爆発", + "restore": "回復", + "support": "支援", + "aoeattack": "範囲攻撃", + "mazeattack": "迷宮秘技", + "impair": "弱体化", + "bounce": "弾跳", + "active": "アクティブ", + "inactive": "非アクティブ", + "defence": "防御", + "maxAll": "すべて最大化", + "maxAllSuccess": "スキルレベルを最大に設定しました。", + "maxAllFailed": "スキルレベルの最大設定に失敗しました。", + "noRelicEquipped": "遺物が装備されていません", + "anomalyArbitration": "異相の仲裁", + "normalMode": "通常モード", + "hardMode": "困難モード", + "selectPEAKEvent": "PEAK イベントを選択", + "mode": "モード", + "selectMode": "モードを選択", + "rollBack": "前の状態に戻る", + "upRoll": "サブステータスを増やす", + "downRoll": "サブステータスを減らす", + "actions": "アクション", + "avatars": "アバター", + "quickView": "クイックビュー", + "extraSetting": "追加設定", + "disableCensorship": "検閲を無効化", + "hideUI": "UIを非表示", + "theoryCraftMode": "シアリークラフトモード", + "cycleCount": "サイクル数", + "pleaseSelectAllSubStats": "すべてのサブステータスを選択してください", + "subStatRollCountCannotBeZero": "サブステータスの行数は0にできません", + "theoryCraft": "シアリークラフト", + "multipathCharacter": "複数運命キャラ", + "mainPath": "主人公の運命", + "march7Path": "三月なのかの運命", + "challenge": "挑戦", + "skipNode": "ノードをスキップ", + "disableSkip": "スキップ無効", + "skipNode1": "ノード1をスキップ", + "skipNode2": "ノード2をスキップ", + "extraFeatures": "追加機能", + "detailTheoryCraft": "この機能を有効にすると、サイクル数の調整や敵設定でHPの調整が可能になります。", + "detailSkipNode": "この機能を有効にすると、混沌の記憶または虚構叙事の(ノード1/ノード2)をスキップできます。", + "detailChallengePeak": "現在の異相における「頂」のシーズンを変更できます。", + "detailHiddenUi": "この機能を有効にすると、ゲームのUIを非表示にします。", + "detailDisableCensorship": "この機能を有効にすると、ゲーム内の検閲を無効にします。", + "detailMultipathCharacter": "一部キャラクターの運命を変更できます。", + "trailblazer": "開拓者", + "listExtraEffect": "追加効果一覧", + "extra": "追加", + "customLineup": "カスタム編成", + "def": "防御力", + "language": "言語" + } +} diff --git a/messages/ko.json b/messages/ko.json index 4d883a4..a2b8efe 100644 --- a/messages/ko.json +++ b/messages/ko.json @@ -1,290 +1,292 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Firefly tools by Firefly Shelter" - }, - "DataPage": { - "skillType": "스킬 유형", - "skillName": "스킬 이름", - "character": "캐릭터", - "id": "ID", - "path": "운명", - "rarity": "희귀도", - "element": "속성", - "technique": "비기", - "talent": "탈렌트", - "basic": "기본 공격", - "skill": "스킬", - "ultimate": "궁극기", - "servant": "서번트", - "damage": "데미지", - "type": "종류", - "warrior": "파괴", - "knight": "보호", - "mage": "박학", - "priest": "풍요", - "rogue": "사냥", - "shaman": "조화", - "warlock": "허무", - "memory": "기억", - "elation": "환락", - "fire": "화염", - "ice": "얼음", - "imaginary": "환상", - "physical": "물리", - "quantum": "양자", - "thunder": "번개", - "wind": "바람", - "hp": "HP", - "atk": "공격력", - "speed": "속도", - "critRate": "치명타 확률", - "critDmg": "치명타 피해", - "breakEffect": "파괴 피해", - "effectRes": "효과 저항", - "energyRegenerationRate": "에너지 회복속도", - "effectHitRate": "효과 적중률", - "outgoingHealingBoost": "치유 강화", - "fireDmgBoost": "화염 피해 증가", - "iceDmgBoost": "얼음 피해 증가", - "imaginaryDmgBoost": "환상 피해 증가", - "physicalDmgBoost": "물리 피해 증가", - "quantumDmgBoost": "양자 피해 증가", - "thunderDmgBoost": "번개 피해 증가", - "windDmgBoost": "바람 피해 증가", - "pursued": "추가 피해", - "true damage": "진실한 피해", - "elationdamage": "환락 피해", - "follow-up": "후속 피해", - "elemental damage": "파괴 및 초파괴 피해", - "dot": "시간 경과 피해", - "qte": "QTE 스킬", - "level": "레벨", - "relics": "유물", - "eidolons": "에이돌론", - "lightcones": "라이트콘", - "loadData": "데이터 불러오기", - "exportData": "데이터 내보내기", - "connectSetting": "연결 설정", - "connected": "연결됨", - "unconnected": "연결 안됨", - "psConnection": "PS 연결", - "connectionType": "연결 타입", - "status": "상태", - "connectPs": "PS 연결", - "disconnect": "연결 끊기", - "other": "기타", - "freeSr": "FreeSR", - "database": "데이터베이스", - "enka": "Enka", - "monsterSetting": "몬스터 설정", - "serverUrl": "서버 URL", - "privateType": "프라이빗 타입", - "local": "로컬", - "server": "서버", - "username": "사용자명", - "password": "비밀번호", - "placeholderServerUrl": "서버 URL 입력", - "placeholderUsername": "사용자명 입력", - "placeholderPassword": "비밀번호 입력", - "connectedSuccess": "PS에 성공적으로 연결됨", - "connectedFailed": "PS 연결 실패", - "syncSuccess": "PS에 데이터 동기화 성공", - "syncFailed": "PS에 데이터 동기화 실패", - "sync": "동기화", - "importSetting": "설정 가져오기", - "profile": "프로필", - "default": "기본", - "copyProfiles": "프로필 복사", - "addNewProfile": "새 프로필 추가", - "createNewProfile": "새 프로필 생성", - "editProfile": "프로필 편집", - "placeholderProfileName": "프로필 이름 입력", - "profileName": "프로필 이름", - "create": "생성", - "update": "업데이트", - "characterInformation": "캐릭터 정보", - "skills": "스킬", - "showcaseCard": "쇼케이스 카드", - "comingSoon": "곧 출시", - "characterName": "캐릭터 이름", - "placeholderCharacter": "캐릭터 이름 입력", - "characterSettings": "캐릭터 설정", - "levelConfiguration": "레벨 구성", - "characterLevel": "캐릭터 레벨", - "max": "최대", - "ultimateEnergy": "궁극 에너지", - "currentEnergy": "현재 에너지", - "setTo50": "50%로 설정", - "battleConfiguration": "전투 구성", - "useTechnique": "비기 사용", - "techniqueNote": "전투 전 비기 효과 활성화", - "enhancement": "강화", - "enhancementLevel": "강화 레벨", - "origin": "출처", - "enhancedNote": "강화 레벨이 높을수록 추가 효과 해제", - "lightconeEquipment": "라이트콘 장비", - "lightconeSettings": "라이트콘 설정", - "placeholderLevel": "레벨 입력", - "superimpositionRank": "중첩 등급", - "ranksNote": "등급이 높을수록 효과가 강함", - "changeLightcone": "라이트콘 변경", - "removeLightcone": "라이트콘 제거", - "equipLightcone": "라이트콘 장착", - "noLightconeEquipped": "라이트콘 미장착", - "equipLightconeNote": "캐릭터 능력 향상을 위해 장착하세요", - "filter": "필터", - "selectedCharacters": "선택된 캐릭터", - "selectedProfiles": "선택된 프로필", - "clearAll": "전체 지우기", - "selectAll": "전체 선택", - "copy": "복사", - "copied": "복사됨", - "noAvatarSelected": "캐릭터가 선택되지 않음", - "noAvatarToCopySelected": "복사할 캐릭터가 선택되지 않음", - "pleaseSelectAtLeastOneProfile": "프로필을 최소 하나 선택하세요", - "pleaseEnterUid": "UID를 입력해주세요", - "failedToFetchEnkaData": "Enka 데이터 가져오기 실패", - "pleaseSelectAtLeastOneCharacter": "캐릭터를 최소 하나 선택하세요", - "noDataToImport": "가져올 데이터가 없습니다", - "pleaseSelectAFile": "파일을 선택하세요", - "fileMustBeAValidJsonFile": "유효한 JSON 파일이어야 합니다", - "importEnkaDataSuccess": "Enka 데이터 가져오기 성공", - "importFreeSRDataSuccess": "FreeSR 데이터 가져오기 성공", - "importDatabaseSuccess": "데이터베이스 가져오기 성공", - "getData": "데이터 가져오기", - "import": "가져오기", - "freeSRImport": "FreeSR 가져오기", - "onlySupportFreeSRJsonFile": "FreeSR JSON 파일만 지원", - "pickAFile": "파일 선택", - "lightConeSetting": "라이트콘 설정", - "relicMaker": "유물 제작", - "pleaseSelectAllOptions": "모든 옵션을 선택해주세요", - "relicSavedSuccessfully": "유물 저장 성공", - "mainSettings": "메인 설정", - "mainStat": "주 속성", - "set": "세트", - "pleaseSelectASet": "세트 하나를 선택해주세요", - "effectBonus": "효과 보너스", - "totalRoll": "총 횟수", - "randomizeStats": "속성 랜덤화", - "randomizeRolls": "횟수 랜덤화", - "selectASubStat": "부 속성 선택", - "selectASet": "세트 선택", - "selectAMainStat": "주 속성 선택", - "save": "저장", - "reset": "초기화", - "roll": "굴리기", - "step": "단계", - "memoryOfChaos": "망각의 정원", - "pureFiction": "허구 이야기", - "apocalypticShadow": "종말의 환영", - "customEnemy": "커스텀 적", - "simulatedUniverse": "시뮬레이티드 유니버스", - "floor": "층수", - "side": "전반/후반", - "wave": "웨이브", - "stage": "스테이지", - "useCycleCount": "사이클 수 사용?", - "useTurbulenceBuff": "난류 버프 사용?", - "firstHalfEnemies": "전반 적", - "secondHalfEnemies": "후반 적", - "firstNodeEnemies": "노드 1 적", - "secondNodeEnemies": "노드 2 적", - "thirdNodeEnemies": "노드 3 적", - "firstNode": "노드 1", - "secondNode": "노드 2", - "thirdNode": "노드 3", - "turbulenceBuff": "난류 버프", - "noEventSelected": "이벤트가 선택되지 않음", - "noTurbulenceBuff": "난류 버프가 없음", - "upper": "상반", - "lower": "하반", - "upperToLower": "상반 -> 하반", - "lowerToUpper": "하반 -> 상반", - "selectMOCEvent": "MOC 이벤트 선택", - "selectPFEvent": "PF 이벤트 선택", - "selectASEvent": "AS 이벤트 선택", - "selectCEEvent": "CE 이벤트 선택", - "selectEvent": "이벤트 선택", - "selectFloor": "층 선택", - "selectSide": "전반/후반 선택", - "selectBuff": "버프 선택", - "selectStage": "스테이지 선택", - "previous": "이전", - "next": "다음", - "noMonstersFound": "적을 찾을 수 없음", - "addNewWave": "새 웨이브 추가", - "searchStage": "스테이지 검색...", - "noStageFound": "스테이지를 찾을 수 없음", - "searchMonster": "적 검색...", - "changeRelic": "유물 변경", - "deleteRelic": "유물 삭제", - "deleteRelicConfirm": "이 슬롯의 유물을 삭제하시겠습니까?", - "setEffects": "효과 설정", - "details": "상세", - "normal": "기본 공격", - "bpskill": "스킬", - "assist": "지원 스킬", - "maze": "전술", - "ultra": "필살기", - "servantskill": "메모스프라이트 스킬", - "severaltalent": "메모스프라이트 재능", - "singleattack": "단일 공격", - "enhance": "강화", - "summon": "소환", - "blast": "광역 공격", - "restore": "회복", - "support": "지원", - "aoeattack": "광역 공격", - "mazeattack": "미궁 비기", - "impair": "약화", - "bounce": "튕김", - "active": "활성", - "inactive": "비활성", - "defence": "방어", - "maxAll": "모두 최대치", - "maxAllSuccess": "스킬 레벨이 최대치로 설정되었습니다.", - "maxAllFailed": "스킬 레벨을 최대치로 설정하지 못했습니다.", - "noRelicEquipped": "성유물이 장착되지 않음", - "anomalyArbitration": "이상 중재", - "normalMode": "일반 모드", - "hardMode": "어려움 모드", - "selectPEAKEvent": "PEAK 이벤트 선택", - "mode": "모드", - "selectMode": "모드를 선택", - "rollBack": "이전 상태로 되돌리기", - "upRoll": "부옵션 추가", - "downRoll": "부옵션 감소", - "actions": "동작", - "avatars": "아바타", - "quickView": "빠른 조회", - "extraSetting": "추가 설정", - "disableCensorship": "검열 비활성화", - "hideUI": "UI 숨기기", - "theoryCraftMode": "Theory Craft 모드", - "cycleCount": "사이클 수", - "pleaseSelectAllSubStats": "모든 부옵션을 선택하세요", - "subStatRollCountCannotBeZero": "부옵션의 줄 수는 0일 수 없습니다", - "theoryCraft": "Theory Craft", - "multipathCharacter": "다중 운명 캐릭터", - "mainPath": "개척자 운명", - "march7Path": "삼월칠일 운명", - "challenge": "도전", - "skipNode": "노드 건너뛰기", - "disableSkip": "건너뛰기 비활성화", - "skipNode1": "노드 1 건너뛰기", - "skipNode2": "노드 2 건너뛰기", - "extraFeatures": "추가 기능", - "detailTheoryCraft": "이 기능을 활성화하면 사이클 수를 조정하고 적 설정에서 HP를 변경할 수 있습니다.", - "detailSkipNode": "이 기능을 활성화하면 혼돈의 기억 또는 허구 서사의 (노드 1/노드 2)를 건너뛸 수 있습니다.", - "detailChallengePeak": "현재 이형에서의 피크 시즌을 변경할 수 있습니다.", - "detailHiddenUi": "이 기능을 활성화하면 게임 UI가 숨겨집니다.", - "detailDisableCensorship": "이 기능을 활성화하면 게임 내 검열이 비활성화됩니다.", - "detailMultipathCharacter": "일부 캐릭터의 운명을 변경할 수 있습니다.", - "trailblazer": "개척자", - "listExtraEffect": "추가 효과 목록", - "extra": "추가", - "customLineup": "커스텀 편성" - } -} \ No newline at end of file +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Firefly tools by Firefly Shelter" + }, + "DataPage": { + "skillType": "스킬 유형", + "skillName": "스킬 이름", + "character": "캐릭터", + "id": "ID", + "path": "운명", + "rarity": "희귀도", + "element": "속성", + "technique": "비기", + "talent": "탈렌트", + "basic": "기본 공격", + "skill": "스킬", + "ultimate": "궁극기", + "servant": "서번트", + "damage": "데미지", + "type": "종류", + "warrior": "파괴", + "knight": "보호", + "mage": "박학", + "priest": "풍요", + "rogue": "사냥", + "shaman": "조화", + "warlock": "허무", + "memory": "기억", + "elation": "환락", + "fire": "화염", + "ice": "얼음", + "imaginary": "환상", + "physical": "물리", + "quantum": "양자", + "thunder": "번개", + "wind": "바람", + "hp": "HP", + "atk": "공격력", + "speed": "속도", + "critRate": "치명타 확률", + "critDmg": "치명타 피해", + "breakEffect": "파괴 피해", + "effectRes": "효과 저항", + "energyRegenerationRate": "에너지 회복속도", + "effectHitRate": "효과 적중률", + "outgoingHealingBoost": "치유 강화", + "fireDmgBoost": "화염 피해 증가", + "iceDmgBoost": "얼음 피해 증가", + "imaginaryDmgBoost": "환상 피해 증가", + "physicalDmgBoost": "물리 피해 증가", + "quantumDmgBoost": "양자 피해 증가", + "thunderDmgBoost": "번개 피해 증가", + "windDmgBoost": "바람 피해 증가", + "pursued": "추가 피해", + "true damage": "진실한 피해", + "elationdamage": "환락 피해", + "follow-up": "후속 피해", + "elemental damage": "파괴 및 초파괴 피해", + "dot": "시간 경과 피해", + "qte": "QTE 스킬", + "level": "레벨", + "relics": "유물", + "eidolons": "에이돌론", + "lightcones": "라이트콘", + "loadData": "데이터 불러오기", + "exportData": "데이터 내보내기", + "connectSetting": "연결 설정", + "connected": "연결됨", + "unconnected": "연결 안됨", + "psConnection": "PS 연결", + "connectionType": "연결 타입", + "status": "상태", + "connectPs": "PS 연결", + "disconnect": "연결 끊기", + "other": "기타", + "freeSr": "FreeSR", + "database": "데이터베이스", + "enka": "Enka", + "monsterSetting": "몬스터 설정", + "serverUrl": "서버 URL", + "privateType": "프라이빗 타입", + "local": "로컬", + "server": "서버", + "username": "사용자명", + "password": "비밀번호", + "placeholderServerUrl": "서버 URL 입력", + "placeholderUsername": "사용자명 입력", + "placeholderPassword": "비밀번호 입력", + "connectedSuccess": "PS에 성공적으로 연결됨", + "connectedFailed": "PS 연결 실패", + "syncSuccess": "PS에 데이터 동기화 성공", + "syncFailed": "PS에 데이터 동기화 실패", + "sync": "동기화", + "importSetting": "설정 가져오기", + "profile": "프로필", + "default": "기본", + "copyProfiles": "프로필 복사", + "addNewProfile": "새 프로필 추가", + "createNewProfile": "새 프로필 생성", + "editProfile": "프로필 편집", + "placeholderProfileName": "프로필 이름 입력", + "profileName": "프로필 이름", + "create": "생성", + "update": "업데이트", + "characterInformation": "캐릭터 정보", + "skills": "스킬", + "showcaseCard": "쇼케이스 카드", + "comingSoon": "곧 출시", + "characterName": "캐릭터 이름", + "placeholderCharacter": "캐릭터 이름 입력", + "characterSettings": "캐릭터 설정", + "levelConfiguration": "레벨 구성", + "characterLevel": "캐릭터 레벨", + "max": "최대", + "ultimateEnergy": "궁극 에너지", + "currentEnergy": "현재 에너지", + "setTo50": "50%로 설정", + "battleConfiguration": "전투 구성", + "useTechnique": "비기 사용", + "techniqueNote": "전투 전 비기 효과 활성화", + "enhancement": "강화", + "enhancementLevel": "강화 레벨", + "origin": "출처", + "enhancedNote": "강화 레벨이 높을수록 추가 효과 해제", + "lightconeEquipment": "라이트콘 장비", + "lightconeSettings": "라이트콘 설정", + "placeholderLevel": "레벨 입력", + "superimpositionRank": "중첩 등급", + "ranksNote": "등급이 높을수록 효과가 강함", + "changeLightcone": "라이트콘 변경", + "removeLightcone": "라이트콘 제거", + "equipLightcone": "라이트콘 장착", + "noLightconeEquipped": "라이트콘 미장착", + "equipLightconeNote": "캐릭터 능력 향상을 위해 장착하세요", + "filter": "필터", + "selectedCharacters": "선택된 캐릭터", + "selectedProfiles": "선택된 프로필", + "clearAll": "전체 지우기", + "selectAll": "전체 선택", + "copy": "복사", + "copied": "복사됨", + "noAvatarSelected": "캐릭터가 선택되지 않음", + "noAvatarToCopySelected": "복사할 캐릭터가 선택되지 않음", + "pleaseSelectAtLeastOneProfile": "프로필을 최소 하나 선택하세요", + "pleaseEnterUid": "UID를 입력해주세요", + "failedToFetchEnkaData": "Enka 데이터 가져오기 실패", + "pleaseSelectAtLeastOneCharacter": "캐릭터를 최소 하나 선택하세요", + "noDataToImport": "가져올 데이터가 없습니다", + "pleaseSelectAFile": "파일을 선택하세요", + "fileMustBeAValidJsonFile": "유효한 JSON 파일이어야 합니다", + "importEnkaDataSuccess": "Enka 데이터 가져오기 성공", + "importFreeSRDataSuccess": "FreeSR 데이터 가져오기 성공", + "importDatabaseSuccess": "데이터베이스 가져오기 성공", + "getData": "데이터 가져오기", + "import": "가져오기", + "freeSRImport": "FreeSR 가져오기", + "onlySupportFreeSRJsonFile": "FreeSR JSON 파일만 지원", + "pickAFile": "파일 선택", + "lightConeSetting": "라이트콘 설정", + "relicMaker": "유물 제작", + "pleaseSelectAllOptions": "모든 옵션을 선택해주세요", + "relicSavedSuccessfully": "유물 저장 성공", + "mainSettings": "메인 설정", + "mainStat": "주 속성", + "set": "세트", + "pleaseSelectASet": "세트 하나를 선택해주세요", + "effectBonus": "효과 보너스", + "totalRoll": "총 횟수", + "randomizeStats": "속성 랜덤화", + "randomizeRolls": "횟수 랜덤화", + "selectASubStat": "부 속성 선택", + "selectASet": "세트 선택", + "selectAMainStat": "주 속성 선택", + "save": "저장", + "reset": "초기화", + "roll": "굴리기", + "step": "단계", + "memoryOfChaos": "망각의 정원", + "pureFiction": "허구 이야기", + "apocalypticShadow": "종말의 환영", + "customEnemy": "커스텀 적", + "simulatedUniverse": "시뮬레이티드 유니버스", + "floor": "층수", + "side": "전반/후반", + "wave": "웨이브", + "stage": "스테이지", + "useCycleCount": "사이클 수 사용?", + "useTurbulenceBuff": "난류 버프 사용?", + "firstHalfEnemies": "전반 적", + "secondHalfEnemies": "후반 적", + "firstNodeEnemies": "노드 1 적", + "secondNodeEnemies": "노드 2 적", + "thirdNodeEnemies": "노드 3 적", + "firstNode": "노드 1", + "secondNode": "노드 2", + "thirdNode": "노드 3", + "turbulenceBuff": "난류 버프", + "noEventSelected": "이벤트가 선택되지 않음", + "noTurbulenceBuff": "난류 버프가 없음", + "upper": "상반", + "lower": "하반", + "upperToLower": "상반 -> 하반", + "lowerToUpper": "하반 -> 상반", + "selectMOCEvent": "MOC 이벤트 선택", + "selectPFEvent": "PF 이벤트 선택", + "selectASEvent": "AS 이벤트 선택", + "selectCEEvent": "CE 이벤트 선택", + "selectEvent": "이벤트 선택", + "selectFloor": "층 선택", + "selectSide": "전반/후반 선택", + "selectBuff": "버프 선택", + "selectStage": "스테이지 선택", + "previous": "이전", + "next": "다음", + "noMonstersFound": "적을 찾을 수 없음", + "addNewWave": "새 웨이브 추가", + "searchStage": "스테이지 검색...", + "noStageFound": "스테이지를 찾을 수 없음", + "searchMonster": "적 검색...", + "changeRelic": "유물 변경", + "deleteRelic": "유물 삭제", + "deleteRelicConfirm": "이 슬롯의 유물을 삭제하시겠습니까?", + "setEffects": "효과 설정", + "details": "상세", + "normal": "기본 공격", + "bpskill": "스킬", + "assist": "지원 스킬", + "maze": "전술", + "ultra": "필살기", + "servantskill": "메모스프라이트 스킬", + "severaltalent": "메모스프라이트 재능", + "singleattack": "단일 공격", + "enhance": "강화", + "summon": "소환", + "blast": "광역 공격", + "restore": "회복", + "support": "지원", + "aoeattack": "광역 공격", + "mazeattack": "미궁 비기", + "impair": "약화", + "bounce": "튕김", + "active": "활성", + "inactive": "비활성", + "defence": "방어", + "maxAll": "모두 최대치", + "maxAllSuccess": "스킬 레벨이 최대치로 설정되었습니다.", + "maxAllFailed": "스킬 레벨을 최대치로 설정하지 못했습니다.", + "noRelicEquipped": "성유물이 장착되지 않음", + "anomalyArbitration": "이상 중재", + "normalMode": "일반 모드", + "hardMode": "어려움 모드", + "selectPEAKEvent": "PEAK 이벤트 선택", + "mode": "모드", + "selectMode": "모드를 선택", + "rollBack": "이전 상태로 되돌리기", + "upRoll": "부옵션 추가", + "downRoll": "부옵션 감소", + "actions": "동작", + "avatars": "아바타", + "quickView": "빠른 조회", + "extraSetting": "추가 설정", + "disableCensorship": "검열 비활성화", + "hideUI": "UI 숨기기", + "theoryCraftMode": "Theory Craft 모드", + "cycleCount": "사이클 수", + "pleaseSelectAllSubStats": "모든 부옵션을 선택하세요", + "subStatRollCountCannotBeZero": "부옵션의 줄 수는 0일 수 없습니다", + "theoryCraft": "Theory Craft", + "multipathCharacter": "다중 운명 캐릭터", + "mainPath": "개척자 운명", + "march7Path": "삼월칠일 운명", + "challenge": "도전", + "skipNode": "노드 건너뛰기", + "disableSkip": "건너뛰기 비활성화", + "skipNode1": "노드 1 건너뛰기", + "skipNode2": "노드 2 건너뛰기", + "extraFeatures": "추가 기능", + "detailTheoryCraft": "이 기능을 활성화하면 사이클 수를 조정하고 적 설정에서 HP를 변경할 수 있습니다.", + "detailSkipNode": "이 기능을 활성화하면 혼돈의 기억 또는 허구 서사의 (노드 1/노드 2)를 건너뛸 수 있습니다.", + "detailChallengePeak": "현재 이형에서의 피크 시즌을 변경할 수 있습니다.", + "detailHiddenUi": "이 기능을 활성화하면 게임 UI가 숨겨집니다.", + "detailDisableCensorship": "이 기능을 활성화하면 게임 내 검열이 비활성화됩니다.", + "detailMultipathCharacter": "일부 캐릭터의 운명을 변경할 수 있습니다.", + "trailblazer": "개척자", + "listExtraEffect": "추가 효과 목록", + "extra": "추가", + "customLineup": "커스텀 편성", + "def": "방어력", + "language": "언어" + } +} diff --git a/messages/pt.json b/messages/pt.json index f9585b0..32c9bbb 100644 --- a/messages/pt.json +++ b/messages/pt.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Ferramentas Firefly por Firefly Shelter" - }, - "DataPage": { - "skillType": "Tipo de Habilidade", - "skillName": "Nome da Habilidade", - "character": "Personagem", - "id": "Id", - "path": "Caminho", - "rarity": "Raridade", - "element": "Elemento", - "technique": "Técnica", - "talent": "Talento", - "basic": "Ataque Básico", - "skill": "Perícia", - "ultimate": "Perícia Suprema", - "servant": "Servo", - "damage": "Dano", - "type": "Tipo", - "warrior": "A Destruição", - "knight": "A Preservação", - "mage": "A Erudição", - "priest": "A Abundância", - "rogue": "A Caça", - "shaman": "A Harmonia", - "warlock": "A Inexistência", - "memory": "A Lembrança", - "elation": "A Alegria", - "fire": "Fogo", - "ice": "Gelo", - "imaginary": "Imaginário", - "physical": "Físico", - "quantum": "Quântico", - "thunder": "Raio", - "wind": "Vento", - "hp": "PV", - "atk": "ATQ", - "speed": "VEL", - "critRate": "Taxa CRIT", - "critDmg": "Dano CRIT", - "breakEffect": "Efeito de Quebra", - "effectRes": "RES a Efeito", - "energyRegenerationRate": "Taxa de Regeneração de Energia", - "effectHitRate": "Taxa de Acerto de Efeito", - "outgoingHealingBoost": "Bônus de Cura", - "fireDmgBoost": "Bônus de Dano de Fogo", - "iceDmgBoost": "Bônus de Dano de Gelo", - "imaginaryDmgBoost": "Bônus de Dano Imaginário", - "physicalDmgBoost": "Bônus de Dano Físico", - "quantumDmgBoost": "Bônus de Dano Quântico", - "thunderDmgBoost": "Bônus de Dano de Raio", - "windDmgBoost": "Bônus de Dano de Vento", - "pursued": "Dano Adicional", - "true damage": "Dano Verdadeiro", - "elationdamage": "Dano de Alegria", - "follow-up": "Dano de Ataque Extra", - "elemental damage": "Dano de Quebra e Superquebra", - "dot": "Dano Contínuo", - "qte": "Habilidade QTE", - "level": "Nível", - "relics": "Relíquias", - "eidolons": "Eidolons", - "lightcones": "Cones de Luz", - "loadData": "Carregar dados", - "exportData": "Exportar dados", - "connectSetting": "Configuração de Conexão", - "connected": "Conectado", - "unconnected": "Desconectado", - "psConnection": "Conexão PS", - "connectionType": "Tipo de Conexão", - "status": "Status", - "connectPs": "Conectar PS", - "disconnect": "Desconectar", - "other": "Outro", - "freeSr": "FreeSR", - "database": "Banco de dados", - "enka": "Enka", - "monsterSetting": "Configuração de Monstros", - "serverUrl": "URL do Servidor", - "privateType": "Tipo Privado", - "local": "Local", - "server": "Servidor", - "username": "Usuário", - "password": "Senha", - "placeholderServerUrl": "Digite o URL do servidor", - "placeholderUsername": "Digite o usuário", - "placeholderPassword": "Digite a senha", - "connectedSuccess": "Conectado ao PS com sucesso", - "connectedFailed": "Falha ao conectar ao PS", - "syncSuccess": "Dados sincronizados com o PS com sucesso", - "syncFailed": "Falha ao sincronizar dados com o PS", - "sync": "Sincronizar", - "importSetting": "Configuração de Importação", - "profile": "Perfil", - "default": "Padrão", - "copyProfiles": "Copiar perfis", - "addNewProfile": "Adicionar novo perfil", - "createNewProfile": "Criar novo perfil", - "editProfile": "Editar perfil", - "placeholderProfileName": "Digite o nome do perfil", - "profileName": "Nome do perfil", - "create": "Criar", - "update": "Atualizar", - "characterInformation": "Informação do Personagem", - "skills": "Habilidades", - "showcaseCard": "Cartão de Exibição", - "comingSoon": "Em breve", - "characterName": "Nome do personagem", - "placeholderCharacter": "Digite o nome do personagem", - "characterSettings": "Configurações de Personagem", - "levelConfiguration": "Configuração de Nível", - "characterLevel": "Nível do Personagem", - "max": "MÁX", - "ultimateEnergy": "Energia da Perícia Suprema", - "currentEnergy": "Energia Atual", - "setTo50": "Definir para 50%", - "battleConfiguration": "Configuração de Batalha", - "useTechnique": "Usar Técnica", - "techniqueNote": "Ativar efeitos de técnica pré-batalha", - "enhancement": "Aprimoramento", - "enhancementLevel": "Nível de Aprimoramento", - "origin": "Origem", - "enhancedNote": "Níveis altos desbloqueiam habilidades", - "lightconeEquipment": "Equipamento de Cone de Luz", - "lightconeSettings": "Configurações de Cone de Luz", - "placeholderLevel": "Digite o nível", - "superimpositionRank": "Rank de Sobreposição", - "ranksNote": "Ranks maiores dão efeitos mais fortes", - "changeLightcone": "Mudar Cone de Luz", - "removeLightcone": "Remover Cone de Luz", - "equipLightcone": "Equipar Cone de Luz", - "noLightconeEquipped": "Sem Cone de Luz", - "equipLightconeNote": "Equipe um cone de luz para melhorar o personagem", - "filter": "Filtro", - "selectedCharacters": "Personagens Selecionados", - "selectedProfiles": "Perfis Selecionados", - "clearAll": "Limpar Tudo", - "selectAll": "Selecionar Tudo", - "copy": "Copiar", - "copied": "Copiado", - "noAvatarSelected": "Nenhum personagem selecionado", - "noAvatarToCopySelected": "Nenhum personagem para copiar", - "pleaseSelectAtLeastOneProfile": "Por favor, selecione ao menos um perfil", - "pleaseEnterUid": "Por favor, insira o UID", - "failedToFetchEnkaData": "Falha ao obter dados Enka", - "pleaseSelectAtLeastOneCharacter": "Selecione ao menos um personagem", - "noDataToImport": "Sem dados para importar", - "pleaseSelectAFile": "Por favor, selecione um arquivo", - "fileMustBeAValidJsonFile": "O arquivo deve ser um JSON válido", - "importEnkaDataSuccess": "Dados Enka importados com sucesso", - "importFreeSRDataSuccess": "Dados FreeSR importados com sucesso", - "importDatabaseSuccess": "Banco de dados importado com sucesso", - "getData": "Obter Dados", - "import": "Importar", - "freeSRImport": "Importação FreeSR", - "onlySupportFreeSRJsonFile": "Suporta apenas arquivos JSON FreeSR", - "pickAFile": "Escolher um arquivo", - "lightConeSetting": "Configuração de Cone de Luz", - "relicMaker": "Criador de Relíquias", - "pleaseSelectAllOptions": "Por favor selecione todas as opções", - "relicSavedSuccessfully": "Relíquia salva com sucesso", - "mainSettings": "Configurações Principais", - "mainStat": "Atributo Principal", - "set": "Conjunto", - "pleaseSelectASet": "Selecione um conjunto", - "effectBonus": "Bônus de Efeito", - "totalRoll": "Total de Melhorias", - "randomizeStats": "Atributos Aleatórios", - "randomizeRolls": "Melhorias Aleatórias", - "selectASubStat": "Selecionar sub-atributo", - "selectASet": "Selecionar conjunto", - "selectAMainStat": "Selecionar atributo principal", - "save": "Salvar", - "reset": "Redefinir", - "roll": "Melhoria", - "step": "Passo", - "memoryOfChaos": "Memória do Caos", - "pureFiction": "Pura Ficção", - "apocalypticShadow": "Sombra Apocalíptica", - "customEnemy": "Inimigo Personalizado", - "simulatedUniverse": "Universo Simulado", - "floor": "Andar", - "side": "Lado", - "wave": "Onda", - "stage": "Fase", - "useCycleCount": "Usar contagem de ciclos?", - "useTurbulenceBuff": "Usar buff de turbulência?", - "firstHalfEnemies": "Inimigos da primeira metade", - "secondHalfEnemies": "Inimigos da segunda metade", - "firstNodeEnemies": "Inimigos do nodo 1", - "secondNodeEnemies": "Inimigos do nodo 2", - "thirdNodeEnemies": "Inimigos do nodo 3", - "firstNode": "Nodo 1", - "secondNode": "Nodo 2", - "thirdNode": "Nodo 3", - "listEnemies": "Lista de inimigos", - "turbulenceBuff": "Buff de Turbulência", - "noEventSelected": "Nenhum evento selecionado", - "noTurbulenceBuff": "Sem Buff de Turbulência", - "upper": "Superior", - "lower": "Inferior", - "upperToLower": "Superior -> Inferior", - "lowerToUpper": "Inferior -> Superior", - "selectMOCEvent": "Selecionar Evento MOC", - "selectPFEvent": "Selecionar Evento PF", - "selectASEvent": "Selecionar Evento AS", - "selectCEEvent": "Selecionar Evento CE", - "selectEvent": "Selecionar Evento", - "selectFloor": "Selecionar Andar", - "selectSide": "Selecionar Lado", - "selectBuff": "Selecionar Buff", - "selectStage": "Selecionar Fase", - "previous": "Anterior", - "next": "Próximo", - "noMonstersFound": "Nenhum monstro encontrado", - "addNewWave": "Adicionar Nova Onda", - "searchStage": "Buscar fase...", - "noStageFound": "Fase não encontrada", - "searchMonster": "Buscar monstro...", - "changeRelic": "Mudar relíquia", - "deleteRelic": "Deletar relíquia", - "deleteRelicConfirm": "Tem certeza que deseja deletar a relíquia neste slot?", - "setEffects": "Definir Efeitos", - "details": "Detalhes", - "normal": "Ataque Básico", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Ferramentas Firefly por Firefly Shelter" + }, + "DataPage": { + "skillType": "Tipo de Habilidade", + "skillName": "Nome da Habilidade", + "character": "Personagem", + "id": "Id", + "path": "Caminho", + "rarity": "Raridade", + "element": "Elemento", + "technique": "Técnica", + "talent": "Talento", + "basic": "Ataque Básico", + "skill": "Perícia", + "ultimate": "Perícia Suprema", + "servant": "Servo", + "damage": "Dano", + "type": "Tipo", + "warrior": "A Destruição", + "knight": "A Preservação", + "mage": "A Erudição", + "priest": "A Abundância", + "rogue": "A Caça", + "shaman": "A Harmonia", + "warlock": "A Inexistência", + "memory": "A Lembrança", + "elation": "A Alegria", + "fire": "Fogo", + "ice": "Gelo", + "imaginary": "Imaginário", + "physical": "Físico", + "quantum": "Quântico", + "thunder": "Raio", + "wind": "Vento", + "hp": "PV", + "atk": "ATQ", + "speed": "VEL", + "critRate": "Taxa CRIT", + "critDmg": "Dano CRIT", + "breakEffect": "Efeito de Quebra", + "effectRes": "RES a Efeito", + "energyRegenerationRate": "Taxa de Regeneração de Energia", + "effectHitRate": "Taxa de Acerto de Efeito", + "outgoingHealingBoost": "Bônus de Cura", + "fireDmgBoost": "Bônus de Dano de Fogo", + "iceDmgBoost": "Bônus de Dano de Gelo", + "imaginaryDmgBoost": "Bônus de Dano Imaginário", + "physicalDmgBoost": "Bônus de Dano Físico", + "quantumDmgBoost": "Bônus de Dano Quântico", + "thunderDmgBoost": "Bônus de Dano de Raio", + "windDmgBoost": "Bônus de Dano de Vento", + "pursued": "Dano Adicional", + "true damage": "Dano Verdadeiro", + "elationdamage": "Dano de Alegria", + "follow-up": "Dano de Ataque Extra", + "elemental damage": "Dano de Quebra e Superquebra", + "dot": "Dano Contínuo", + "qte": "Habilidade QTE", + "level": "Nível", + "relics": "Relíquias", + "eidolons": "Eidolons", + "lightcones": "Cones de Luz", + "loadData": "Carregar dados", + "exportData": "Exportar dados", + "connectSetting": "Configuração de Conexão", + "connected": "Conectado", + "unconnected": "Desconectado", + "psConnection": "Conexão PS", + "connectionType": "Tipo de Conexão", + "status": "Status", + "connectPs": "Conectar PS", + "disconnect": "Desconectar", + "other": "Outro", + "freeSr": "FreeSR", + "database": "Banco de dados", + "enka": "Enka", + "monsterSetting": "Configuração de Monstros", + "serverUrl": "URL do Servidor", + "privateType": "Tipo Privado", + "local": "Local", + "server": "Servidor", + "username": "Usuário", + "password": "Senha", + "placeholderServerUrl": "Digite o URL do servidor", + "placeholderUsername": "Digite o usuário", + "placeholderPassword": "Digite a senha", + "connectedSuccess": "Conectado ao PS com sucesso", + "connectedFailed": "Falha ao conectar ao PS", + "syncSuccess": "Dados sincronizados com o PS com sucesso", + "syncFailed": "Falha ao sincronizar dados com o PS", + "sync": "Sincronizar", + "importSetting": "Configuração de Importação", + "profile": "Perfil", + "default": "Padrão", + "copyProfiles": "Copiar perfis", + "addNewProfile": "Adicionar novo perfil", + "createNewProfile": "Criar novo perfil", + "editProfile": "Editar perfil", + "placeholderProfileName": "Digite o nome do perfil", + "profileName": "Nome do perfil", + "create": "Criar", + "update": "Atualizar", + "characterInformation": "Informação do Personagem", + "skills": "Habilidades", + "showcaseCard": "Cartão de Exibição", + "comingSoon": "Em breve", + "characterName": "Nome do personagem", + "placeholderCharacter": "Digite o nome do personagem", + "characterSettings": "Configurações de Personagem", + "levelConfiguration": "Configuração de Nível", + "characterLevel": "Nível do Personagem", + "max": "MÁX", + "ultimateEnergy": "Energia da Perícia Suprema", + "currentEnergy": "Energia Atual", + "setTo50": "Definir para 50%", + "battleConfiguration": "Configuração de Batalha", + "useTechnique": "Usar Técnica", + "techniqueNote": "Ativar efeitos de técnica pré-batalha", + "enhancement": "Aprimoramento", + "enhancementLevel": "Nível de Aprimoramento", + "origin": "Origem", + "enhancedNote": "Níveis altos desbloqueiam habilidades", + "lightconeEquipment": "Equipamento de Cone de Luz", + "lightconeSettings": "Configurações de Cone de Luz", + "placeholderLevel": "Digite o nível", + "superimpositionRank": "Rank de Sobreposição", + "ranksNote": "Ranks maiores dão efeitos mais fortes", + "changeLightcone": "Mudar Cone de Luz", + "removeLightcone": "Remover Cone de Luz", + "equipLightcone": "Equipar Cone de Luz", + "noLightconeEquipped": "Sem Cone de Luz", + "equipLightconeNote": "Equipe um cone de luz para melhorar o personagem", + "filter": "Filtro", + "selectedCharacters": "Personagens Selecionados", + "selectedProfiles": "Perfis Selecionados", + "clearAll": "Limpar Tudo", + "selectAll": "Selecionar Tudo", + "copy": "Copiar", + "copied": "Copiado", + "noAvatarSelected": "Nenhum personagem selecionado", + "noAvatarToCopySelected": "Nenhum personagem para copiar", + "pleaseSelectAtLeastOneProfile": "Por favor, selecione ao menos um perfil", + "pleaseEnterUid": "Por favor, insira o UID", + "failedToFetchEnkaData": "Falha ao obter dados Enka", + "pleaseSelectAtLeastOneCharacter": "Selecione ao menos um personagem", + "noDataToImport": "Sem dados para importar", + "pleaseSelectAFile": "Por favor, selecione um arquivo", + "fileMustBeAValidJsonFile": "O arquivo deve ser um JSON válido", + "importEnkaDataSuccess": "Dados Enka importados com sucesso", + "importFreeSRDataSuccess": "Dados FreeSR importados com sucesso", + "importDatabaseSuccess": "Banco de dados importado com sucesso", + "getData": "Obter Dados", + "import": "Importar", + "freeSRImport": "Importação FreeSR", + "onlySupportFreeSRJsonFile": "Suporta apenas arquivos JSON FreeSR", + "pickAFile": "Escolher um arquivo", + "lightConeSetting": "Configuração de Cone de Luz", + "relicMaker": "Criador de Relíquias", + "pleaseSelectAllOptions": "Por favor selecione todas as opções", + "relicSavedSuccessfully": "Relíquia salva com sucesso", + "mainSettings": "Configurações Principais", + "mainStat": "Atributo Principal", + "set": "Conjunto", + "pleaseSelectASet": "Selecione um conjunto", + "effectBonus": "Bônus de Efeito", + "totalRoll": "Total de Melhorias", + "randomizeStats": "Atributos Aleatórios", + "randomizeRolls": "Melhorias Aleatórias", + "selectASubStat": "Selecionar sub-atributo", + "selectASet": "Selecionar conjunto", + "selectAMainStat": "Selecionar atributo principal", + "save": "Salvar", + "reset": "Redefinir", + "roll": "Melhoria", + "step": "Passo", + "memoryOfChaos": "Memória do Caos", + "pureFiction": "Pura Ficção", + "apocalypticShadow": "Sombra Apocalíptica", + "customEnemy": "Inimigo Personalizado", + "simulatedUniverse": "Universo Simulado", + "floor": "Andar", + "side": "Lado", + "wave": "Onda", + "stage": "Fase", + "useCycleCount": "Usar contagem de ciclos?", + "useTurbulenceBuff": "Usar buff de turbulência?", + "firstHalfEnemies": "Inimigos da primeira metade", + "secondHalfEnemies": "Inimigos da segunda metade", + "firstNodeEnemies": "Inimigos do nodo 1", + "secondNodeEnemies": "Inimigos do nodo 2", + "thirdNodeEnemies": "Inimigos do nodo 3", + "firstNode": "Nodo 1", + "secondNode": "Nodo 2", + "thirdNode": "Nodo 3", + "listEnemies": "Lista de inimigos", + "turbulenceBuff": "Buff de Turbulência", + "noEventSelected": "Nenhum evento selecionado", + "noTurbulenceBuff": "Sem Buff de Turbulência", + "upper": "Superior", + "lower": "Inferior", + "upperToLower": "Superior -> Inferior", + "lowerToUpper": "Inferior -> Superior", + "selectMOCEvent": "Selecionar Evento MOC", + "selectPFEvent": "Selecionar Evento PF", + "selectASEvent": "Selecionar Evento AS", + "selectCEEvent": "Selecionar Evento CE", + "selectEvent": "Selecionar Evento", + "selectFloor": "Selecionar Andar", + "selectSide": "Selecionar Lado", + "selectBuff": "Selecionar Buff", + "selectStage": "Selecionar Fase", + "previous": "Anterior", + "next": "Próximo", + "noMonstersFound": "Nenhum monstro encontrado", + "addNewWave": "Adicionar Nova Onda", + "searchStage": "Buscar fase...", + "noStageFound": "Fase não encontrada", + "searchMonster": "Buscar monstro...", + "changeRelic": "Mudar relíquia", + "deleteRelic": "Deletar relíquia", + "deleteRelicConfirm": "Tem certeza que deseja deletar a relíquia neste slot?", + "setEffects": "Definir Efeitos", + "details": "Detalhes", + "normal": "Ataque Básico", "bpskill": "Perícia", "maze": "Técnica", "ultra": "Perícia Suprema", "assist": "Habilidade de Assistência", "servantskill": "Habilidade do Memoespirito", - "severaltalent": "Talento do Memoespirito", - "singleattack": "Ataque Único", - "enhance": "Aprimorar", - "summon": "Invocar", - "mazeattack": "Ataque de Técnica", - "blast": "Explosão", - "restore": "Restaurar", - "support": "Suporte", - "aoeattack": "Ataque em Área", - "impair": "Enfraquecer", - "bounce": "Rebote", - "active": "Ativo", - "defence": "Defesa", - "inactive": "Inativo", - "maxAll": "Maximizar Tudo", - "maxAllSuccess": "Habilidades maximizadas com sucesso.", - "maxAllFailed": "Falha ao maximizar habilidades.", - "noRelicEquipped": "Sem relíquia equipada", - "anomalyArbitration": "Arbitragem de Anomalia", - "normalMode": "Modo Normal", - "hardMode": "Modo Difícil", - "selectPEAKEvent": "Selecionar Evento PEAK", - "mode": "Modo", - "selectMode": "Selecionar um modo", - "rollBack": "Reverter", - "upRoll": "Aumentar Melhoria", - "downRoll": "Diminuir Melhoria", - "actions": "Ações", - "avatars": "Avatares", - "quickView": "Visualização Rápida", - "extraSetting": "Configurações Extras", - "disableCensorship": "Desativar Censura", - "hideUI": "Ocultar UI", - "theoryCraftMode": "Modo Theorycraft", - "cycleCount": "Contagem de Ciclos", - "pleaseSelectAllSubStats": "Selecione todos os sub-atributos", - "subStatRollCountCannotBeZero": "As melhorias do sub-atributo não podem ser zero", - "theoryCraft": "Theorycraft", - "multipathCharacter": "Personagem Multicaminho", - "mainPath": "Caminho Principal", - "march7Path": "Caminho de 7 de Março", - "challenge": "Desafio", - "skipNode": "Pular Nó", - "disableSkip": "Desativar pulo", - "skipNode1": "Pular nó 1", - "skipNode2": "Pular nó 2", - "extraFeatures": "Recursos Extras", - "detailTheoryCraft": "Ativar isso permite personalizar os ciclos e ajustar o HP dos inimigos.", - "detailSkipNode": "Permite pular (Nó 1/Nó 2) em Memória do Caos ou Pura Ficção.", - "detailChallengePeak": "Permite mudar a temporada de Peak na Anomalia atual.", - "detailHiddenUi": "Irá esconder a interface do jogo.", - "detailDisableCensorship": "Desativa a censura no jogo.", - "detailMultipathCharacter": "Permite mudar o Caminho de certos personagens.", - "trailblazer": "Desbravador", - "listExtraEffect": "Lista de Efeitos Extras", - "extra": "Extra", - "customLineup": "Formação Personalizada" - } + "severaltalent": "Talento do Memoespirito", + "singleattack": "Ataque Único", + "enhance": "Aprimorar", + "summon": "Invocar", + "mazeattack": "Ataque de Técnica", + "blast": "Explosão", + "restore": "Restaurar", + "support": "Suporte", + "aoeattack": "Ataque em Área", + "impair": "Enfraquecer", + "bounce": "Rebote", + "active": "Ativo", + "defence": "Defesa", + "inactive": "Inativo", + "maxAll": "Maximizar Tudo", + "maxAllSuccess": "Habilidades maximizadas com sucesso.", + "maxAllFailed": "Falha ao maximizar habilidades.", + "noRelicEquipped": "Sem relíquia equipada", + "anomalyArbitration": "Arbitragem de Anomalia", + "normalMode": "Modo Normal", + "hardMode": "Modo Difícil", + "selectPEAKEvent": "Selecionar Evento PEAK", + "mode": "Modo", + "selectMode": "Selecionar um modo", + "rollBack": "Reverter", + "upRoll": "Aumentar Melhoria", + "downRoll": "Diminuir Melhoria", + "actions": "Ações", + "avatars": "Avatares", + "quickView": "Visualização Rápida", + "extraSetting": "Configurações Extras", + "disableCensorship": "Desativar Censura", + "hideUI": "Ocultar UI", + "theoryCraftMode": "Modo Theorycraft", + "cycleCount": "Contagem de Ciclos", + "pleaseSelectAllSubStats": "Selecione todos os sub-atributos", + "subStatRollCountCannotBeZero": "As melhorias do sub-atributo não podem ser zero", + "theoryCraft": "Theorycraft", + "multipathCharacter": "Personagem Multicaminho", + "mainPath": "Caminho Principal", + "march7Path": "Caminho de 7 de Março", + "challenge": "Desafio", + "skipNode": "Pular Nó", + "disableSkip": "Desativar pulo", + "skipNode1": "Pular nó 1", + "skipNode2": "Pular nó 2", + "extraFeatures": "Recursos Extras", + "detailTheoryCraft": "Ativar isso permite personalizar os ciclos e ajustar o HP dos inimigos.", + "detailSkipNode": "Permite pular (Nó 1/Nó 2) em Memória do Caos ou Pura Ficção.", + "detailChallengePeak": "Permite mudar a temporada de Peak na Anomalia atual.", + "detailHiddenUi": "Irá esconder a interface do jogo.", + "detailDisableCensorship": "Desativa a censura no jogo.", + "detailMultipathCharacter": "Permite mudar o Caminho de certos personagens.", + "trailblazer": "Desbravador", + "listExtraEffect": "Lista de Efeitos Extras", + "extra": "Extra", + "customLineup": "Formação Personalizada", + "def": "DEF", + "language": "Idioma" + } } diff --git a/messages/ru.json b/messages/ru.json index e012982..effbf87 100644 --- a/messages/ru.json +++ b/messages/ru.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Инструменты Firefly от Firefly Shelter" - }, - "DataPage": { - "skillType": "Тип навыка", - "skillName": "Название навыка", - "character": "Персонаж", - "id": "ID", - "path": "Путь", - "rarity": "Редкость", - "element": "Элемент", - "technique": "Техника", - "talent": "Талант", - "basic": "Базовая атака", - "skill": "Навык", - "ultimate": "Сверхспособность", - "servant": "Слуга", - "damage": "Урон", - "type": "Тип", - "warrior": "Разрушение", - "knight": "Сохранение", - "mage": "Эрудиция", - "priest": "Изобилие", - "rogue": "Охота", - "shaman": "Гармония", - "warlock": "Небытие", - "memory": "Память", - "elation": "Радость", - "fire": "Огонь", - "ice": "Лед", - "imaginary": "Мнимый", - "physical": "Физический", - "quantum": "Квантовый", - "thunder": "Электрический", - "wind": "Ветряной", - "hp": "HP", - "atk": "Сила атаки", - "speed": "Скорость", - "critRate": "Крит. шанс", - "critDmg": "Крит. урон", - "breakEffect": "Эффект пробития", - "effectRes": "Сопротивление эффектам", - "energyRegenerationRate": "Скорость восст. энергии", - "effectHitRate": "Шанс попадания эффектов", - "outgoingHealingBoost": "Бонус исходящего исцеления", - "fireDmgBoost": "Бонус огненного урона", - "iceDmgBoost": "Бонус ледяного урона", - "imaginaryDmgBoost": "Бонус мнимого урона", - "physicalDmgBoost": "Бонус физ. урона", - "quantumDmgBoost": "Бонус квантового урона", - "thunderDmgBoost": "Бонус электр. урона", - "windDmgBoost": "Бонус ветряного урона", - "pursued": "Дополнительный урон", - "true damage": "Истинный урон", - "elationdamage": "Урон радости", - "follow-up": "Урон бонус-атаки", - "elemental damage": "Урон пробития и суперпробития", - "dot": "Периодический урон", - "qte": "QTE Навык", - "level": "Уровень", - "relics": "Реликвии", - "eidolons": "Эйдолоны", - "lightcones": "Световые конусы", - "loadData": "Загрузить данные", - "exportData": "Экспортировать данные", - "connectSetting": "Настройки подключения", - "connected": "Подключено", - "unconnected": "Не подключено", - "psConnection": "Подключение к PS", - "connectionType": "Тип подключения", - "status": "Статус", - "connectPs": "Подключить PS", - "disconnect": "Отключить", - "other": "Другое", - "freeSr": "FreeSR", - "database": "База данных", - "enka": "Enka", - "monsterSetting": "Настройки монстров", - "serverUrl": "URL сервера", - "privateType": "Приватный тип", - "local": "Локальный", - "server": "Сервер", - "username": "Имя пользователя", - "password": "Пароль", - "placeholderServerUrl": "Введите URL сервера", - "placeholderUsername": "Введите имя пользователя", - "placeholderPassword": "Введите пароль", - "connectedSuccess": "Успешное подключение к PS", - "connectedFailed": "Ошибка подключения к PS", - "syncSuccess": "Данные успешно синхронизированы с PS", - "syncFailed": "Ошибка синхронизации данных", - "sync": "Синхронизация", - "importSetting": "Настройки импорта", - "profile": "Профиль", - "default": "По умолчанию", - "copyProfiles": "Копировать профили", - "addNewProfile": "Добавить новый профиль", - "createNewProfile": "Создать новый профиль", - "editProfile": "Редактировать профиль", - "placeholderProfileName": "Введите имя профиля", - "profileName": "Имя профиля", - "create": "Создать", - "update": "Обновить", - "characterInformation": "Информация о персонаже", - "skills": "Навыки", - "showcaseCard": "Карточка персонажа", - "comingSoon": "Скоро", - "characterName": "Имя персонажа", - "placeholderCharacter": "Введите имя персонажа", - "characterSettings": "Настройки персонажа", - "levelConfiguration": "Конфигурация уровня", - "characterLevel": "Уровень персонажа", - "max": "МАКС", - "ultimateEnergy": "Энергия сверхспособности", - "currentEnergy": "Текущая энергия", - "setTo50": "Установить на 50%", - "battleConfiguration": "Конфигурация боя", - "useTechnique": "Использовать технику", - "techniqueNote": "Включить эффекты техники до боя", - "enhancement": "Усиление", - "enhancementLevel": "Уровень усиления", - "origin": "Оригинал", - "enhancedNote": "Высокие уровни открывают новые способности", - "lightconeEquipment": "Снаряжение конуса", - "lightconeSettings": "Настройки светового конуса", - "placeholderLevel": "Введите уровень", - "superimpositionRank": "Уровень наложения", - "ranksNote": "Высокие ранги дают более сильные эффекты", - "changeLightcone": "Изменить световой конус", - "removeLightcone": "Снять световой конус", - "equipLightcone": "Экипировать конус", - "noLightconeEquipped": "Световой конус не экипирован", - "equipLightconeNote": "Наденьте конус для усиления персонажа", - "filter": "Фильтр", - "selectedCharacters": "Выбранные персонажи", - "selectedProfiles": "Выбранные профили", - "clearAll": "Очистить всё", - "selectAll": "Выбрать всё", - "copy": "Копировать", - "copied": "Скопировано", - "noAvatarSelected": "Персонаж не выбран", - "noAvatarToCopySelected": "Нет персонажа для копирования", - "pleaseSelectAtLeastOneProfile": "Пожалуйста, выберите хотя бы один профиль", - "pleaseEnterUid": "Пожалуйста, введите UID", - "failedToFetchEnkaData": "Не удалось получить данные Enka", - "pleaseSelectAtLeastOneCharacter": "Пожалуйста, выберите хотя бы одного персонажа", - "noDataToImport": "Нет данных для импорта", - "pleaseSelectAFile": "Пожалуйста, выберите файл", - "fileMustBeAValidJsonFile": "Файл должен быть в формате JSON", - "importEnkaDataSuccess": "Успешный импорт из Enka", - "importFreeSRDataSuccess": "Успешный импорт из FreeSR", - "importDatabaseSuccess": "Успешный импорт базы данных", - "getData": "Получить данные", - "import": "Импорт", - "freeSRImport": "Импорт FreeSR", - "onlySupportFreeSRJsonFile": "Поддерживаются только JSON от FreeSR", - "pickAFile": "Выберите файл", - "lightConeSetting": "Настройки конуса", - "relicMaker": "Создатель реликвий", - "pleaseSelectAllOptions": "Пожалуйста, выберите все параметры", - "relicSavedSuccessfully": "Реликвия успешно сохранена", - "mainSettings": "Основные настройки", - "mainStat": "Основная характеристика", - "set": "Набор", - "pleaseSelectASet": "Выберите набор", - "effectBonus": "Бонус эффекта", - "totalRoll": "Всего улучшений", - "randomizeStats": "Случайные статы", - "randomizeRolls": "Случайные улучшения", - "selectASubStat": "Выберите доп. стат", - "selectASet": "Выберите набор", - "selectAMainStat": "Выберите основной стат", - "save": "Сохранить", - "reset": "Сброс", - "roll": "Улучшение", - "step": "Шаг", - "memoryOfChaos": "Зал забвения", - "pureFiction": "Чистый вымысел", - "apocalypticShadow": "Апокалиптическая тень", - "customEnemy": "Свой противник", - "simulatedUniverse": "Виртуальная вселенная", - "floor": "Этаж", - "side": "Половина", - "wave": "Волна", - "stage": "Стадия", - "useCycleCount": "Использовать счетчик циклов?", - "useTurbulenceBuff": "Использовать бафф турбулентности?", - "firstHalfEnemies": "Враги первой половины", - "secondHalfEnemies": "Враги второй половины", - "firstNodeEnemies": "Враги узла 1", - "secondNodeEnemies": "Враги узла 2", - "thirdNodeEnemies": "Враги узла 3", - "firstNode": "Узел 1", - "secondNode": "Узел 2", - "thirdNode": "Узел 3", - "listEnemies": "Список врагов", - "turbulenceBuff": "Бафф турбулентности", - "noEventSelected": "Событие не выбрано", - "noTurbulenceBuff": "Нет баффа турбулентности", - "upper": "Верх", - "lower": "Низ", - "upperToLower": "Верх -> Низ", - "lowerToUpper": "Низ -> Верх", - "selectMOCEvent": "Выбрать событие MOC", - "selectPFEvent": "Выбрать событие PF", - "selectASEvent": "Выбрать событие AS", - "selectCEEvent": "Выбрать событие CE", - "selectEvent": "Выбрать событие", - "selectFloor": "Выбрать этаж", - "selectSide": "Выбрать половину", - "selectBuff": "Выбрать бафф", - "selectStage": "Выбрать стадию", - "previous": "Назад", - "next": "Вперед", - "noMonstersFound": "Монстры не найдены", - "addNewWave": "Добавить новую волну", - "searchStage": "Поиск стадии...", - "noStageFound": "Стадия не найдена", - "searchMonster": "Поиск монстра...", - "changeRelic": "Изменить реликвию", - "deleteRelic": "Удалить реликвию", - "deleteRelicConfirm": "Удалить реликвию в этом слоте?", - "setEffects": "Настроить эффекты", - "details": "Детали", - "normal": "Базовая атака", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Инструменты Firefly от Firefly Shelter" + }, + "DataPage": { + "skillType": "Тип навыка", + "skillName": "Название навыка", + "character": "Персонаж", + "id": "ID", + "path": "Путь", + "rarity": "Редкость", + "element": "Элемент", + "technique": "Техника", + "talent": "Талант", + "basic": "Базовая атака", + "skill": "Навык", + "ultimate": "Сверхспособность", + "servant": "Слуга", + "damage": "Урон", + "type": "Тип", + "warrior": "Разрушение", + "knight": "Сохранение", + "mage": "Эрудиция", + "priest": "Изобилие", + "rogue": "Охота", + "shaman": "Гармония", + "warlock": "Небытие", + "memory": "Память", + "elation": "Радость", + "fire": "Огонь", + "ice": "Лед", + "imaginary": "Мнимый", + "physical": "Физический", + "quantum": "Квантовый", + "thunder": "Электрический", + "wind": "Ветряной", + "hp": "HP", + "atk": "Сила атаки", + "speed": "Скорость", + "critRate": "Крит. шанс", + "critDmg": "Крит. урон", + "breakEffect": "Эффект пробития", + "effectRes": "Сопротивление эффектам", + "energyRegenerationRate": "Скорость восст. энергии", + "effectHitRate": "Шанс попадания эффектов", + "outgoingHealingBoost": "Бонус исходящего исцеления", + "fireDmgBoost": "Бонус огненного урона", + "iceDmgBoost": "Бонус ледяного урона", + "imaginaryDmgBoost": "Бонус мнимого урона", + "physicalDmgBoost": "Бонус физ. урона", + "quantumDmgBoost": "Бонус квантового урона", + "thunderDmgBoost": "Бонус электр. урона", + "windDmgBoost": "Бонус ветряного урона", + "pursued": "Дополнительный урон", + "true damage": "Истинный урон", + "elationdamage": "Урон радости", + "follow-up": "Урон бонус-атаки", + "elemental damage": "Урон пробития и суперпробития", + "dot": "Периодический урон", + "qte": "QTE Навык", + "level": "Уровень", + "relics": "Реликвии", + "eidolons": "Эйдолоны", + "lightcones": "Световые конусы", + "loadData": "Загрузить данные", + "exportData": "Экспортировать данные", + "connectSetting": "Настройки подключения", + "connected": "Подключено", + "unconnected": "Не подключено", + "psConnection": "Подключение к PS", + "connectionType": "Тип подключения", + "status": "Статус", + "connectPs": "Подключить PS", + "disconnect": "Отключить", + "other": "Другое", + "freeSr": "FreeSR", + "database": "База данных", + "enka": "Enka", + "monsterSetting": "Настройки монстров", + "serverUrl": "URL сервера", + "privateType": "Приватный тип", + "local": "Локальный", + "server": "Сервер", + "username": "Имя пользователя", + "password": "Пароль", + "placeholderServerUrl": "Введите URL сервера", + "placeholderUsername": "Введите имя пользователя", + "placeholderPassword": "Введите пароль", + "connectedSuccess": "Успешное подключение к PS", + "connectedFailed": "Ошибка подключения к PS", + "syncSuccess": "Данные успешно синхронизированы с PS", + "syncFailed": "Ошибка синхронизации данных", + "sync": "Синхронизация", + "importSetting": "Настройки импорта", + "profile": "Профиль", + "default": "По умолчанию", + "copyProfiles": "Копировать профили", + "addNewProfile": "Добавить новый профиль", + "createNewProfile": "Создать новый профиль", + "editProfile": "Редактировать профиль", + "placeholderProfileName": "Введите имя профиля", + "profileName": "Имя профиля", + "create": "Создать", + "update": "Обновить", + "characterInformation": "Информация о персонаже", + "skills": "Навыки", + "showcaseCard": "Карточка персонажа", + "comingSoon": "Скоро", + "characterName": "Имя персонажа", + "placeholderCharacter": "Введите имя персонажа", + "characterSettings": "Настройки персонажа", + "levelConfiguration": "Конфигурация уровня", + "characterLevel": "Уровень персонажа", + "max": "МАКС", + "ultimateEnergy": "Энергия сверхспособности", + "currentEnergy": "Текущая энергия", + "setTo50": "Установить на 50%", + "battleConfiguration": "Конфигурация боя", + "useTechnique": "Использовать технику", + "techniqueNote": "Включить эффекты техники до боя", + "enhancement": "Усиление", + "enhancementLevel": "Уровень усиления", + "origin": "Оригинал", + "enhancedNote": "Высокие уровни открывают новые способности", + "lightconeEquipment": "Снаряжение конуса", + "lightconeSettings": "Настройки светового конуса", + "placeholderLevel": "Введите уровень", + "superimpositionRank": "Уровень наложения", + "ranksNote": "Высокие ранги дают более сильные эффекты", + "changeLightcone": "Изменить световой конус", + "removeLightcone": "Снять световой конус", + "equipLightcone": "Экипировать конус", + "noLightconeEquipped": "Световой конус не экипирован", + "equipLightconeNote": "Наденьте конус для усиления персонажа", + "filter": "Фильтр", + "selectedCharacters": "Выбранные персонажи", + "selectedProfiles": "Выбранные профили", + "clearAll": "Очистить всё", + "selectAll": "Выбрать всё", + "copy": "Копировать", + "copied": "Скопировано", + "noAvatarSelected": "Персонаж не выбран", + "noAvatarToCopySelected": "Нет персонажа для копирования", + "pleaseSelectAtLeastOneProfile": "Пожалуйста, выберите хотя бы один профиль", + "pleaseEnterUid": "Пожалуйста, введите UID", + "failedToFetchEnkaData": "Не удалось получить данные Enka", + "pleaseSelectAtLeastOneCharacter": "Пожалуйста, выберите хотя бы одного персонажа", + "noDataToImport": "Нет данных для импорта", + "pleaseSelectAFile": "Пожалуйста, выберите файл", + "fileMustBeAValidJsonFile": "Файл должен быть в формате JSON", + "importEnkaDataSuccess": "Успешный импорт из Enka", + "importFreeSRDataSuccess": "Успешный импорт из FreeSR", + "importDatabaseSuccess": "Успешный импорт базы данных", + "getData": "Получить данные", + "import": "Импорт", + "freeSRImport": "Импорт FreeSR", + "onlySupportFreeSRJsonFile": "Поддерживаются только JSON от FreeSR", + "pickAFile": "Выберите файл", + "lightConeSetting": "Настройки конуса", + "relicMaker": "Создатель реликвий", + "pleaseSelectAllOptions": "Пожалуйста, выберите все параметры", + "relicSavedSuccessfully": "Реликвия успешно сохранена", + "mainSettings": "Основные настройки", + "mainStat": "Основная характеристика", + "set": "Набор", + "pleaseSelectASet": "Выберите набор", + "effectBonus": "Бонус эффекта", + "totalRoll": "Всего улучшений", + "randomizeStats": "Случайные статы", + "randomizeRolls": "Случайные улучшения", + "selectASubStat": "Выберите доп. стат", + "selectASet": "Выберите набор", + "selectAMainStat": "Выберите основной стат", + "save": "Сохранить", + "reset": "Сброс", + "roll": "Улучшение", + "step": "Шаг", + "memoryOfChaos": "Зал забвения", + "pureFiction": "Чистый вымысел", + "apocalypticShadow": "Апокалиптическая тень", + "customEnemy": "Свой противник", + "simulatedUniverse": "Виртуальная вселенная", + "floor": "Этаж", + "side": "Половина", + "wave": "Волна", + "stage": "Стадия", + "useCycleCount": "Использовать счетчик циклов?", + "useTurbulenceBuff": "Использовать бафф турбулентности?", + "firstHalfEnemies": "Враги первой половины", + "secondHalfEnemies": "Враги второй половины", + "firstNodeEnemies": "Враги узла 1", + "secondNodeEnemies": "Враги узла 2", + "thirdNodeEnemies": "Враги узла 3", + "firstNode": "Узел 1", + "secondNode": "Узел 2", + "thirdNode": "Узел 3", + "listEnemies": "Список врагов", + "turbulenceBuff": "Бафф турбулентности", + "noEventSelected": "Событие не выбрано", + "noTurbulenceBuff": "Нет баффа турбулентности", + "upper": "Верх", + "lower": "Низ", + "upperToLower": "Верх -> Низ", + "lowerToUpper": "Низ -> Верх", + "selectMOCEvent": "Выбрать событие MOC", + "selectPFEvent": "Выбрать событие PF", + "selectASEvent": "Выбрать событие AS", + "selectCEEvent": "Выбрать событие CE", + "selectEvent": "Выбрать событие", + "selectFloor": "Выбрать этаж", + "selectSide": "Выбрать половину", + "selectBuff": "Выбрать бафф", + "selectStage": "Выбрать стадию", + "previous": "Назад", + "next": "Вперед", + "noMonstersFound": "Монстры не найдены", + "addNewWave": "Добавить новую волну", + "searchStage": "Поиск стадии...", + "noStageFound": "Стадия не найдена", + "searchMonster": "Поиск монстра...", + "changeRelic": "Изменить реликвию", + "deleteRelic": "Удалить реликвию", + "deleteRelicConfirm": "Удалить реликвию в этом слоте?", + "setEffects": "Настроить эффекты", + "details": "Детали", + "normal": "Базовая атака", "bpskill": "Навык", "maze": "Техника", "ultra": "Сверхспособность", "assist": "Навык поддержки", "servantskill": "Навык мемоспрайта", - "severaltalent": "Талант мемоспрайта", - "singleattack": "Одиночная атака", - "enhance": "Усиление", - "summon": "Призыв", - "mazeattack": "Атака в технике", - "blast": "Взрыв", - "restore": "Восстановление", - "support": "Поддержка", - "aoeattack": "АоЕ атака", - "impair": "Ослабление", - "bounce": "Отскок", - "active": "Активен", - "defence": "Защита", - "inactive": "Неактивен", - "maxAll": "Улучшить всё", - "maxAllSuccess": "Уровни навыков улучшены до максимума.", - "maxAllFailed": "Не удалось улучшить навыки.", - "noRelicEquipped": "Нет экипированных реликвий", - "anomalyArbitration": "Аномальный арбитраж", - "normalMode": "Обычный режим", - "hardMode": "Сложный режим", - "selectPEAKEvent": "Выбрать событие PEAK", - "mode": "Режим", - "selectMode": "Выбрать режим", - "rollBack": "Отменить шаг", - "upRoll": "Повысить улучшение", - "downRoll": "Понизить улучшение", - "actions": "Действия", - "avatars": "Персонажи", - "quickView": "Быстрый просмотр", - "extraSetting": "Дополнительные настройки", - "disableCensorship": "Отключить цензуру", - "hideUI": "Скрыть интерфейс", - "theoryCraftMode": "Режим Theorycraft", - "cycleCount": "Счетчик циклов", - "pleaseSelectAllSubStats": "Пожалуйста, выберите все саб-статы", - "subStatRollCountCannotBeZero": "Количество улучшений саб-стата не может быть нулем", - "theoryCraft": "Theorycraft", - "multipathCharacter": "Многопутевой персонаж", - "mainPath": "Основной Путь", - "march7Path": "Путь Март 7", - "challenge": "Испытание", - "skipNode": "Пропустить узел", - "disableSkip": "Отключить пропуск", - "skipNode1": "Пропустить узел 1", - "skipNode2": "Пропустить узел 2", - "extraFeatures": "Дополнительные функции", - "detailTheoryCraft": "Включение этой функции позволяет настроить количество циклов и здоровье противников.", - "detailSkipNode": "Позволяет пропустить (Узел 1/Узел 2) в Зале забвения или Чистом вымысле.", - "detailChallengePeak": "Позволяет изменить сезон Peak в текущей Аномалии.", - "detailHiddenUi": "Скрывает игровой интерфейс.", - "detailDisableCensorship": "Отключает внутриигровую цензуру.", - "detailMultipathCharacter": "Позволяет изменить Путь некоторых персонажей.", - "trailblazer": "Первопроходец", - "listExtraEffect": "Список доп. эффектов", - "extra": "Экстра", - "customLineup": "Пользовательский отряд" - } + "severaltalent": "Талант мемоспрайта", + "singleattack": "Одиночная атака", + "enhance": "Усиление", + "summon": "Призыв", + "mazeattack": "Атака в технике", + "blast": "Взрыв", + "restore": "Восстановление", + "support": "Поддержка", + "aoeattack": "АоЕ атака", + "impair": "Ослабление", + "bounce": "Отскок", + "active": "Активен", + "defence": "Защита", + "inactive": "Неактивен", + "maxAll": "Улучшить всё", + "maxAllSuccess": "Уровни навыков улучшены до максимума.", + "maxAllFailed": "Не удалось улучшить навыки.", + "noRelicEquipped": "Нет экипированных реликвий", + "anomalyArbitration": "Аномальный арбитраж", + "normalMode": "Обычный режим", + "hardMode": "Сложный режим", + "selectPEAKEvent": "Выбрать событие PEAK", + "mode": "Режим", + "selectMode": "Выбрать режим", + "rollBack": "Отменить шаг", + "upRoll": "Повысить улучшение", + "downRoll": "Понизить улучшение", + "actions": "Действия", + "avatars": "Персонажи", + "quickView": "Быстрый просмотр", + "extraSetting": "Дополнительные настройки", + "disableCensorship": "Отключить цензуру", + "hideUI": "Скрыть интерфейс", + "theoryCraftMode": "Режим Theorycraft", + "cycleCount": "Счетчик циклов", + "pleaseSelectAllSubStats": "Пожалуйста, выберите все саб-статы", + "subStatRollCountCannotBeZero": "Количество улучшений саб-стата не может быть нулем", + "theoryCraft": "Theorycraft", + "multipathCharacter": "Многопутевой персонаж", + "mainPath": "Основной Путь", + "march7Path": "Путь Март 7", + "challenge": "Испытание", + "skipNode": "Пропустить узел", + "disableSkip": "Отключить пропуск", + "skipNode1": "Пропустить узел 1", + "skipNode2": "Пропустить узел 2", + "extraFeatures": "Дополнительные функции", + "detailTheoryCraft": "Включение этой функции позволяет настроить количество циклов и здоровье противников.", + "detailSkipNode": "Позволяет пропустить (Узел 1/Узел 2) в Зале забвения или Чистом вымысле.", + "detailChallengePeak": "Позволяет изменить сезон Peak в текущей Аномалии.", + "detailHiddenUi": "Скрывает игровой интерфейс.", + "detailDisableCensorship": "Отключает внутриигровую цензуру.", + "detailMultipathCharacter": "Позволяет изменить Путь некоторых персонажей.", + "trailblazer": "Первопроходец", + "listExtraEffect": "Список доп. эффектов", + "extra": "Экстра", + "customLineup": "Пользовательский отряд", + "def": "Защ", + "language": "Язык" + } } diff --git a/messages/th.json b/messages/th.json index 1a4eadd..ec8cde5 100644 --- a/messages/th.json +++ b/messages/th.json @@ -1,291 +1,293 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "เครื่องมือ Firefly โดย Firefly Shelter" - }, - "DataPage": { - "skillType": "ประเภทสกิล", - "skillName": "ชื่อสกิล", - "character": "ตัวละคร", - "id": "ไอดี", - "path": "Path", - "rarity": "ระดับความหายาก", - "element": "ธาตุ", - "technique": "เทคนิค", - "talent": "พรสวรรค์", - "basic": "โจมตีปกติ", - "skill": "สกิลต่อสู้", - "ultimate": "ท่าไม้ตาย", - "servant": "ผู้ติดตาม", - "damage": "ความเสียหาย", - "type": "ประเภท", - "warrior": "ทำลายล้าง", - "knight": "อนุรักษ์", - "mage": "ปัญญา", - "priest": "เฟื่องฟู", - "rogue": "ล่าสังหาร", - "shaman": "ประสาน", - "warlock": "ลบล้าง", - "memory": "ลบล้าง", - "elation": "ปิติสุข", - "fire": "ไฟ", - "ice": "น้ำแข็ง", - "imaginary": "จินตภาพ", - "physical": "กายภาพ", - "quantum": "ควอนตัม", - "thunder": "สายฟ้า", - "wind": "ลม", - "hp": "HP", - "atk": "ATK", - "speed": "ความเร็ว", - "critRate": "อัตราคริติคอล", - "critDmg": "ความเสียหายคริติคอล", - "breakEffect": "เอฟเฟกต์ทำลายล้าง", - "effectRes": "ต้านทานสถานะ", - "energyRegenerationRate": "อัตราฟื้นฟูพลังงาน", - "effectHitRate": "อัตราสร้างสถานะ", - "outgoingHealingBoost": "โบนัสการรักษา", - "fireDmgBoost": "โบนัสความเสียหายไฟ", - "iceDmgBoost": "โบนัสความเสียหายน้ำแข็ง", - "imaginaryDmgBoost": "โบนัสความเสียหายจินตภาพ", - "physicalDmgBoost": "โบนัสความเสียหายกายภาพ", - "quantumDmgBoost": "โบนัสความเสียหายควอนตัม", - "thunderDmgBoost": "โบนัสความเสียหายสายฟ้า", - "windDmgBoost": "โบนัสความเสียหายลม", - "pursued": "ความเสียหายเพิ่มเติม", - "true damage": "ความเสียหายจริง", - "elationdamage": "ความเสียหายปิติสุข", - "follow-up": "ความเสียหายโจมตีต่อเนื่อง", - "elemental damage": "ความเสียหายทำลายล้างและซูเปอร์", - "dot": "ความเสียหายต่อเนื่อง", - "qte": "สกิล QTE", - "level": "เลเวล", - "relics": "รีลิกส์", - "eidolons": "Eidolon", - "lightcones": "Light Cone", - "loadData": "โหลดข้อมูล", - "exportData": "ส่งออกข้อมูล", - "connectSetting": "การตั้งค่าการเชื่อมต่อ", - "connected": "เชื่อมต่อแล้ว", - "unconnected": "ไม่ได้เชื่อมต่อ", - "psConnection": "การเชื่อมต่อ PS", - "connectionType": "ประเภทการเชื่อมต่อ", - "status": "สถานะ", - "connectPs": "เชื่อมต่อ PS", - "disconnect": "ยกเลิกการเชื่อมต่อ", - "other": "อื่นๆ", - "freeSr": "FreeSR", - "database": "ฐานข้อมูล", - "enka": "Enka", - "monsterSetting": "ตั้งค่ามอนสเตอร์", - "serverUrl": "URL เซิร์ฟเวอร์", - "privateType": "ประเภทเซิร์ฟเวอร์ส่วนตัว", - "local": "ในเครื่อง", - "server": "เซิร์ฟเวอร์", - "username": "ชื่อผู้ใช้", - "password": "รหัสผ่าน", - "placeholderServerUrl": "ป้อน URL เซิร์ฟเวอร์", - "placeholderUsername": "ป้อนชื่อผู้ใช้", - "placeholderPassword": "ป้อนรหัสผ่าน", - "connectedSuccess": "เชื่อมต่อกับ PS สำเร็จ", - "connectedFailed": "ล้มเหลวในการเชื่อมต่อกับ PS", - "syncSuccess": "ซิงค์ข้อมูลกับ PS สำเร็จ", - "syncFailed": "ล้มเหลวในการซิงค์ข้อมูลกับ PS", - "sync": "ซิงค์", - "importSetting": "การตั้งค่าการนำเข้า", - "profile": "โปรไฟล์", - "default": "ค่าเริ่มต้น", - "copyProfiles": "คัดลอกโปรไฟล์", - "addNewProfile": "เพิ่มโปรไฟล์ใหม่", - "createNewProfile": "สร้างโปรไฟล์ใหม่", - "editProfile": "แก้ไขโปรไฟล์", - "placeholderProfileName": "ป้อนชื่อโปรไฟล์", - "profileName": "ชื่อโปรไฟล์", - "create": "สร้าง", - "update": "อัปเดต", - "characterInformation": "ข้อมูลตัวละคร", - "skills": "สกิล", - "showcaseCard": "การ์ดแสดง", - "comingSoon": "เร็วๆ นี้", - "characterName": "ชื่อตัวละคร", - "placeholderCharacter": "ป้อนชื่อตัวละคร", - "characterSettings": "การตั้งค่าตัวละคร", - "levelConfiguration": "การกำหนดระดับเลเวล", - "characterLevel": "เลเวลตัวละคร", - "max": "สูงสุด", - "ultimateEnergy": "พลังงานท่าไม้ตาย", - "currentEnergy": "พลังงานปัจจุบัน", - "setTo50": "ตั้งค่าเป็น 50%", - "battleConfiguration": "การกำหนดค่าการต่อสู้", - "useTechnique": "ใช้เทคนิค", - "techniqueNote": "เปิดใช้เอฟเฟกต์เทคนิคก่อนการต่อสู้", - "enhancement": "การเสริมพลัง", - "enhancementLevel": "ระดับการเสริมพลัง", - "origin": "ดั้งเดิม", - "enhancedNote": "การเสริมพลังที่สูงขึ้นจะปลดล็อกความสามารถ", - "lightconeEquipment": "สวมใส่ Light Cone", - "lightconeSettings": "การตั้งค่า Light Cone", - "placeholderLevel": "ป้อนเลเวล", - "superimpositionRank": "ระดับการขัดเกลา", - "ranksNote": "ระดับที่สูงขึ้นให้เอฟเฟกต์ที่แข็งแกร่งกว่า", - "changeLightcone": "เปลี่ยน Light Cone", - "removeLightcone": "ถอด Light Cone", - "equipLightcone": "สวมใส่ Light Cone", - "noLightconeEquipped": "ไม่ได้สวมใส่ Light Cone", - "equipLightconeNote": "สวมใส่ Light Cone เพื่อเพิ่มพลัง", - "filter": "กรอง", - "selectedCharacters": "ตัวละครที่เลือก", - "selectedProfiles": "โปรไฟล์ที่เลือก", - "clearAll": "ล้างทั้งหมด", - "selectAll": "เลือกทั้งหมด", - "copy": "คัดลอก", - "copied": "คัดลอกแล้ว", - "noAvatarSelected": "ไม่ได้เลือกตัวละคร", - "noAvatarToCopySelected": "ไม่ได้เลือกตัวละครที่จะคัดลอก", - "pleaseSelectAtLeastOneProfile": "โปรดเลือกอย่างน้อยหนึ่งโปรไฟล์", - "pleaseEnterUid": "โปรดป้อน UID", - "failedToFetchEnkaData": "ไม่สามารถดึงข้อมูล Enka ได้", - "pleaseSelectAtLeastOneCharacter": "โปรดเลือกอย่างน้อยหนึ่งตัวละคร", - "noDataToImport": "ไม่มีข้อมูลที่จะนำเข้า", - "pleaseSelectAFile": "โปรดเลือกไฟล์", - "fileMustBeAValidJsonFile": "ไฟล์ต้องเป็นไฟล์ JSON ที่ถูกต้อง", - "importEnkaDataSuccess": "นำเข้าข้อมูล Enka สำเร็จ", - "importFreeSRDataSuccess": "นำเข้าข้อมูล FreeSR สำเร็จ", - "importDatabaseSuccess": "นำเข้าฐานข้อมูลสำเร็จ", - "getData": "รับข้อมูล", - "import": "นำเข้า", - "freeSRImport": "นำเข้า FreeSR", - "onlySupportFreeSRJsonFile": "รองรับเฉพาะไฟล์ JSON ของ FreeSR", - "pickAFile": "เลือกไฟล์", - "lightConeSetting": "การตั้งค่า Light Cone", - "relicMaker": "สร้างรีลิกส์", - "pleaseSelectAllOptions": "โปรดเลือกตัวเลือกทั้งหมด", - "relicSavedSuccessfully": "บันทึกรีลิกส์สำเร็จ", - "mainSettings": "การตั้งค่าหลัก", - "mainStat": "ค่าสเตตัสหลัก", - "set": "เซ็ต", - "pleaseSelectASet": "โปรดเลือกเซ็ต", - "effectBonus": "โบนัสเอฟเฟกต์", - "totalRoll": "จำนวนการอัปเกรด", - "randomizeStats": "สุ่มสเตตัส", - "randomizeRolls": "สุ่มอัปเกรด", - "selectASubStat": "เลือกสเตตัสรอง", - "selectASet": "เลือกเซ็ต", - "selectAMainStat": "เลือกสเตตัสหลัก", - "save": "บันทึก", - "reset": "รีเซ็ต", - "roll": "อัปเกรด", - "step": "ขั้น", - "memoryOfChaos": "Memory of Chaos", - "pureFiction": "Pure Fiction", - "apocalypticShadow": "Apocalyptic Shadow", - "customEnemy": "ศัตรูกำหนดเอง", - "simulatedUniverse": "Simulated Universe", - "floor": "ชั้น", - "side": "ฝั่ง", - "wave": "เวฟ", - "stage": "ด่าน", - "useCycleCount": "ใช้การนับรอบหรือไม่?", - "useTurbulenceBuff": "ใช้บัฟบรรยากาศหรือไม่?", - "firstHalfEnemies": "ศัตรูครึ่งแรก", - "secondHalfEnemies": "ศัตรูครึ่งหลัง", - "firstNodeEnemies": "ศัตรูโหนด 1", - "secondNodeEnemies": "ศัตรูโหนด 2", - "thirdNodeEnemies": "ศัตรูโหนด 3", - "firstNode": "โหนด 1", - "secondNode": "โหนด 2", - "thirdNode": "โหนด 3", - "listEnemies": "รายการศัตรู", - "turbulenceBuff": "บัฟบรรยากาศ", - "noEventSelected": "ไม่ได้เลือกอีเวนต์", - "noTurbulenceBuff": "ไม่มีบัฟบรรยากาศ", - "upper": "บน", - "lower": "ล่าง", - "upperToLower": "บน -> ล่าง", - "lowerToUpper": "ล่าง -> บน", - "selectMOCEvent": "เลือกอีเวนต์ MOC", - "selectPFEvent": "เลือกอีเวนต์ PF", - "selectASEvent": "เลือกอีเวนต์ AS", - "selectCEEvent": "เลือกอีเวนต์ CE", - "selectEvent": "เลือกอีเวนต์", - "selectFloor": "เลือกชั้น", - "selectSide": "เลือกฝั่ง", - "selectBuff": "เลือกบัฟ", - "selectStage": "เลือกด่าน", - "previous": "ก่อนหน้า", - "next": "ถัดไป", - "noMonstersFound": "ไม่พบมอนสเตอร์", - "addNewWave": "เพิ่มเวฟใหม่", - "searchStage": "ค้นหาด่าน...", - "noStageFound": "ไม่พบด่าน", - "searchMonster": "ค้นหามอนสเตอร์...", - "changeRelic": "เปลี่ยนรีลิกส์", - "deleteRelic": "ลบรีลิกส์", - "deleteRelicConfirm": "คุณแน่ใจหรือไม่ว่าต้องการลบรีลิกส์ในช่องนี้?", - "setEffects": "ตั้งค่าเอฟเฟกต์", - "details": "รายละเอียด", - "normal": "โจมตีปกติ", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "เครื่องมือ Firefly โดย Firefly Shelter" + }, + "DataPage": { + "skillType": "ประเภทสกิล", + "skillName": "ชื่อสกิล", + "character": "ตัวละคร", + "id": "ไอดี", + "path": "Path", + "rarity": "ระดับความหายาก", + "element": "ธาตุ", + "technique": "เทคนิค", + "talent": "พรสวรรค์", + "basic": "โจมตีปกติ", + "skill": "สกิลต่อสู้", + "ultimate": "ท่าไม้ตาย", + "servant": "ผู้ติดตาม", + "damage": "ความเสียหาย", + "type": "ประเภท", + "warrior": "ทำลายล้าง", + "knight": "อนุรักษ์", + "mage": "ปัญญา", + "priest": "เฟื่องฟู", + "rogue": "ล่าสังหาร", + "shaman": "ประสาน", + "warlock": "ลบล้าง", + "memory": "ลบล้าง", + "elation": "ปิติสุข", + "fire": "ไฟ", + "ice": "น้ำแข็ง", + "imaginary": "จินตภาพ", + "physical": "กายภาพ", + "quantum": "ควอนตัม", + "thunder": "สายฟ้า", + "wind": "ลม", + "hp": "HP", + "atk": "ATK", + "speed": "ความเร็ว", + "critRate": "อัตราคริติคอล", + "critDmg": "ความเสียหายคริติคอล", + "breakEffect": "เอฟเฟกต์ทำลายล้าง", + "effectRes": "ต้านทานสถานะ", + "energyRegenerationRate": "อัตราฟื้นฟูพลังงาน", + "effectHitRate": "อัตราสร้างสถานะ", + "outgoingHealingBoost": "โบนัสการรักษา", + "fireDmgBoost": "โบนัสความเสียหายไฟ", + "iceDmgBoost": "โบนัสความเสียหายน้ำแข็ง", + "imaginaryDmgBoost": "โบนัสความเสียหายจินตภาพ", + "physicalDmgBoost": "โบนัสความเสียหายกายภาพ", + "quantumDmgBoost": "โบนัสความเสียหายควอนตัม", + "thunderDmgBoost": "โบนัสความเสียหายสายฟ้า", + "windDmgBoost": "โบนัสความเสียหายลม", + "pursued": "ความเสียหายเพิ่มเติม", + "true damage": "ความเสียหายจริง", + "elationdamage": "ความเสียหายปิติสุข", + "follow-up": "ความเสียหายโจมตีต่อเนื่อง", + "elemental damage": "ความเสียหายทำลายล้างและซูเปอร์", + "dot": "ความเสียหายต่อเนื่อง", + "qte": "สกิล QTE", + "level": "เลเวล", + "relics": "รีลิกส์", + "eidolons": "Eidolon", + "lightcones": "Light Cone", + "loadData": "โหลดข้อมูล", + "exportData": "ส่งออกข้อมูล", + "connectSetting": "การตั้งค่าการเชื่อมต่อ", + "connected": "เชื่อมต่อแล้ว", + "unconnected": "ไม่ได้เชื่อมต่อ", + "psConnection": "การเชื่อมต่อ PS", + "connectionType": "ประเภทการเชื่อมต่อ", + "status": "สถานะ", + "connectPs": "เชื่อมต่อ PS", + "disconnect": "ยกเลิกการเชื่อมต่อ", + "other": "อื่นๆ", + "freeSr": "FreeSR", + "database": "ฐานข้อมูล", + "enka": "Enka", + "monsterSetting": "ตั้งค่ามอนสเตอร์", + "serverUrl": "URL เซิร์ฟเวอร์", + "privateType": "ประเภทเซิร์ฟเวอร์ส่วนตัว", + "local": "ในเครื่อง", + "server": "เซิร์ฟเวอร์", + "username": "ชื่อผู้ใช้", + "password": "รหัสผ่าน", + "placeholderServerUrl": "ป้อน URL เซิร์ฟเวอร์", + "placeholderUsername": "ป้อนชื่อผู้ใช้", + "placeholderPassword": "ป้อนรหัสผ่าน", + "connectedSuccess": "เชื่อมต่อกับ PS สำเร็จ", + "connectedFailed": "ล้มเหลวในการเชื่อมต่อกับ PS", + "syncSuccess": "ซิงค์ข้อมูลกับ PS สำเร็จ", + "syncFailed": "ล้มเหลวในการซิงค์ข้อมูลกับ PS", + "sync": "ซิงค์", + "importSetting": "การตั้งค่าการนำเข้า", + "profile": "โปรไฟล์", + "default": "ค่าเริ่มต้น", + "copyProfiles": "คัดลอกโปรไฟล์", + "addNewProfile": "เพิ่มโปรไฟล์ใหม่", + "createNewProfile": "สร้างโปรไฟล์ใหม่", + "editProfile": "แก้ไขโปรไฟล์", + "placeholderProfileName": "ป้อนชื่อโปรไฟล์", + "profileName": "ชื่อโปรไฟล์", + "create": "สร้าง", + "update": "อัปเดต", + "characterInformation": "ข้อมูลตัวละคร", + "skills": "สกิล", + "showcaseCard": "การ์ดแสดง", + "comingSoon": "เร็วๆ นี้", + "characterName": "ชื่อตัวละคร", + "placeholderCharacter": "ป้อนชื่อตัวละคร", + "characterSettings": "การตั้งค่าตัวละคร", + "levelConfiguration": "การกำหนดระดับเลเวล", + "characterLevel": "เลเวลตัวละคร", + "max": "สูงสุด", + "ultimateEnergy": "พลังงานท่าไม้ตาย", + "currentEnergy": "พลังงานปัจจุบัน", + "setTo50": "ตั้งค่าเป็น 50%", + "battleConfiguration": "การกำหนดค่าการต่อสู้", + "useTechnique": "ใช้เทคนิค", + "techniqueNote": "เปิดใช้เอฟเฟกต์เทคนิคก่อนการต่อสู้", + "enhancement": "การเสริมพลัง", + "enhancementLevel": "ระดับการเสริมพลัง", + "origin": "ดั้งเดิม", + "enhancedNote": "การเสริมพลังที่สูงขึ้นจะปลดล็อกความสามารถ", + "lightconeEquipment": "สวมใส่ Light Cone", + "lightconeSettings": "การตั้งค่า Light Cone", + "placeholderLevel": "ป้อนเลเวล", + "superimpositionRank": "ระดับการขัดเกลา", + "ranksNote": "ระดับที่สูงขึ้นให้เอฟเฟกต์ที่แข็งแกร่งกว่า", + "changeLightcone": "เปลี่ยน Light Cone", + "removeLightcone": "ถอด Light Cone", + "equipLightcone": "สวมใส่ Light Cone", + "noLightconeEquipped": "ไม่ได้สวมใส่ Light Cone", + "equipLightconeNote": "สวมใส่ Light Cone เพื่อเพิ่มพลัง", + "filter": "กรอง", + "selectedCharacters": "ตัวละครที่เลือก", + "selectedProfiles": "โปรไฟล์ที่เลือก", + "clearAll": "ล้างทั้งหมด", + "selectAll": "เลือกทั้งหมด", + "copy": "คัดลอก", + "copied": "คัดลอกแล้ว", + "noAvatarSelected": "ไม่ได้เลือกตัวละคร", + "noAvatarToCopySelected": "ไม่ได้เลือกตัวละครที่จะคัดลอก", + "pleaseSelectAtLeastOneProfile": "โปรดเลือกอย่างน้อยหนึ่งโปรไฟล์", + "pleaseEnterUid": "โปรดป้อน UID", + "failedToFetchEnkaData": "ไม่สามารถดึงข้อมูล Enka ได้", + "pleaseSelectAtLeastOneCharacter": "โปรดเลือกอย่างน้อยหนึ่งตัวละคร", + "noDataToImport": "ไม่มีข้อมูลที่จะนำเข้า", + "pleaseSelectAFile": "โปรดเลือกไฟล์", + "fileMustBeAValidJsonFile": "ไฟล์ต้องเป็นไฟล์ JSON ที่ถูกต้อง", + "importEnkaDataSuccess": "นำเข้าข้อมูล Enka สำเร็จ", + "importFreeSRDataSuccess": "นำเข้าข้อมูล FreeSR สำเร็จ", + "importDatabaseSuccess": "นำเข้าฐานข้อมูลสำเร็จ", + "getData": "รับข้อมูล", + "import": "นำเข้า", + "freeSRImport": "นำเข้า FreeSR", + "onlySupportFreeSRJsonFile": "รองรับเฉพาะไฟล์ JSON ของ FreeSR", + "pickAFile": "เลือกไฟล์", + "lightConeSetting": "การตั้งค่า Light Cone", + "relicMaker": "สร้างรีลิกส์", + "pleaseSelectAllOptions": "โปรดเลือกตัวเลือกทั้งหมด", + "relicSavedSuccessfully": "บันทึกรีลิกส์สำเร็จ", + "mainSettings": "การตั้งค่าหลัก", + "mainStat": "ค่าสเตตัสหลัก", + "set": "เซ็ต", + "pleaseSelectASet": "โปรดเลือกเซ็ต", + "effectBonus": "โบนัสเอฟเฟกต์", + "totalRoll": "จำนวนการอัปเกรด", + "randomizeStats": "สุ่มสเตตัส", + "randomizeRolls": "สุ่มอัปเกรด", + "selectASubStat": "เลือกสเตตัสรอง", + "selectASet": "เลือกเซ็ต", + "selectAMainStat": "เลือกสเตตัสหลัก", + "save": "บันทึก", + "reset": "รีเซ็ต", + "roll": "อัปเกรด", + "step": "ขั้น", + "memoryOfChaos": "Memory of Chaos", + "pureFiction": "Pure Fiction", + "apocalypticShadow": "Apocalyptic Shadow", + "customEnemy": "ศัตรูกำหนดเอง", + "simulatedUniverse": "Simulated Universe", + "floor": "ชั้น", + "side": "ฝั่ง", + "wave": "เวฟ", + "stage": "ด่าน", + "useCycleCount": "ใช้การนับรอบหรือไม่?", + "useTurbulenceBuff": "ใช้บัฟบรรยากาศหรือไม่?", + "firstHalfEnemies": "ศัตรูครึ่งแรก", + "secondHalfEnemies": "ศัตรูครึ่งหลัง", + "firstNodeEnemies": "ศัตรูโหนด 1", + "secondNodeEnemies": "ศัตรูโหนด 2", + "thirdNodeEnemies": "ศัตรูโหนด 3", + "firstNode": "โหนด 1", + "secondNode": "โหนด 2", + "thirdNode": "โหนด 3", + "listEnemies": "รายการศัตรู", + "turbulenceBuff": "บัฟบรรยากาศ", + "noEventSelected": "ไม่ได้เลือกอีเวนต์", + "noTurbulenceBuff": "ไม่มีบัฟบรรยากาศ", + "upper": "บน", + "lower": "ล่าง", + "upperToLower": "บน -> ล่าง", + "lowerToUpper": "ล่าง -> บน", + "selectMOCEvent": "เลือกอีเวนต์ MOC", + "selectPFEvent": "เลือกอีเวนต์ PF", + "selectASEvent": "เลือกอีเวนต์ AS", + "selectCEEvent": "เลือกอีเวนต์ CE", + "selectEvent": "เลือกอีเวนต์", + "selectFloor": "เลือกชั้น", + "selectSide": "เลือกฝั่ง", + "selectBuff": "เลือกบัฟ", + "selectStage": "เลือกด่าน", + "previous": "ก่อนหน้า", + "next": "ถัดไป", + "noMonstersFound": "ไม่พบมอนสเตอร์", + "addNewWave": "เพิ่มเวฟใหม่", + "searchStage": "ค้นหาด่าน...", + "noStageFound": "ไม่พบด่าน", + "searchMonster": "ค้นหามอนสเตอร์...", + "changeRelic": "เปลี่ยนรีลิกส์", + "deleteRelic": "ลบรีลิกส์", + "deleteRelicConfirm": "คุณแน่ใจหรือไม่ว่าต้องการลบรีลิกส์ในช่องนี้?", + "setEffects": "ตั้งค่าเอฟเฟกต์", + "details": "รายละเอียด", + "normal": "โจมตีปกติ", "bpskill": "สกิลต่อสู้", "maze": "เทคนิค", "ultra": "ท่าไม้ตาย", "assist": "สกิลช่วยเหลือ", "servantskill": "สกิล Memosprite", - "severaltalent": "พรสวรรค์ Memosprite", - "singleattack": "โจมตีเป้าหมายเดียว", - "enhance": "เสริมพลัง", - "summon": "อัญเชิญ", - "mazeattack": "โจมตีแบบเทคนิค", - "blast": "กระจาย", - "restore": "ฟื้นฟู", - "support": "สนับสนุน", - "aoeattack": "โจมตีหมู่", - "impair": "ป่วน", - "bounce": "ชิ่ง", - "active": "เปิดใช้งาน", - "defence": "ป้องกัน", - "inactive": "ปิดใช้งาน", - "maxAll": "อัปเกรดทั้งหมด", - "maxAllSuccess": "อัปเกรดสกิลถึงระดับสูงสุดสำเร็จ", - "maxAllFailed": "อัปเกรดสกิลล้มเหลว", - "noRelicEquipped": "ไม่ได้สวมใส่รีลิกส์", - "anomalyArbitration": "Anomaly Arbitration", - "normalMode": "โหมดปกติ", - "hardMode": "โหมดยาก", - "selectPEAKEvent": "เลือกอีเวนต์ PEAK", - "mode": "โหมด", - "selectMode": "เลือกโหมด", - "rollBack": "ย้อนกลับ", - "upRoll": "เพิ่มอัปเกรด", - "downRoll": "ลดอัปเกรด", - "actions": "แอ็กชัน", - "avatars": "อวตาร", - "quickView": "ดูแบบด่วน", - "extraSetting": "การตั้งค่าเพิ่มเติม", - "disableCensorship": "ปิดการเซ็นเซอร์", - "hideUI": "ซ่อน UI", - "theoryCraftMode": "โหมด Theorycraft", - "cycleCount": "จำนวนรอบ", - "pleaseSelectAllSubStats": "โปรดเลือกสเตตัสรองทั้งหมด", - "subStatRollCountCannotBeZero": "จำนวนการอัปเกรดสเตตัสรองต้องไม่เป็นศูนย์", - "theoryCraft": "Theorycraft", - "multipathCharacter": "ตัวละครหลาย Path", - "mainPath": "Path หลัก", - "march7Path": "Path March 7th", - "challenge": "ท้าทาย", - "skipNode": "ข้ามโหนด", - "disableSkip": "ปิดใช้งานการข้าม", - "skipNode1": "ข้ามโหนด 1", - "skipNode2": "ข้ามโหนด 2", - "extraFeatures": "คุณสมบัติพิเศษ", - "detailTheoryCraft": "การเปิดคุณสมบัตินี้จะช่วยให้คุณปรับแต่งจำนวนรอบและปรับ HP ของศัตรูได้", - "detailSkipNode": "ช่วยให้ข้าม (โหนด 1/โหนด 2) ใน Memory of Chaos หรือ Pure Fiction", - "detailChallengePeak": "อนุญาตให้เปลี่ยนฤดูกาล Peak ใน Anomaly ปัจจุบัน", - "detailHiddenUi": "ซ่อนอินเทอร์เฟซของเกม", - "detailDisableCensorship": "ปิดการเซ็นเซอร์ในเกม", - "detailMultipathCharacter": "อนุญาตให้เปลี่ยน Path ของตัวละครบางตัว", - "trailblazer": "ผู้บุกเบิก", - "listExtraEffect": "รายการเอฟเฟกต์พิเศษ", - "extra": "พิเศษ", - "customLineup": "จัดทีมแบบกำหนดเอง" - } + "severaltalent": "พรสวรรค์ Memosprite", + "singleattack": "โจมตีเป้าหมายเดียว", + "enhance": "เสริมพลัง", + "summon": "อัญเชิญ", + "mazeattack": "โจมตีแบบเทคนิค", + "blast": "กระจาย", + "restore": "ฟื้นฟู", + "support": "สนับสนุน", + "aoeattack": "โจมตีหมู่", + "impair": "ป่วน", + "bounce": "ชิ่ง", + "active": "เปิดใช้งาน", + "defence": "ป้องกัน", + "inactive": "ปิดใช้งาน", + "maxAll": "อัปเกรดทั้งหมด", + "maxAllSuccess": "อัปเกรดสกิลถึงระดับสูงสุดสำเร็จ", + "maxAllFailed": "อัปเกรดสกิลล้มเหลว", + "noRelicEquipped": "ไม่ได้สวมใส่รีลิกส์", + "anomalyArbitration": "Anomaly Arbitration", + "normalMode": "โหมดปกติ", + "hardMode": "โหมดยาก", + "selectPEAKEvent": "เลือกอีเวนต์ PEAK", + "mode": "โหมด", + "selectMode": "เลือกโหมด", + "rollBack": "ย้อนกลับ", + "upRoll": "เพิ่มอัปเกรด", + "downRoll": "ลดอัปเกรด", + "actions": "แอ็กชัน", + "avatars": "อวตาร", + "quickView": "ดูแบบด่วน", + "extraSetting": "การตั้งค่าเพิ่มเติม", + "disableCensorship": "ปิดการเซ็นเซอร์", + "hideUI": "ซ่อน UI", + "theoryCraftMode": "โหมด Theorycraft", + "cycleCount": "จำนวนรอบ", + "pleaseSelectAllSubStats": "โปรดเลือกสเตตัสรองทั้งหมด", + "subStatRollCountCannotBeZero": "จำนวนการอัปเกรดสเตตัสรองต้องไม่เป็นศูนย์", + "theoryCraft": "Theorycraft", + "multipathCharacter": "ตัวละครหลาย Path", + "mainPath": "Path หลัก", + "march7Path": "Path March 7th", + "challenge": "ท้าทาย", + "skipNode": "ข้ามโหนด", + "disableSkip": "ปิดใช้งานการข้าม", + "skipNode1": "ข้ามโหนด 1", + "skipNode2": "ข้ามโหนด 2", + "extraFeatures": "คุณสมบัติพิเศษ", + "detailTheoryCraft": "การเปิดคุณสมบัตินี้จะช่วยให้คุณปรับแต่งจำนวนรอบและปรับ HP ของศัตรูได้", + "detailSkipNode": "ช่วยให้ข้าม (โหนด 1/โหนด 2) ใน Memory of Chaos หรือ Pure Fiction", + "detailChallengePeak": "อนุญาตให้เปลี่ยนฤดูกาล Peak ใน Anomaly ปัจจุบัน", + "detailHiddenUi": "ซ่อนอินเทอร์เฟซของเกม", + "detailDisableCensorship": "ปิดการเซ็นเซอร์ในเกม", + "detailMultipathCharacter": "อนุญาตให้เปลี่ยน Path ของตัวละครบางตัว", + "trailblazer": "ผู้บุกเบิก", + "listExtraEffect": "รายการเอฟเฟกต์พิเศษ", + "extra": "พิเศษ", + "customLineup": "จัดทีมแบบกำหนดเอง", + "def": "DEF", + "language": "ภาษา" + } } diff --git a/messages/vi.json b/messages/vi.json index 04c282b..38c7eef 100644 --- a/messages/vi.json +++ b/messages/vi.json @@ -1,290 +1,292 @@ -{ - "TabTitle": { - "title": "Firefly Tools", - "description": "Firefly tools by Firefly Shelter" - }, - "DataPage": { - "skillType": "Loại kỹ năng", - "skillName": "Tên kỹ năng", - "character": "Nhân vật", - "id": "ID", - "path": "Vận mệnh", - "rarity": "Độ hiếm", - "element": "Nguyên tố", - "technique": "Bí kỹ", - "talent": "Thiên phú", - "basic": "Đánh thường", - "skill": "Kỹ năng", - "ultimate": "Tuyệt kỹ", - "servant": "Phụ trợ", - "damage": "Sát thương", - "type": "Loại", - "warrior": "Hủy Diệt", - "knight": "Bảo Hộ", - "mage": "Tri Thức", - "priest": "Trù phú", - "rogue": "Săn Bắn", - "shaman": "Hòa Hợp", - "warlock": "Hư Vô", - "memory": "Ký Ức", - "elation": "Vui vẻ", - "fire": "Hỏa", - "ice": "Băng", - "imaginary": "Ảo Ảnh", - "physical": "Vật Lý", - "quantum": "Lượng Tử", - "thunder": "Lôi", - "wind": "Phong", - "hp": "HP", - "atk": "Tấn công", - "speed": "Tốc độ", - "critRate": "Tỷ lệ bạo", - "critDmg": "ST bạo", - "breakEffect": "sát thương kích phá", - "effectRes": "Kháng hiệu ứng", - "energyRegenerationRate": "Tốc độ hồi năng lượng", - "effectHitRate": "Tỷ lệ trúng hiệu ứng", - "outgoingHealingBoost": "Tăng hồi phục", - "fireDmgBoost": "Tăng sát thương Hỏa", - "iceDmgBoost": "Tăng sát thương Băng", - "imaginaryDmgBoost": "Tăng sát thương Ảo Ảnh", - "physicalDmgBoost": "Tăng sát thương Vật Lý", - "quantumDmgBoost": "Tăng sát thương Lượng Tử", - "thunderDmgBoost": "Tăng sát thương Lôi", - "windDmgBoost": "Tăng sát thương Phong", - "pursued": "Sát thương thêm", - "true damage": "Sát thương chuẩn", - "elationdamage": "Sát thương vui vẻ", - "follow-up": "Sát thương phản kích", - "elemental damage": "Sát thương kích phá và siêu kích phá", - "dot": "Sát thương theo thời gian", - "qte": "Kỹ năng QTE", - "level": "Cấp độ", - "relics": "Thánh di vật", - "eidolons": "Tinh hồn", - "lightcones": "Nón ánh sáng", - "loadData": "Tải dữ liệu", - "exportData": "Xuất dữ liệu", - "connectSetting": "Cài đặt kết nối", - "connected": "Đã kết nối", - "unconnected": "Chưa kết nối", - "psConnection": "Kết nối PS", - "connectionType": "Loại kết nối", - "status": "Trạng thái", - "connectPs": "Kết nối PS", - "disconnect": "Ngắt kết nối", - "other": "Khác", - "freeSr": "FreeSR", - "database": "Database", - "enka": "Enka", - "monsterSetting": "Cài đặt quái", - "serverUrl": "Địa chỉ server", - "privateType": "Loại riêng tư", - "local": "Cục bộ", - "server": "Máy chủ", - "username": "Tên người dùng", - "password": "Mật khẩu", - "placeholderServerUrl": "Nhập địa chỉ server", - "placeholderUsername": "Nhập tên người dùng", - "placeholderPassword": "Nhập mật khẩu", - "connectedSuccess": "Kết nối PS thành công", - "connectedFailed": "Kết nối PS thất bại", - "syncSuccess": "Đồng bộ dữ liệu với PS thành công", - "syncFailed": "Đồng bộ dữ liệu với PS thất bại", - "sync": "Đồng bộ", - "importSetting": "Cài đặt nhập", - "profile": "Hồ sơ", - "default": "Mặc định", - "copyProfiles": "Sao chép hồ sơ", - "addNewProfile": "Thêm hồ sơ mới", - "createNewProfile": "Tạo hồ sơ mới", - "editProfile": "Chỉnh sửa hồ sơ", - "placeholderProfileName": "Nhập tên hồ sơ", - "profileName": "Tên hồ sơ", - "create": "Tạo", - "update": "Cập nhật", - "characterInformation": "Thông tin nhân vật", - "skills": "Kỹ năng", - "showcaseCard": "Thẻ trưng bày", - "comingSoon": "Sắp ra mắt", - "characterName": "Tên nhân vật", - "placeholderCharacter": "Nhập tên nhân vật", - "characterSettings": "Cài đặt nhân vật", - "levelConfiguration": "Cấu hình cấp độ", - "characterLevel": "Cấp độ nhân vật", - "max": "Tối đa", - "ultimateEnergy": "Năng lượng tuyệt kỹ", - "currentEnergy": "Năng lượng hiện tại", - "setTo50": "Đặt thành 50%", - "battleConfiguration": "Cấu hình trận đấu", - "useTechnique": "Dùng bí kỹ", - "techniqueNote": "Bật hiệu ứng bí kỹ trước trận", - "enhancement": "Cường hóa", - "enhancementLevel": "Cấp độ cường hóa", - "origin": "Nguyên gốc", - "enhancedNote": "Cường hóa cao mở thêm kỹ năng", - "lightconeEquipment": "Trang bị nón ánh sáng", - "lightconeSettings": "Cài đặt nón ánh sáng", - "placeholderLevel": "Nhập cấp độ", - "superimpositionRank": "Bậc chồng kỹ năng", - "ranksNote": "Bậc càng cao hiệu ứng càng mạnh", - "changeLightcone": "Thay đổi nón ánh sáng", - "removeLightcone": "Gỡ nón ánh sáng", - "equipLightcone": "Trang bị nón ánh sáng", - "noLightconeEquipped": "Chưa trang bị nón ánh sáng", - "equipLightconeNote": "Trang bị nón để tăng sức mạnh cho nhân vật", - "filter": "Lọc", - "selectedCharacters": "Nhân vật đã chọn", - "selectedProfiles": "Hồ sơ đã chọn", - "clearAll": "Xóa tất cả", - "selectAll": "Chọn tất cả", - "copy": "Sao chép", - "copied": "Đã sao chép", - "noAvatarSelected": "Chưa chọn nhân vật", - "noAvatarToCopySelected": "Chưa chọn nhân vật để sao chép", - "pleaseSelectAtLeastOneProfile": "Vui lòng chọn ít nhất một hồ sơ", - "pleaseEnterUid": "Vui lòng nhập UID", - "failedToFetchEnkaData": "Lấy dữ liệu Enka thất bại", - "pleaseSelectAtLeastOneCharacter": "Vui lòng chọn ít nhất một nhân vật", - "noDataToImport": "Không có dữ liệu để nhập", - "pleaseSelectAFile": "Vui lòng chọn một tệp", - "fileMustBeAValidJsonFile": "Tệp phải là tệp JSON hợp lệ", - "importEnkaDataSuccess": "Nhập dữ liệu Enka thành công", - "importFreeSRDataSuccess": "Nhập dữ liệu FreeSR thành công", - "importDatabaseSuccess": "Nhập cơ sở dữ liệu thành công", - "getData": "Lấy dữ liệu", - "import": "Nhập", - "freeSRImport": "Nhập FreeSR", - "onlySupportFreeSRJsonFile": "Chỉ hỗ trợ tệp JSON từ FreeSR", - "pickAFile": "Chọn tệp", - "lightConeSetting": "Cài đặt Nón Ánh Sáng", - "relicMaker": "Trình tạo Thánh Di Vật", - "pleaseSelectAllOptions": "Vui lòng chọn tất cả tùy chọn", - "relicSavedSuccessfully": "Lưu thánh di vật thành công", - "mainSettings": "Cài đặt chính", - "mainStat": "Chỉ số chính", - "set": "Bộ", - "pleaseSelectASet": "Vui lòng chọn một bộ", - "effectBonus": "Hiệu ứng cộng thêm", - "totalRoll": "Tổng số dòng", - "randomizeStats": "Ngẫu nhiên chỉ số", - "randomizeRolls": "Ngẫu nhiên số dòng", - "selectASubStat": "Chọn chỉ số phụ", - "selectASet": "Chọn một bộ", - "selectAMainStat": "Chọn chỉ số chính", - "save": "Lưu", - "reset": "Đặt lại toàn bộ", - "roll": "Số dòng", - "step": "Bước nhảy", - "memoryOfChaos": "Hồi ức hỗn độn", - "pureFiction": "Kể chuyện hư cấu", - "apocalypticShadow": "Ảo ảnh tận thế", - "customEnemy": "Kẻ địch tùy chỉnh", - "simulatedUniverse": "Vũ trụ mô phỏng", - "floor": "Tầng", - "side": "Nửa trận", - "wave": "Đợt", - "stage": "Màn", - "useCycleCount": "Dùng dếm chu kỳ?", - "useTurbulenceBuff": "Dùng buff hỗn loạn?", - "firstHalfEnemies": "Địch nửa đầu", - "secondHalfEnemies": "Địch nửa sau", - "firstNodeEnemies": "Địch Node 1", - "secondNodeEnemies": "Địch Node 2", - "thirdNodeEnemies": "Địch Node 3", - "firstNode": "Node 1", - "secondNode": "Node 2", - "thirdNode": "Node 3", - "turbulenceBuff": "Buff hỗn loạn", - "noEventSelected": "Không có sự kiện", - "noTurbulenceBuff": "Không có buff hỗn loạn", - "upper": "Nửa trên", - "lower": "Nửa dưới", - "upperToLower": "Nửa trên -> Nửa dưới", - "lowerToUpper": "Nửa dưới -> Nửa trên", - "selectMOCEvent": "Chọn sự kiện MOC", - "selectPFEvent": "Chọn sự kiện PF", - "selectASEvent": "Chọn sự kiện AS", - "selectCEEvent": "Chọn sự kiện CE", - "selectPEAKEvent": "Chọn sự kiện PEAK", - "selectEvent": "Chọn sự kiện", - "selectFloor": "Chọn tầng", - "selectSide": "Chọn nửa trận", - "selectBuff": "Chọn buff", - "selectStage": "Chọn màn", - "previous": "Trước", - "next": "Tiếp", - "noMonstersFound": "Không tìm thấy quái", - "addNewWave": "Thêm đợt mới", - "searchStage": "Tìm màn...", - "noStageFound": "Không tìm thấy màn", - "searchMonster": "Tìm quái...", - "changeRelic": "Thay đổi di vật", - "deleteRelic": "Xóa di vật", - "deleteRelicConfirm": "Bạn có chắc chắn muốn xóa di vật trong ô này không?", - "setEffects": "Thiết lập hiệu ứng", - "details": "Chi tiết", - "normal": "Đánh thường", +{ + "TabTitle": { + "title": "Firefly Tools", + "description": "Firefly tools by Firefly Shelter" + }, + "DataPage": { + "skillType": "Loại kỹ năng", + "skillName": "Tên kỹ năng", + "character": "Nhân vật", + "id": "ID", + "path": "Vận mệnh", + "rarity": "Độ hiếm", + "element": "Nguyên tố", + "technique": "Bí kỹ", + "talent": "Thiên phú", + "basic": "Đánh thường", + "skill": "Kỹ năng", + "ultimate": "Tuyệt kỹ", + "servant": "Phụ trợ", + "damage": "Sát thương", + "type": "Loại", + "warrior": "Hủy Diệt", + "knight": "Bảo Hộ", + "mage": "Tri Thức", + "priest": "Trù phú", + "rogue": "Săn Bắn", + "shaman": "Hòa Hợp", + "warlock": "Hư Vô", + "memory": "Ký Ức", + "elation": "Vui vẻ", + "fire": "Hỏa", + "ice": "Băng", + "imaginary": "Ảo Ảnh", + "physical": "Vật Lý", + "quantum": "Lượng Tử", + "thunder": "Lôi", + "wind": "Phong", + "hp": "HP", + "atk": "Tấn công", + "speed": "Tốc độ", + "critRate": "Tỷ lệ bạo", + "critDmg": "ST bạo", + "breakEffect": "sát thương kích phá", + "effectRes": "Kháng hiệu ứng", + "energyRegenerationRate": "Tốc độ hồi năng lượng", + "effectHitRate": "Tỷ lệ trúng hiệu ứng", + "outgoingHealingBoost": "Tăng hồi phục", + "fireDmgBoost": "Tăng sát thương Hỏa", + "iceDmgBoost": "Tăng sát thương Băng", + "imaginaryDmgBoost": "Tăng sát thương Ảo Ảnh", + "physicalDmgBoost": "Tăng sát thương Vật Lý", + "quantumDmgBoost": "Tăng sát thương Lượng Tử", + "thunderDmgBoost": "Tăng sát thương Lôi", + "windDmgBoost": "Tăng sát thương Phong", + "pursued": "Sát thương thêm", + "true damage": "Sát thương chuẩn", + "elationdamage": "Sát thương vui vẻ", + "follow-up": "Sát thương phản kích", + "elemental damage": "Sát thương kích phá và siêu kích phá", + "dot": "Sát thương theo thời gian", + "qte": "Kỹ năng QTE", + "level": "Cấp độ", + "relics": "Thánh di vật", + "eidolons": "Tinh hồn", + "lightcones": "Nón ánh sáng", + "loadData": "Tải dữ liệu", + "exportData": "Xuất dữ liệu", + "connectSetting": "Cài đặt kết nối", + "connected": "Đã kết nối", + "unconnected": "Chưa kết nối", + "psConnection": "Kết nối PS", + "connectionType": "Loại kết nối", + "status": "Trạng thái", + "connectPs": "Kết nối PS", + "disconnect": "Ngắt kết nối", + "other": "Khác", + "freeSr": "FreeSR", + "database": "Database", + "enka": "Enka", + "monsterSetting": "Cài đặt quái", + "serverUrl": "Địa chỉ server", + "privateType": "Loại riêng tư", + "local": "Cục bộ", + "server": "Máy chủ", + "username": "Tên người dùng", + "password": "Mật khẩu", + "placeholderServerUrl": "Nhập địa chỉ server", + "placeholderUsername": "Nhập tên người dùng", + "placeholderPassword": "Nhập mật khẩu", + "connectedSuccess": "Kết nối PS thành công", + "connectedFailed": "Kết nối PS thất bại", + "syncSuccess": "Đồng bộ dữ liệu với PS thành công", + "syncFailed": "Đồng bộ dữ liệu với PS thất bại", + "sync": "Đồng bộ", + "importSetting": "Cài đặt nhập", + "profile": "Hồ sơ", + "default": "Mặc định", + "copyProfiles": "Sao chép hồ sơ", + "addNewProfile": "Thêm hồ sơ mới", + "createNewProfile": "Tạo hồ sơ mới", + "editProfile": "Chỉnh sửa hồ sơ", + "placeholderProfileName": "Nhập tên hồ sơ", + "profileName": "Tên hồ sơ", + "create": "Tạo", + "update": "Cập nhật", + "characterInformation": "Thông tin nhân vật", + "skills": "Kỹ năng", + "showcaseCard": "Thẻ trưng bày", + "comingSoon": "Sắp ra mắt", + "characterName": "Tên nhân vật", + "placeholderCharacter": "Nhập tên nhân vật", + "characterSettings": "Cài đặt nhân vật", + "levelConfiguration": "Cấu hình cấp độ", + "characterLevel": "Cấp độ nhân vật", + "max": "Tối đa", + "ultimateEnergy": "Năng lượng tuyệt kỹ", + "currentEnergy": "Năng lượng hiện tại", + "setTo50": "Đặt thành 50%", + "battleConfiguration": "Cấu hình trận đấu", + "useTechnique": "Dùng bí kỹ", + "techniqueNote": "Bật hiệu ứng bí kỹ trước trận", + "enhancement": "Cường hóa", + "enhancementLevel": "Cấp độ cường hóa", + "origin": "Nguyên gốc", + "enhancedNote": "Cường hóa cao mở thêm kỹ năng", + "lightconeEquipment": "Trang bị nón ánh sáng", + "lightconeSettings": "Cài đặt nón ánh sáng", + "placeholderLevel": "Nhập cấp độ", + "superimpositionRank": "Tích tầng", + "ranksNote": "Bậc càng cao hiệu ứng càng mạnh", + "changeLightcone": "Thay đổi nón ánh sáng", + "removeLightcone": "Gỡ nón ánh sáng", + "equipLightcone": "Trang bị nón ánh sáng", + "noLightconeEquipped": "Chưa trang bị nón ánh sáng", + "equipLightconeNote": "Trang bị nón để tăng sức mạnh cho nhân vật", + "filter": "Lọc", + "selectedCharacters": "Nhân vật đã chọn", + "selectedProfiles": "Hồ sơ đã chọn", + "clearAll": "Xóa tất cả", + "selectAll": "Chọn tất cả", + "copy": "Sao chép", + "copied": "Đã sao chép", + "noAvatarSelected": "Chưa chọn nhân vật", + "noAvatarToCopySelected": "Chưa chọn nhân vật để sao chép", + "pleaseSelectAtLeastOneProfile": "Vui lòng chọn ít nhất một hồ sơ", + "pleaseEnterUid": "Vui lòng nhập UID", + "failedToFetchEnkaData": "Lấy dữ liệu Enka thất bại", + "pleaseSelectAtLeastOneCharacter": "Vui lòng chọn ít nhất một nhân vật", + "noDataToImport": "Không có dữ liệu để nhập", + "pleaseSelectAFile": "Vui lòng chọn một tệp", + "fileMustBeAValidJsonFile": "Tệp phải là tệp JSON hợp lệ", + "importEnkaDataSuccess": "Nhập dữ liệu Enka thành công", + "importFreeSRDataSuccess": "Nhập dữ liệu FreeSR thành công", + "importDatabaseSuccess": "Nhập cơ sở dữ liệu thành công", + "getData": "Lấy dữ liệu", + "import": "Nhập", + "freeSRImport": "Nhập FreeSR", + "onlySupportFreeSRJsonFile": "Chỉ hỗ trợ tệp JSON từ FreeSR", + "pickAFile": "Chọn tệp", + "lightConeSetting": "Cài đặt Nón Ánh Sáng", + "relicMaker": "Trình tạo Thánh Di Vật", + "pleaseSelectAllOptions": "Vui lòng chọn tất cả tùy chọn", + "relicSavedSuccessfully": "Lưu thánh di vật thành công", + "mainSettings": "Cài đặt chính", + "mainStat": "Chỉ số chính", + "set": "Bộ", + "pleaseSelectASet": "Vui lòng chọn một bộ", + "effectBonus": "Hiệu ứng cộng thêm", + "totalRoll": "Tổng số dòng", + "randomizeStats": "Ngẫu nhiên chỉ số", + "randomizeRolls": "Ngẫu nhiên số dòng", + "selectASubStat": "Chọn chỉ số phụ", + "selectASet": "Chọn một bộ", + "selectAMainStat": "Chọn chỉ số chính", + "save": "Lưu", + "reset": "Đặt lại toàn bộ", + "roll": "Số dòng", + "step": "Bước nhảy", + "memoryOfChaos": "Hồi ức hỗn độn", + "pureFiction": "Kể chuyện hư cấu", + "apocalypticShadow": "Ảo ảnh tận thế", + "customEnemy": "Kẻ địch tùy chỉnh", + "simulatedUniverse": "Vũ trụ mô phỏng", + "floor": "Tầng", + "side": "Nửa trận", + "wave": "Đợt", + "stage": "Màn", + "useCycleCount": "Dùng dếm chu kỳ?", + "useTurbulenceBuff": "Dùng buff hỗn loạn?", + "firstHalfEnemies": "Địch nửa đầu", + "secondHalfEnemies": "Địch nửa sau", + "firstNodeEnemies": "Địch Node 1", + "secondNodeEnemies": "Địch Node 2", + "thirdNodeEnemies": "Địch Node 3", + "firstNode": "Node 1", + "secondNode": "Node 2", + "thirdNode": "Node 3", + "turbulenceBuff": "Buff hỗn loạn", + "noEventSelected": "Không có sự kiện", + "noTurbulenceBuff": "Không có buff hỗn loạn", + "upper": "Nửa trên", + "lower": "Nửa dưới", + "upperToLower": "Nửa trên -> Nửa dưới", + "lowerToUpper": "Nửa dưới -> Nửa trên", + "selectMOCEvent": "Chọn sự kiện MOC", + "selectPFEvent": "Chọn sự kiện PF", + "selectASEvent": "Chọn sự kiện AS", + "selectCEEvent": "Chọn sự kiện CE", + "selectPEAKEvent": "Chọn sự kiện PEAK", + "selectEvent": "Chọn sự kiện", + "selectFloor": "Chọn tầng", + "selectSide": "Chọn nửa trận", + "selectBuff": "Chọn buff", + "selectStage": "Chọn màn", + "previous": "Trước", + "next": "Tiếp", + "noMonstersFound": "Không tìm thấy quái", + "addNewWave": "Thêm đợt mới", + "searchStage": "Tìm màn...", + "noStageFound": "Không tìm thấy màn", + "searchMonster": "Tìm quái...", + "changeRelic": "Thay đổi di vật", + "deleteRelic": "Xóa di vật", + "deleteRelicConfirm": "Bạn có chắc chắn muốn xóa di vật trong ô này không?", + "setEffects": "Thiết lập hiệu ứng", + "details": "Chi tiết", + "normal": "Đánh thường", "bpskill": "Chiến kỹ", "maze": "Bí kỹ", "ultra": "Tuyệt kỹ", "assist": "Kỹ năng hỗ trợ", "servantskill": "Kỹ năng vật triệu hồi", - "severaltalent": "Thiên phú vật triệu hồi", - "singleattack": "Tấn công đơn", - "enhance": "Cường hóa", - "summon": "Triệu hồi", - "blast": "Tấn công 3 mục tiêu", - "restore": "Hồi phục", - "support": "Hỗ trợ", - "aoeattack": "Tấn công đa mục tiêu", - "mazeattack": "Bí kỹ tấn công", - "impair": "Suy yếu", - "bounce": "Nảy bật", - "active": "Kích hoạt", - "inactive": "Không kích hoạt", - "defence": "Phòng thủ", - "maxAll": "Tối đa tất cả", - "maxAllSuccess": "Đã thiết lập cấp độ kỹ năng tối đa thành công.", - "maxAllFailed": "Thiết lập cấp độ kỹ năng tối đa thất bại.", - "noRelicEquipped": "Không có di vật", - "anomalyArbitration": "Trọng tài dị tướng", - "normalMode": "Chế độ thường", - "hardMode": "Chế độ khó", - "mode": "Chế độ", - "selectMode": "Chọn chế độ", - "rollBack": "Quay lại bước trước", - "upRoll": "Tăng dòng", - "downRoll": "Giảm dòng", - "actions": "Hành động", - "avatars": "Nhân vật", - "quickView": "Xem nhanh", - "extraSetting": "Cài đặt bổ sung", - "disableCensorship": "Tắt kiểm duyệt", - "hideUI": "Ẩn giao diện", - "theoryCraftMode": "Chế độ Theory Craft", - "cycleCount": "Số vòng", - "pleaseSelectAllSubStats": "Vui lòng chọn tất cả chỉ số phụ", - "subStatRollCountCannotBeZero": "Số dòng của chỉ số phụ không thể bằng 0", - "theoryCraft": "Theory Craft", - "multipathCharacter": "Nhân vật đa Vận Mệnh", - "mainPath": "Vận Mệnh Nhân Vật Chính", - "march7Path": "Vận Mệnh March 7", - "challenge": "Thử thách", - "skipNode": "Bỏ qua node", - "disableSkip": "Tắt bỏ qua", - "skipNode1": "Bỏ qua node 1", - "skipNode2": "Bỏ qua node 2", - "extraFeatures": "Tính năng bổ sung", - "detailTheoryCraft": "Khi bật tính năng này sẽ cho phép tùy chỉnh số cycle và trong mục kẻ địch tủy chỉnh sẽ cho phép điều chỉnh số hp.", - "detailSkipNode": "Khi bật tính năng này sẽ cho phép bỏ qua (node 1/node 2) của Hồi ức hỗn độn hoặc Kể chuyện hư cấu.", - "detailChallengePeak": "Cho phép thay đổi mùa Trọng tại dị tướng hiện tại.", - "detailHiddenUi": "Khi bật tính năng này sẽ ẩn giao diện của game.", - "detailDisableCensorship": "Khi bật tính năng này sẽ tắt kiểm duyệt của game.", - "detailMultipathCharacter": "Cho phép thay đổi Vận Mệnh của một vài nhân vật.", - "trailblazer": "Nhà khai phá", - "listExtraEffect": "Danh sách hiệu ứng bổ sung", - "extra": "Bổ sung", - "customLineup": "Đội hình tùy chỉnh" - } + "severaltalent": "Thiên phú vật triệu hồi", + "singleattack": "Tấn công đơn", + "enhance": "Cường hóa", + "summon": "Triệu hồi", + "blast": "Tấn công 3 mục tiêu", + "restore": "Hồi phục", + "support": "Hỗ trợ", + "aoeattack": "Tấn công đa mục tiêu", + "mazeattack": "Bí kỹ tấn công", + "impair": "Suy yếu", + "bounce": "Nảy bật", + "active": "Kích hoạt", + "inactive": "Không kích hoạt", + "defence": "Phòng thủ", + "maxAll": "Tối đa tất cả", + "maxAllSuccess": "Đã thiết lập cấp độ kỹ năng tối đa thành công.", + "maxAllFailed": "Thiết lập cấp độ kỹ năng tối đa thất bại.", + "noRelicEquipped": "Không có di vật", + "anomalyArbitration": "Trọng tài dị tướng", + "normalMode": "Chế độ thường", + "hardMode": "Chế độ khó", + "mode": "Chế độ", + "selectMode": "Chọn chế độ", + "rollBack": "Quay lại bước trước", + "upRoll": "Tăng dòng", + "downRoll": "Giảm dòng", + "actions": "Hành động", + "avatars": "Nhân vật", + "quickView": "Xem nhanh", + "extraSetting": "Cài đặt bổ sung", + "disableCensorship": "Tắt kiểm duyệt", + "hideUI": "Ẩn giao diện", + "theoryCraftMode": "Chế độ Theory Craft", + "cycleCount": "Số vòng", + "pleaseSelectAllSubStats": "Vui lòng chọn tất cả chỉ số phụ", + "subStatRollCountCannotBeZero": "Số dòng của chỉ số phụ không thể bằng 0", + "theoryCraft": "Theory Craft", + "multipathCharacter": "Nhân vật đa Vận Mệnh", + "mainPath": "Vận Mệnh Nhân Vật Chính", + "march7Path": "Vận Mệnh March 7", + "challenge": "Thử thách", + "skipNode": "Bỏ qua node", + "disableSkip": "Tắt bỏ qua", + "skipNode1": "Bỏ qua node 1", + "skipNode2": "Bỏ qua node 2", + "extraFeatures": "Tính năng bổ sung", + "detailTheoryCraft": "Khi bật tính năng này sẽ cho phép tùy chỉnh số cycle và trong mục kẻ địch tủy chỉnh sẽ cho phép điều chỉnh số hp.", + "detailSkipNode": "Khi bật tính năng này sẽ cho phép bỏ qua (node 1/node 2) của Hồi ức hỗn độn hoặc Kể chuyện hư cấu.", + "detailChallengePeak": "Cho phép thay đổi mùa Trọng tại dị tướng hiện tại.", + "detailHiddenUi": "Khi bật tính năng này sẽ ẩn giao diện của game.", + "detailDisableCensorship": "Khi bật tính năng này sẽ tắt kiểm duyệt của game.", + "detailMultipathCharacter": "Cho phép thay đổi Vận Mệnh của một vài nhân vật.", + "trailblazer": "Nhà khai phá", + "listExtraEffect": "Danh sách hiệu ứng bổ sung", + "extra": "Bổ sung", + "customLineup": "Đội hình tùy chỉnh", + "def": "Phòng thủ", + "language": "Ngôn ngữ" + } } diff --git a/messages/zh.json b/messages/zh.json index 078c1be..921c662 100644 --- a/messages/zh.json +++ b/messages/zh.json @@ -285,6 +285,8 @@ "trailblazer": "开拓者", "listExtraEffect": "额外效果列表", "extra": "额外", - "customLineup": "自定义阵容" + "customLineup": "自定义阵容", + "def": "防御力", + "language": "语言" } -} \ No newline at end of file +} diff --git a/package.json b/package.json index cb043d9..f132b69 100644 --- a/package.json +++ b/package.json @@ -10,15 +10,15 @@ }, "dependencies": { "@next/bundle-analyzer": "16.1.6", - "@tanstack/react-query": "^5.100.10", - "axios": "^1.16.1", + "@tanstack/react-query": "^5.102.5", + "axios": "^1.20.0", "fast-average-color": "^9.5.2", - "framer-motion": "^12.38.0", + "framer-motion": "^12.43.0", "html2canvas-pro": "^1.6.7", - "lru-cache": "^11.3.6", + "lru-cache": "^11.5.2", "lucide-react": "^0.563.0", "next": "16.1.6", - "next-intl": "^4.12.0", + "next-intl": "^4.13.7", "prismjs": "^1.30.0", "react": "19.2.4", "react-dom": "19.2.4", @@ -27,20 +27,20 @@ "react-toastify": "^11.1.0", "sharp": "^0.34.5", "zod": "^4.4.3", - "zustand": "^5.0.13" + "zustand": "^5.0.15" }, "devDependencies": { - "@tailwindcss/postcss": "^4.3.0", + "@tailwindcss/postcss": "^4.3.3", "@types/jest": "^30.0.0", - "@types/node": "^25.8.0", + "@types/node": "^25.9.5", "@types/react": "19.2.6", "@types/react-dom": "19.2.3", - "baseline-browser-mapping": "^2.10.29", - "daisyui": "^5.5.19", - "eslint": "^9.39.4", + "baseline-browser-mapping": "^2.11.19", + "daisyui": "^5.7.22", + "eslint": "^9.39.5", "eslint-config-next": "16.1.6", "tailwind-scrollbar": "^4.0.2", - "tailwindcss": "^4.3.0", + "tailwindcss": "^4.3.3", "ts-to-zod": "^5.1.0", "typescript": "^5.9.3" }, diff --git a/skills-lock.json b/skills-lock.json new file mode 100644 index 0000000..5720d85 --- /dev/null +++ b/skills-lock.json @@ -0,0 +1,125 @@ +{ + "version": 1, + "skills": { + "banner-design": { + "source": "nextlevelbuilder/ui-ux-pro-max-skill", + "sourceType": "github", + "skillPath": ".claude/skills/banner-design/SKILL.md", + "computedHash": "f859a951ded1109a38bcc7f18faf4581f9adbf0550df7a11c013e77a5b229541" + }, + "brand": { + "source": "nextlevelbuilder/ui-ux-pro-max-skill", + "sourceType": "github", + "skillPath": ".claude/skills/brand/SKILL.md", + "computedHash": "0e773774d46ecea78eff2b36f574e41830417fcc618181215611f336930deac2" + }, + "brandkit": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/brandkit/SKILL.md", + "computedHash": "735007879f5110aeae1e981a53fe74a12afde70347f9773dacd50e4697a091bf" + }, + "design": { + "source": "nextlevelbuilder/ui-ux-pro-max-skill", + "sourceType": "github", + "skillPath": ".claude/skills/design/SKILL.md", + "computedHash": "bb2e3ffee4b7b69e5a38ce08f6010ca79381d9f53b9dfadb33aee1ece6f1679a" + }, + "design-system": { + "source": "nextlevelbuilder/ui-ux-pro-max-skill", + "sourceType": "github", + "skillPath": ".claude/skills/design-system/SKILL.md", + "computedHash": "5a3dbae4a3c2ad9f96323d9bfae926b3c21bb1e3b066aa067906f577a2ff2545" + }, + "design-taste-frontend": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/taste-skill/SKILL.md", + "computedHash": "899b84384f74f540ea5284d9b2e9234e050998b42eacc805410b518d4226c0b3" + }, + "design-taste-frontend-v1": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/taste-skill-v1/SKILL.md", + "computedHash": "0a226c13d69639553cf8a7c40aa5527b026820f8ddaf7a6b263988e32ab44a27" + }, + "full-output-enforcement": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/output-skill/SKILL.md", + "computedHash": "524f7c7950c3fde726101613f630140411c7d080e63be718687f4b38f919be81" + }, + "gpt-taste": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/gpt-tasteskill/SKILL.md", + "computedHash": "7bd1bfdda0e51016ca222693401a65fc0dd9bf9487e0bd5b1740ba510f6f963a" + }, + "high-end-visual-design": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/soft-skill/SKILL.md", + "computedHash": "f730e4132775f13eea19e3dc39afc6bb453cfc0498872b127ad8f0d47cfd802d" + }, + "image-to-code": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/image-to-code-skill/SKILL.md", + "computedHash": "3d2ac14d956fdafc5500d2108b90895e134d847f9f199e7f1d18bf1f814cf7c8" + }, + "imagegen-frontend-mobile": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/imagegen-frontend-mobile/SKILL.md", + "computedHash": "7c1d1dc59cd0df4063b8621af543bf5dea1d576b261507e17b0323c69680b048" + }, + "imagegen-frontend-web": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/imagegen-frontend-web/SKILL.md", + "computedHash": "27255c7c50181e58add156b2aa2bd5325285b85f04027e4c8b73742d98d7be0a" + }, + "industrial-brutalist-ui": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/brutalist-skill/SKILL.md", + "computedHash": "e66e5a2a8b73cef79ab6546459c665e8b983645689c5f3772f7eed8b9f1e8e0e" + }, + "minimalist-ui": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/minimalist-skill/SKILL.md", + "computedHash": "7e88897e0371184e97a82b8d9ef080323c13f21eb067b58ef71eb05173a08ac2" + }, + "redesign-existing-projects": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/redesign-skill/SKILL.md", + "computedHash": "47eced3e960a2c961d3cbee11fa1216264f589344b586a5cbd03967cd6b9c54b" + }, + "slides": { + "source": "nextlevelbuilder/ui-ux-pro-max-skill", + "sourceType": "github", + "skillPath": ".claude/skills/slides/SKILL.md", + "computedHash": "a2b3559b58afc484548e1eb359e20495d11cf12b90da7c1fbba50efed9a70340" + }, + "stitch-design-taste": { + "source": "Leonxlnx/taste-skill", + "sourceType": "github", + "skillPath": "skills/stitch-skill/SKILL.md", + "computedHash": "c96b580192b34167efa01f460bbc669ff4315cf97f3cf6ff85ded8029aa720b8" + }, + "ui-styling": { + "source": "nextlevelbuilder/ui-ux-pro-max-skill", + "sourceType": "github", + "skillPath": ".claude/skills/ui-styling/SKILL.md", + "computedHash": "e10b225db04fdfd893fdda2b9ed893c315f9dee5693494743d57b02066e96a51" + }, + "ui-ux-pro-max": { + "source": "nextlevelbuilder/ui-ux-pro-max-skill", + "sourceType": "github", + "skillPath": ".claude/skills/ui-ux-pro-max/SKILL.md", + "computedHash": "d1de8ff8d228cd4204bf06eb959ef4317d5b927908d9f42765971e33e80c8a7e" + } + } +} diff --git a/src/app/api/data/[name]/route.ts b/src/app/api/data/[name]/route.ts index 25ee82a..c8b7583 100644 --- a/src/app/api/data/[name]/route.ts +++ b/src/app/api/data/[name]/route.ts @@ -1,25 +1,25 @@ -import { getDataCache } from "@/lib/cache/cache" - -export async function GET( - req: Request, - { params }: { params: Promise<{ name: string }> } -) { - const { name } = await params - - const item = getDataCache(name) - - if (!item) { - return new Response("Not found", { status: 404 }) - } - - const headers: Record = { - "Content-Type": "application/json", - "Cache-Control": "public, max-age=3600" - } - - if (item.type === "br") { - headers["Content-Encoding"] = "br" - } - - return new Response(new Uint8Array(item.buf), { headers }) +import { getDataCache } from "@/lib/cache/cache" + +export async function GET( + req: Request, + { params }: { params: Promise<{ name: string }> } +) { + const { name } = await params + + const item = getDataCache(name) + + if (!item) { + return new Response("Not found", { status: 404 }) + } + + const headers: Record = { + "Content-Type": "application/json", + "Cache-Control": "public, max-age=3600" + } + + if (item.type === "br") { + headers["Content-Encoding"] = "br" + } + + return new Response(new Uint8Array(item.buf), { headers }) } \ No newline at end of file diff --git a/src/app/api/proxy/route.ts b/src/app/api/proxy/route.ts index 82c8939..585fe7d 100644 --- a/src/app/api/proxy/route.ts +++ b/src/app/api/proxy/route.ts @@ -1,79 +1,79 @@ import { NextRequest, NextResponse } from 'next/server' import axios from 'axios' import net from 'net' - -function isPrivateHost(hostname: string): boolean { - if ( - hostname === 'localhost' || - hostname.startsWith('127.') || - hostname.startsWith('10.') || - hostname.startsWith('192.168.') || - /^172\.(1[6-9]|2[0-9]|3[0-1])\./.test(hostname) - ) { - return true - } - - if (net.isIP(hostname)) { - return true - } - - return false -} - -export async function GET(req: NextRequest) { - try { - const { searchParams } = new URL(req.url) - const targetUrl = searchParams.get("url") - if (!targetUrl) { - return NextResponse.json({ error: "Missing url" }, { status: 400 }) - } - - const response = await fetch(targetUrl) - - if (!response.ok) { - return NextResponse.json({ error: "Failed to fetch image" }, { status: 500 }) - } - - const buffer = await response.arrayBuffer() - - return new NextResponse(buffer, { - headers: { - "Content-Type": response.headers.get("content-type") || "image/png", - "Cache-Control": "public, max-age=3600", - "Access-Control-Allow-Origin": "*", - }, - }) - } catch (e: unknown) { - return NextResponse.json({ error: (e as Error)?.message }, { status: 500 }) - } -} - - + +function isPrivateHost(hostname: string): boolean { + if ( + hostname === 'localhost' || + hostname.startsWith('127.') || + hostname.startsWith('10.') || + hostname.startsWith('192.168.') || + /^172\.(1[6-9]|2[0-9]|3[0-1])\./.test(hostname) + ) { + return true + } + + if (net.isIP(hostname)) { + return true + } + + return false +} + +export async function GET(req: NextRequest) { + try { + const { searchParams } = new URL(req.url) + const targetUrl = searchParams.get("url") + if (!targetUrl) { + return NextResponse.json({ error: "Missing url" }, { status: 400 }) + } + + const response = await fetch(targetUrl) + + if (!response.ok) { + return NextResponse.json({ error: "Failed to fetch image" }, { status: 500 }) + } + + const buffer = await response.arrayBuffer() + + return new NextResponse(buffer, { + headers: { + "Content-Type": response.headers.get("content-type") || "image/png", + "Cache-Control": "public, max-age=3600", + "Access-Control-Allow-Origin": "*", + }, + }) + } catch (e: unknown) { + return NextResponse.json({ error: (e as Error)?.message }, { status: 500 }) + } +} + + export async function POST(request: NextRequest) { try { const body = await request.json() - const { serverUrl, method, ...payload } = body - - if (!serverUrl) { - return NextResponse.json({ error: 'Missing serverUrl' }, { status: 400 }) - } - if (!method) { - return NextResponse.json({ error: 'Missing method' }, { status: 400 }) - } - - let url = serverUrl.trim() - if (!url.startsWith('http://') && !url.startsWith('https://')) { - url = `http://${url}` - } - - const parsed = new URL(url) - if (isPrivateHost(parsed.hostname)) { - return NextResponse.json( - { error: `Connection to private/internal address (${parsed.hostname}) is not allowed` }, - { status: 403 } - ) - } - + const { serverUrl, method, ...payload } = body + + if (!serverUrl) { + return NextResponse.json({ error: 'Missing serverUrl' }, { status: 400 }) + } + if (!method) { + return NextResponse.json({ error: 'Missing method' }, { status: 400 }) + } + + let url = serverUrl.trim() + if (!url.startsWith('http://') && !url.startsWith('https://')) { + url = `http://${url}` + } + + const parsed = new URL(url) + if (isPrivateHost(parsed.hostname)) { + return NextResponse.json( + { error: `Connection to private/internal address (${parsed.hostname}) is not allowed` }, + { status: 403 } + ) + } + let response switch (method.toUpperCase()) { diff --git a/src/app/eidolons-info/page.tsx b/src/app/eidolons-info/page.tsx index 21a4853..0b6e428 100644 --- a/src/app/eidolons-info/page.tsx +++ b/src/app/eidolons-info/page.tsx @@ -1,9 +1,9 @@ -"use client" -import EidolonsInfo from "@/components/eidolonsInfo"; -export default function EidolonsInfoPage() { - return ( -
- -
- ); -} +"use client" +import EidolonsInfo from "@/components/eidolonsInfo"; +export default function EidolonsInfoPage() { + return ( +
+ +
+ ); +} diff --git a/src/app/globals.css b/src/app/globals.css index e8aa33e..0097948 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -1,6 +1,5 @@ @import "tailwindcss"; - @plugin "daisyui" { exclude: properties; themes: winter --default, night --prefersdark, cupcake, coffee; @@ -9,19 +8,19 @@ @tailwind utilities; @plugin 'tailwind-scrollbar' { - nocompatible: true; + nocompatible: true; } - :root { --size-big: 4vw; --size-medium: 3vw; --size-small: 2vw; } +/* Smooth Modern Ultra-Sleek Scrollbars */ ::-webkit-scrollbar { - width: 6px; - height: 6px; + width: 4px; + height: 4px; } ::-webkit-scrollbar-track { @@ -29,10 +28,83 @@ } ::-webkit-scrollbar-thumb { - background-color: #9ca3af; - border-radius: 0; + background: rgba(156, 163, 175, 0.28); + border-radius: 9999px; + transition: background-color 0.2s ease; +} + +::-webkit-scrollbar-thumb:hover { + background: rgba(156, 163, 175, 0.55); } ::-webkit-scrollbar-button { - display: none; + display: none; } + +/* Custom UI Utilities for Gaming Companion Aesthetic */ +@layer utilities { + .glass-card { + background-color: var(--color-base-100); + border: 1px solid color-mix(in srgb, var(--color-base-content) 10%, transparent); + box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.05); + } + + .glass-panel { + background-color: var(--color-base-100); + border: 1px solid color-mix(in srgb, var(--color-base-content) 10%, transparent); + } + + .hover-lift { + transition: transform 0.25s cubic-bezier(0.16, 1, 0.3, 1), box-shadow 0.25s cubic-bezier(0.16, 1, 0.3, 1), border-color 0.25s ease; + } + .hover-lift:hover { + transform: translateY(-2px); + } + + .active-press { + transition: transform 0.15s cubic-bezier(0.16, 1, 0.3, 1); + } + .active-press:active { + transform: scale(0.97); + } + + /* Rarity Glow Effects */ + .glow-5star { + box-shadow: 0 0 16px -2px rgba(245, 158, 11, 0.35); + } + + .glow-4star { + box-shadow: 0 0 16px -2px rgba(168, 85, 247, 0.35); + } + + /* Ambient Background - Clean Canvas */ + .bg-ambient-mesh { + background-color: var(--color-base-100); + } + + /* Theme Adaptive Path & Stat Icon Filters - High Accessibility Contrast */ + .theme-path-icon { + filter: brightness(0.2) opacity(0.85); + } + [data-theme="night"] .theme-path-icon, + [data-theme="coffee"] .theme-path-icon { + filter: brightness(0.8) opacity(0.85); + } + .theme-path-icon-active { + filter: brightness(0); + } + [data-theme="night"] .theme-path-icon-active, + [data-theme="coffee"] .theme-path-icon-active { + filter: brightness(1); + } + + /* Stat icons (HSR raw sprite icons are white pngs, need dark filter on light themes) */ + .theme-stat-icon { + filter: brightness(0.15) opacity(0.8); + } + [data-theme="night"] .theme-stat-icon, + [data-theme="coffee"] .theme-stat-icon { + filter: brightness(0.95) opacity(1); + } +} + diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 7afc695..1ba9395 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -64,9 +64,9 @@ export default async function RootLayout({ const locale = await getLocale() return ( - + @@ -74,17 +74,19 @@ export default async function RootLayout({ -
+
-
-
+
+
-
+ +
- {children} -
-
+
+ {children} +
+ +
diff --git a/src/app/relics-info/page.tsx b/src/app/relics-info/page.tsx index fb72df6..29b63e5 100644 --- a/src/app/relics-info/page.tsx +++ b/src/app/relics-info/page.tsx @@ -1,11 +1,11 @@ -"use client"; - -import RelicsInfo from "@/components/relicsInfo"; - -export default function RelicsInfoPage() { - return ( -
- -
- ); -} +"use client"; + +import RelicsInfo from "@/components/relicsInfo"; + +export default function RelicsInfoPage() { + return ( +
+ +
+ ); +} diff --git a/src/app/showcase-card/page.tsx b/src/app/showcase-card/page.tsx index 1a26b14..06cb75f 100644 --- a/src/app/showcase-card/page.tsx +++ b/src/app/showcase-card/page.tsx @@ -1,11 +1,11 @@ -"use client" - -import ShowCaseInfo from "@/components/showcaseCard" - -export default function ShowcaseCard() { - return ( -
- -
- ) -} +"use client" + +import ShowCaseInfo from "@/components/showcaseCard" + +export default function ShowcaseCard() { + return ( +
+ +
+ ) +} diff --git a/src/app/skills-info/page.tsx b/src/app/skills-info/page.tsx index 9d1d415..fbcb679 100644 --- a/src/app/skills-info/page.tsx +++ b/src/app/skills-info/page.tsx @@ -1,11 +1,11 @@ -"use client"; - -import SkillsInfo from "@/components/skillsInfo"; - -export default function SkillsInfoPage() { - return ( -
- -
- ); -} +"use client"; + +import SkillsInfo from "@/components/skillsInfo"; + +export default function SkillsInfoPage() { + return ( +
+ +
+ ); +} diff --git a/src/components/actionBar/index.tsx b/src/components/actionBar/index.tsx index 48df368..54de547 100644 --- a/src/components/actionBar/index.tsx +++ b/src/components/actionBar/index.tsx @@ -1,445 +1,510 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -"use client"; - -import { useTranslations } from "next-intl"; -import Image from "next/image"; -import { useRouter } from 'next/navigation' -import ParseText from "../parseText"; -import useLocaleStore from "@/stores/localeStore"; -import { getNameChar } from "@/helper/getName"; -import { useEffect, useMemo, useState } from "react"; -import { motion } from "framer-motion"; -import useModelStore from "@/stores/modelStore"; -import useUserDataStore from "@/stores/userDataStore"; -import { ModalConfig, RelicStore } from "@/types"; -import { toast } from "react-toastify"; -import useGlobalStore from "@/stores/globalStore"; -import { connectToPS, syncDataToPS } from "@/helper"; -import CopyImport from "../importBar/copy"; -import useCopyProfileStore from "@/stores/copyProfile"; -import AvatarBar from "../avatarBar"; -import useCurrentDataStore from "@/stores/currentDataStore"; -import useDetailDataStore from "@/stores/detailDataStore"; - -export default function ActionBar() { - const router = useRouter() - const { avatarSelected } = useCurrentDataStore() - const { damageType, baseType } = useDetailDataStore() - const { setResetData } = useCopyProfileStore() - const transI18n = useTranslations("DataPage") - const { locale } = useLocaleStore() - const { - isOpenCreateProfile, - setIsOpenCreateProfile, - isOpenCopy, - setIsOpenCopy, - isOpenAvatars, - setIsOpenAvatars - } = useModelStore() - const { avatars, setAvatar } = useUserDataStore() - const [profileName, setProfileName] = useState(""); - const [formState, setFormState] = useState("EDIT"); - const [profileEdit, setProfileEdit] = useState(-1); - const { isConnectPS } = useGlobalStore() - - const profileCurrent = useMemo(() => { - if (!avatarSelected) return null; - const avatar = avatars[avatarSelected.ID]; - return avatar?.profileList[avatar.profileSelect] || null; - }, [avatarSelected, avatars]); - - const listProfile = useMemo(() => { - if (!avatarSelected) return []; - const avatar = avatars[avatarSelected.ID]; - return avatar?.profileList || []; - }, [avatarSelected, avatars]); - - - const handleUpdateProfile = () => { - if (!profileName.trim()) return; - if (formState === "CREATE" && avatarSelected && avatars[avatarSelected.ID]) { - const newListProfile = [...listProfile] - const newProfile = { - profile_name: profileName, - lightcone: null, - relics: {} as Record - } - newListProfile.push(newProfile) - setAvatar({ ...avatars[avatarSelected.ID], profileList: newListProfile, profileSelect: newListProfile.length - 1 }) - toast.success("Profile created successfully") - } else if (formState === "EDIT" && profileCurrent && avatarSelected && profileEdit !== -1) { - const newListProfile = [...listProfile] - newListProfile[profileEdit].profile_name = profileName; - setAvatar({ ...avatars[avatarSelected.ID], profileList: newListProfile }) - toast.success("Profile updated successfully") - } - handleCloseModal("update_profile_modal"); - }; - - - const handleShow = (modalId: string) => { - const modal = document.getElementById(modalId) as HTMLDialogElement | null; - if (modal) { - modal.showModal(); - } - }; - - // Close modal handler - const handleCloseModal = (modalId: string) => { - const modal = document.getElementById(modalId) as HTMLDialogElement | null; - if (modal) { - modal.close(); - } - }; - - - const actionMove = (path: string) => { - router.push(`/${path}`) - } - - const handleProfileSelect = (profileId: number) => { - if (!avatarSelected) return; - if (avatars[avatarSelected.ID].profileSelect === profileId) return; - setAvatar({ ...avatars[avatarSelected.ID], profileSelect: profileId }) - toast.success(`Profile changed to Profile: ${avatars[avatarSelected.ID].profileList[profileId].profile_name}`) - } - - const handleDeleteProfile = (profileId: number, e: React.MouseEvent) => { - e.stopPropagation() - if (!avatarSelected || profileId == 0) return; - if (window.confirm(`Are you sure you want to delete profile: ${avatars[avatarSelected.ID].profileList[profileId].profile_name}?`)) { - const newListProfile = [...listProfile] - newListProfile.splice(profileId, 1) - setAvatar({ ...avatars[avatarSelected.ID], profileList: newListProfile, profileSelect: profileId - 1 }) - toast.success(`Profile ${avatars[avatarSelected.ID].profileList[profileId].profile_name} deleted successfully`) - } - - } - - const handleConnectOrSyncPS = async () => { - if (isConnectPS) { - const res = await syncDataToPS() - if (res.success) { - toast.success(transI18n("syncSuccess")) - } else { - toast.error(`${transI18n("syncFailed")}: ${res.message}`) - } - } else { - const res = await connectToPS() - if (res.success) { - toast.success(transI18n("connectedSuccess")) - } else { - toast.error(`${transI18n("connectedFailed")}: ${res.message}`) - } - } - } - - const modalConfigs: ModalConfig[] = [ - { - id: "update_profile_modal", - title: formState === "CREATE" ? transI18n("createNewProfile") : transI18n("editProfile"), - isOpen: isOpenCreateProfile, - onClose: () => { - setIsOpenCreateProfile(false) - handleCloseModal("update_profile_modal") - }, - content: ( -
-
- - setProfileName(e.target.value)} - /> -
-
- -
-
- ) - }, - { - id: "copy_profile_modal", - title: transI18n("copyProfiles").toUpperCase(), - isOpen: isOpenCopy, - onClose: () => { - setIsOpenCopy(false) - handleCloseModal("copy_profile_modal") - }, - content: - }, - { - id: "avatars_modal", - title: transI18n("avatars").toUpperCase(), - isOpen: isOpenAvatars, - onClose: () => { - setIsOpenAvatars(false) - handleCloseModal("avatars_modal") - }, - content: { setIsOpenAvatars(false); handleCloseModal("avatars_modal") }} /> - } - ] - - // Handle ESC key to close modal - useEffect(() => { - for (const item of modalConfigs) { - if (!item?.isOpen) { - handleCloseModal(item?.id || "") - } - } - const handleEscKey = (event: KeyboardEvent) => { - if (event.key === 'Escape') { - for (const item of modalConfigs) { - handleCloseModal(item?.id || "") - } - } - }; - - window.addEventListener('keydown', handleEscKey); - return () => window.removeEventListener('keydown', handleEscKey); - }, [isOpenCopy, isOpenCreateProfile, isOpenAvatars]); - - - - return ( -
-
- -
-
-
- {avatarSelected && ( -
- {'damage -

- {transI18n(avatarSelected.BaseType.toLowerCase())} -

-
{" / "}
- -
{`(${avatarSelected.ID})`}
-
- )} -
- -
- -
- {transI18n("profile")}: -
-
- - {profileCurrent?.profile_name} - - - - -
- -
    - {listProfile.map((profile, index) => ( -
  • - - {index !== 0 && ( - <> - - - - )} -
  • - ))} - -
  • - - -
  • -
-
-
- -
- -
    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -
-
-
- -
-
- -
- - - - - - -
- - {modalConfigs.map(({ id, title, onClose, content }) => ( - -
-
- - ✕ - -
-
-

- {title} -

-
- {content} -
-
- ))} - - -
-
- ); +/* eslint-disable react-hooks/exhaustive-deps */ +"use client"; + +import { useTranslations } from "next-intl"; +import Image from "next/image"; +import { usePathname, useRouter } from 'next/navigation' +import ParseText from "../parseText"; +import useLocaleStore from "@/stores/localeStore"; +import { getNameChar } from "@/helper/getName"; +import { useEffect, useMemo, useState } from "react"; +import useModelStore from "@/stores/modelStore"; +import useUserDataStore from "@/stores/userDataStore"; +import { ModalConfig, RelicStore, AvatarProfileStore } from "@/types"; +import { toast } from "react-toastify"; +import useGlobalStore from "@/stores/globalStore"; +import { connectToPS, syncDataToPS } from "@/helper"; +import CopyImport from "../importBar/copy"; +import useCopyProfileStore from "@/stores/copyProfile"; +import AvatarBar from "../avatarBar"; +import useCurrentDataStore from "@/stores/currentDataStore"; +import useDetailDataStore from "@/stores/detailDataStore"; +import { useShallow } from "zustand/react/shallow"; +import { User, Shield, Sparkles, Zap, Image as ImageIcon, RefreshCw, Plus, Copy, Edit2, Trash2 } from "lucide-react"; + +export default function ActionBar() { + const router = useRouter() + const pathname = usePathname() + const { avatarSelected } = useCurrentDataStore( + useShallow((state) => ({ avatarSelected: state.avatarSelected })) + ) + const { damageType, baseType } = useDetailDataStore( + useShallow((state) => ({ + damageType: state.damageType, + baseType: state.baseType, + })) + ) + const { setResetData } = useCopyProfileStore( + useShallow((state) => ({ setResetData: state.setResetData })) + ) + const transI18n = useTranslations("DataPage") + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ) + const { + isOpenCreateProfile, + setIsOpenCreateProfile, + isOpenCopy, + setIsOpenCopy, + isOpenAvatars, + setIsOpenAvatars + } = useModelStore( + useShallow((state) => ({ + isOpenCreateProfile: state.isOpenCreateProfile, + setIsOpenCreateProfile: state.setIsOpenCreateProfile, + isOpenCopy: state.isOpenCopy, + setIsOpenCopy: state.setIsOpenCopy, + isOpenAvatars: state.isOpenAvatars, + setIsOpenAvatars: state.setIsOpenAvatars, + })) + ) + const { avatars, setAvatar } = useUserDataStore( + useShallow((state) => ({ + avatars: state.avatars, + setAvatar: state.setAvatar, + })) + ) + const [profileName, setProfileName] = useState(""); + const [formState, setFormState] = useState("EDIT"); + const [profileEdit, setProfileEdit] = useState(-1); + const { isConnectPS } = useGlobalStore( + useShallow((state) => ({ isConnectPS: state.isConnectPS })) + ) + + const profileCurrent = useMemo(() => { + if (!avatarSelected) return null; + const avatar = avatars[avatarSelected.ID]; + return avatar?.profileList?.[avatar?.profileSelect] ?? avatar?.profileList?.[0] ?? null; + }, [avatarSelected, avatars]); + + const listProfile = useMemo(() => { + if (!avatarSelected) return []; + const avatar = avatars[avatarSelected.ID]; + return avatar?.profileList || []; + }, [avatarSelected, avatars]); + + const handleUpdateProfile = () => { + if (!profileName.trim()) return; + if (formState === "CREATE" && avatarSelected && avatars[avatarSelected.ID]) { + const newProfile: AvatarProfileStore = { + profile_name: profileName, + lightcone: null, + relics: {} as Record + }; + const newListProfile = [...listProfile, newProfile]; + setAvatar({ ...avatars[avatarSelected.ID], profileList: newListProfile, profileSelect: newListProfile.length - 1 }) + toast.success("Profile created successfully") + } else if (formState === "EDIT" && profileCurrent && avatarSelected && profileEdit !== -1) { + const newListProfile = listProfile.map((p, idx) => + idx === profileEdit ? { ...p, profile_name: profileName } : p + ); + setAvatar({ ...avatars[avatarSelected.ID], profileList: newListProfile }) + toast.success("Profile updated successfully") + } + handleCloseModal("update_profile_modal"); + }; + + const handleShow = (modalId: string) => { + const modal = document.getElementById(modalId) as HTMLDialogElement | null; + if (modal) { + modal.showModal(); + } + }; + + // Close modal handler + const handleCloseModal = (modalId: string) => { + const modal = document.getElementById(modalId) as HTMLDialogElement | null; + if (modal) { + modal.close(); + } + }; + + const actionMove = (path: string) => { + router.push(`/${path}`) + } + + const handleProfileSelect = (profileId: number) => { + if (!avatarSelected || !avatars[avatarSelected.ID]) return; + if (avatars[avatarSelected.ID].profileSelect === profileId) return; + setAvatar({ ...avatars[avatarSelected.ID], profileSelect: profileId }) + const selectedProfile = avatars[avatarSelected.ID].profileList?.[profileId]; + if (selectedProfile) { + toast.success(`Profile changed to: ${selectedProfile.profile_name}`) + } + } + + const handleDeleteProfile = (profileId: number, e: React.MouseEvent) => { + e.stopPropagation() + if (!avatarSelected || profileId === 0 || !avatars[avatarSelected.ID]) return; + const targetProfile = avatars[avatarSelected.ID].profileList?.[profileId]; + if (!targetProfile) return; + if (window.confirm(`Are you sure you want to delete profile: ${targetProfile.profile_name}?`)) { + const currentSelect = avatars[avatarSelected.ID].profileSelect; + const newListProfile = listProfile.filter((_, idx) => idx !== profileId); + const nextSelect = currentSelect >= profileId ? Math.max(0, currentSelect - 1) : currentSelect; + setAvatar({ ...avatars[avatarSelected.ID], profileList: newListProfile, profileSelect: nextSelect }) + toast.success(`Profile ${targetProfile.profile_name} deleted successfully`) + } + } + + const handleConnectOrSyncPS = async () => { + if (isConnectPS) { + const res = await syncDataToPS() + if (res.success) { + toast.success(transI18n("syncSuccess")) + } else { + toast.error(`${transI18n("syncFailed")}: ${res.message}`) + } + } else { + const res = await connectToPS() + if (res.success) { + toast.success(transI18n("connectedSuccess")) + } else { + toast.error(`${transI18n("connectedFailed")}: ${res.message}`) + } + } + } + + const modalConfigs: ModalConfig[] = [ + { + id: "update_profile_modal", + title: formState === "CREATE" ? transI18n("createNewProfile") : transI18n("editProfile"), + isOpen: isOpenCreateProfile, + onClose: () => { + setIsOpenCreateProfile(false) + handleCloseModal("update_profile_modal") + }, + content: ( +
+
+ + setProfileName(e.target.value)} + autoFocus + /> +
+
+ + +
+
+ ) + }, + { + id: "copy_profile_modal", + title: transI18n("copyProfiles"), + isOpen: isOpenCopy, + onClose: () => { + setIsOpenCopy(false) + handleCloseModal("copy_profile_modal") + }, + content: + }, + { + id: "avatars_modal", + title: transI18n("avatars"), + isOpen: isOpenAvatars, + onClose: () => { + setIsOpenAvatars(false) + handleCloseModal("avatars_modal") + }, + content: { setIsOpenAvatars(false); handleCloseModal("avatars_modal") }} /> + } + ] + + // Handle ESC key to close modal + useEffect(() => { + for (const item of modalConfigs) { + if (!item?.isOpen) { + handleCloseModal(item?.id || "") + } + } + const handleEscKey = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + for (const item of modalConfigs) { + handleCloseModal(item?.id || "") + } + } + }; + + window.addEventListener('keydown', handleEscKey); + return () => window.removeEventListener('keydown', handleEscKey); + }, [isOpenCopy, isOpenCreateProfile, isOpenAvatars]); + + const navTabs = [ + { label: transI18n("characterInformation"), path: "", icon: User }, + { label: transI18n("relics"), path: "relics-info", icon: Shield }, + { label: transI18n("eidolons"), path: "eidolons-info", icon: Sparkles }, + { label: transI18n("skills"), path: "skills-info", icon: Zap }, + { label: transI18n("showcaseCard"), path: "showcase-card", icon: ImageIcon }, + ]; + + const currentActivePath = pathname?.replace(/^\//, '') || ""; + + return ( +
+ {/* Top Row: Character Identity + Profile Selector + Connect PS */} +
+ {/* Character Identity */} + {avatarSelected && ( +
+ damage type + {transI18n(avatarSelected.BaseType.toLowerCase())} + / + + #{avatarSelected.ID} +
+ )} + + {/* Profile Selector & Quick Actions */} +
+
+
+ {transI18n("profile")}: + + {profileCurrent?.profile_name || "Default Profile"} + + + + +
+ +
    + {listProfile.map((profile, index) => ( +
  • + + {index !== 0 && ( +
    + + +
    + )} +
  • + ))} + +
  • + +
  • +
  • + +
  • +
+
+ + {/* Quick Profile Actions */} +
+ + +
+
+ + {/* Desktop Connect PS Button */} +
+ +
+
+ + {/* Mobile-Only Action Row (< 640px): [Avatars Button] & [Actions Dropdown] */} +
+ + +
+ +
    + {navTabs.map((tab) => { + const Icon = tab.icon; + return ( +
  • + +
  • + ); + })} +
  • + +
  • +
+
+
+ + {/* Navigation Tabs Row (>= 640px) */} +
+
+ {navTabs.map((tab) => { + const isActive = currentActivePath === tab.path; + const Icon = tab.icon; + return ( + + ); + })} +
+
+ + {/* Modals */} + {modalConfigs.map(({ id, title, onClose, content }) => ( + +
+
+

+ {title} +

+ +
+
+ {content} +
+
+
+ +
+
+ ))} +
+ ); } \ No newline at end of file diff --git a/src/components/avatarBar/index.tsx b/src/components/avatarBar/index.tsx index 6cfb4b3..6e6e8f4 100644 --- a/src/components/avatarBar/index.tsx +++ b/src/components/avatarBar/index.tsx @@ -1,140 +1,199 @@ -"use client" -import Image from "next/image" -import { useMemo } from "react" -import CharacterCard from "../card/characterCard" -import useLocaleStore from "@/stores/localeStore" -import { useTranslations } from "next-intl" -import useDetailDataStore from "@/stores/detailDataStore" -import useCurrentDataStore from '@/stores/currentDataStore'; -import { calcRarity, getNameChar } from "@/helper" - -export default function AvatarBar({ onClose }: { onClose?: () => void }) { - const { - avatarSearch, - mapAvatarElementActive, - mapAvatarPathActive, - setAvatarSearch, - setAvatarSelected, - setMapAvatarElementActive, - setMapAvatarPathActive, - setSkillIDSelected, - } = useCurrentDataStore() - const { mapAvatar, baseType, damageType } = useDetailDataStore() - const transI18n = useTranslations("DataPage") - const {locale} = useLocaleStore() - - const listAvatar = useMemo(() => { - if (!mapAvatar || !locale || !transI18n) return [] - - let list = Object.values(mapAvatar) - - if (avatarSearch) { - list = list.filter(item => - getNameChar(locale, transI18n, item) - .toLowerCase() - .includes(avatarSearch.toLowerCase()) - ) - } - - const allElementFalse = !Object.values(mapAvatarElementActive).some(v => v) - const allPathFalse = !Object.values(mapAvatarPathActive).some(v => v) - - list = list.filter(item => - (allElementFalse || mapAvatarElementActive[item.DamageType]) && - (allPathFalse || mapAvatarPathActive[item.BaseType]) - ) - - list.sort((a, b) => { - const r = calcRarity(b.Rarity) - calcRarity(a.Rarity) - if (r !== 0) return r - return b.ID - a.ID - }) - - return list - }, [mapAvatar, mapAvatarElementActive, mapAvatarPathActive, avatarSearch, locale, transI18n]) - - - return ( -
-
-
-
-
-
- setAvatarSearch(e.target.value)} - /> -
-
- {Object.entries(damageType).filter(([key]) => key !== "").map(([key, value]) => ( -
{ - setMapAvatarElementActive({ ...mapAvatarElementActive, [key]: !mapAvatarElementActive[key] }) - }} - className="hover:bg-gray-600 grid items-center justify-items-center cursor-pointer rounded-md shadow-lg" - style={{ - backgroundColor: mapAvatarElementActive[key] ? "#374151" : "#6B7280" - }}> - {key} -
- ))} -
- -
- {Object.entries(baseType).filter(([key]) => key !== "").map(([key, value]) => ( -
{ - setMapAvatarPathActive({ ...mapAvatarPathActive, [key]: !mapAvatarPathActive[key] }) - }} - className="hover:bg-gray-600 grid items-center justify-items-center rounded-md shadow-lg cursor-pointer" - style={{ - backgroundColor: mapAvatarPathActive[key] ? "#374151" : "#6B7280" - }} - > - - {key} -
- ))} - -
-
- -
-
    - {listAvatar.map((item, index) => ( -
    { - setAvatarSelected(item); - setSkillIDSelected(null) - if (onClose) onClose() - }}> - -
    - ))} -
-
-
- -
-
-
- ) -} +"use client" +import Image from "next/image" +import { useMemo } from "react" +import CharacterCard from "../card/characterCard" +import useLocaleStore from "@/stores/localeStore" +import { useTranslations } from "next-intl" +import useDetailDataStore from "@/stores/detailDataStore" +import useCurrentDataStore from '@/stores/currentDataStore'; +import { calcRarity, getNameChar } from "@/helper" +import { useShallow } from "zustand/react/shallow"; +import { Search, X } from "lucide-react" + +export default function AvatarBar({ onClose }: { onClose?: () => void }) { + const { + avatarSearch, + mapAvatarElementActive, + mapAvatarPathActive, + setAvatarSearch, + setAvatarSelected, + setMapAvatarElementActive, + setMapAvatarPathActive, + setSkillIDSelected, + } = useCurrentDataStore( + useShallow((state) => ({ + avatarSearch: state.avatarSearch, + mapAvatarElementActive: state.mapAvatarElementActive, + mapAvatarPathActive: state.mapAvatarPathActive, + setAvatarSearch: state.setAvatarSearch, + setAvatarSelected: state.setAvatarSelected, + setMapAvatarElementActive: state.setMapAvatarElementActive, + setMapAvatarPathActive: state.setMapAvatarPathActive, + setSkillIDSelected: state.setSkillIDSelected, + })) + ) + const { mapAvatar, baseType, damageType } = useDetailDataStore( + useShallow((state) => ({ + mapAvatar: state.mapAvatar, + baseType: state.baseType, + damageType: state.damageType, + })) + ) + const transI18n = useTranslations("DataPage") + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ) + + const listAvatar = useMemo(() => { + if (!mapAvatar || !locale || !transI18n) return [] + + let list = Object.values(mapAvatar) + + if (avatarSearch) { + list = list.filter(item => + getNameChar(locale, transI18n, item) + .toLowerCase() + .includes(avatarSearch.toLowerCase()) + ) + } + + const allElementFalse = !Object.values(mapAvatarElementActive).some(v => v) + const allPathFalse = !Object.values(mapAvatarPathActive).some(v => v) + + list = list.filter(item => + (allElementFalse || mapAvatarElementActive[item.DamageType]) && + (allPathFalse || mapAvatarPathActive[item.BaseType]) + ) + + list.sort((a, b) => { + const r = calcRarity(b.Rarity) - calcRarity(a.Rarity) + if (r !== 0) return r + return b.ID - a.ID + }) + + return list + }, [mapAvatar, mapAvatarElementActive, mapAvatarPathActive, avatarSearch, locale, transI18n]) + + return ( +
+ {/* Compact Search Bar */} + + + {/* Compact Filter Section */} +
+ {/* Element Filters - 7 Elements on 1 Row (gap-0.5) */} +
+ {Object.entries(damageType).filter(([key]) => key !== "").map(([key, value]) => { + const isActive = !!mapAvatarElementActive[key]; + return ( + + ); + })} +
+ + {/* Path Filters - 9 Paths on 1 Row (gap-0.5) */} +
+ {Object.entries(baseType).filter(([key]) => key !== "").map(([key, value]) => { + const isActive = !!mapAvatarPathActive[key]; + return ( + + ); + })} +
+
+ + {/* Character Count & Grid List */} +
+ + + {transI18n("character")} + + + {listAvatar.length} + +
+ +
+
    + {listAvatar.map((item) => ( +
    { + setAvatarSelected(item); + setSkillIDSelected(null) + if (onClose) onClose() + }} + > + +
    + ))} +
+
+
+ ) +} diff --git a/src/components/avatarInfo/index.tsx b/src/components/avatarInfo/index.tsx index 68e2ddd..a5097fe 100644 --- a/src/components/avatarInfo/index.tsx +++ b/src/components/avatarInfo/index.tsx @@ -1,529 +1,475 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -"use client" - -import useUserDataStore from "@/stores/userDataStore"; -import { useEffect, useMemo } from "react"; -import { motion } from "framer-motion"; -import LightconeBar from '../lightconeBar' -import { calcPromotion, calcRarity, replaceByParam } from '@/helper'; -import { getSkillTree } from '@/helper/getSkillTree'; -import { useTranslations } from 'next-intl'; -import ParseText from '../parseText'; -import useLocaleStore from '@/stores/localeStore'; -import useModelStore from '@/stores/modelStore'; -import Image from 'next/image'; -import useCurrentDataStore from "@/stores/currentDataStore"; -import useDetailDataStore from "@/stores/detailDataStore"; -import { getLocaleName } from "@/helper/getName"; -export default function AvatarInfo() { - const { avatarSelected, setResetDataLightcone } = useCurrentDataStore() - const { avatars, setAvatars, setAvatar } = useUserDataStore() - const { isOpenLightcone, setIsOpenLightcone } = useModelStore() - const { mapLightCone, baseType } = useDetailDataStore() - const transI18n = useTranslations("DataPage") - const { locale } = useLocaleStore(); - - const lightcone = useMemo(() => { - if (!avatarSelected) return null; - const avatar = avatars[avatarSelected.ID]; - return avatar?.profileList[avatar.profileSelect]?.lightcone || null; - }, [avatarSelected, avatars]); - - const lightconeDetail = useMemo(() => { - if (!mapLightCone || !lightcone?.item_id) return null; - return mapLightCone?.[lightcone.item_id.toString()] || null; - }, [lightcone, mapLightCone]); - - const handleShow = (modalId: string) => { - const modal = document.getElementById(modalId) as HTMLDialogElement | null; - if (modal) { - setIsOpenLightcone(true); - modal.showModal(); - } - }; - - // Close modal handler - const handleCloseModal = (modalId: string) => { - setIsOpenLightcone(false); - const modal = document.getElementById(modalId) as HTMLDialogElement | null; - if (modal) { - modal.close(); - } - }; - - // Handle ESC key to close modal - useEffect(() => { - if (!isOpenLightcone) { - handleCloseModal("action_detail_modal"); - return; - } - - const handleEscKey = (event: KeyboardEvent) => { - if (event.key === 'Escape' && isOpenLightcone) { - handleCloseModal("action_detail_modal"); - } - }; - - window.addEventListener('keydown', handleEscKey); - - return () => window.removeEventListener('keydown', handleEscKey); - }, [isOpenLightcone]); - - return ( -
- {avatarSelected && avatars[avatarSelected?.ID.toString() || ""] && ( -
-
-
-
-
- {/* Header */} -
-

-
- {transI18n("characterSettings")} -

-
- -
- {/* Level Control */} -
-

-
- {transI18n("levelConfiguration")} -

- -
- -
- { - const newLevel = Math.min(80, Math.max(1, parseInt(e.target.value) || 1)); - - setAvatars({ ...avatars, [avatarSelected?.ID.toString() || ""]: { ...avatars[avatarSelected?.ID.toString() || ""], level: newLevel, promotion: calcPromotion(newLevel) } }); - }} - className="input input-bordered w-full pr-16 font-mono" - placeholder={transI18n("placeholderLevel")} - /> -
{ - setAvatars({ ...avatars, [avatarSelected?.ID.toString() || ""]: { ...avatars[avatarSelected?.ID.toString() || ""], level: 80, promotion: calcPromotion(80) } }); - }} - className="absolute right-3 top-1/2 -translate-y-1/2 text-base-content/60 cursor-pointer"> - {transI18n("max")} -
-
-
- { - const newLevel = Math.min(80, Math.max(1, parseInt(e.target.value) || 1)); - setAvatars({ ...avatars, [avatarSelected?.ID.toString() || ""]: { ...avatars[avatarSelected?.ID.toString() || ""], level: newLevel, promotion: calcPromotion(newLevel) } }); - }} - className="range range-info range-sm w-full" - /> -
-
-
- - {/* Energy Control */} -
-

-
- {transI18n("ultimateEnergy")} -

- -
- - { - if (!avatars[avatarSelected?.ID.toString() || ""]?.can_change_sp) return - const newSpValue = Math.min(avatars[avatarSelected?.ID.toString() || ""]?.sp_max, Math.max(0, parseInt(e.target.value) || 0)); - setAvatars({ ...avatars, [avatarSelected?.ID.toString() || ""]: { ...avatars[avatarSelected?.ID.toString() || ""], sp_value: newSpValue } }); - }} - className="range range-warning range-sm w-full" - /> -
- 0% - {((avatars[avatarSelected?.ID.toString() || ""]?.sp_value / avatars[avatarSelected?.ID.toString() || ""]?.sp_max) * 100).toFixed(1)}% - 100% -
-
- -
-
-
- - {/* Technique Toggle */} -
-

-
- {transI18n("battleConfiguration")} -

- -
- -
- {transI18n("techniqueNote")} -
-
-
- - {/* Enhancement Selection */} - {avatarSelected?.Enhanced && ( -
-

- - - - {transI18n("enhancement")} -

- -
- - -
- {transI18n("enhancedNote")} -
-
-
- )} -
-
-
- -
-
-
-
-
-
- {/* Header */} -
-

-
- {transI18n("lightconeEquipment")} -

-
- - {lightcone && lightconeDetail ? ( -
-
- {/* Level & Rank Controls */} -
-

-
- {transI18n("lightconeSettings")} -

- -
- {/* Level Input */} -
- -
- { - const newLightconeLevel = Math.min(80, Math.max(1, parseInt(e.target.value) || 1)) - const newLightcone = { ...lightcone, level: newLightconeLevel, promotion: calcPromotion(newLightconeLevel) } - const newAvatar = { ...avatars[avatarSelected.ID] } - newAvatar.profileList[newAvatar.profileSelect].lightcone = newLightcone - setAvatar(newAvatar) - }} - className="input input-bordered w-full pr-16 font-mono" - placeholder={transI18n("placeholderLevel")} - /> -
{ - const newLightcone = { ...lightcone, level: 80, promotion: calcPromotion(80) } - const newAvatar = { ...avatars[avatarSelected.ID] } - newAvatar.profileList[newAvatar.profileSelect].lightcone = newLightcone - setAvatar(newAvatar) - }} - className="absolute right-3 top-1/2 -translate-y-1/2 text-base-content/60 cursor-pointer"> - {transI18n("max")} -
-
-
- { - const newLightconeLevel = Math.min(80, Math.max(1, parseInt(e.target.value) || 1)) - const newLightcone = { ...lightcone, level: newLightconeLevel, promotion: calcPromotion(newLightconeLevel) } - const newAvatar = { ...avatars[avatarSelected.ID] } - newAvatar.profileList[newAvatar.profileSelect].lightcone = newLightcone - setAvatar(newAvatar) - }} - className="range range-primary range-sm" - /> -
-
- - {/* Rank Selection */} -
- {/* Header */} -
- {transI18n("superimpositionRank")} - S{lightcone.rank} -
- - {/* Rank Buttons */} -
-
- {[1, 2, 3, 4, 5].map((r) => ( - - ))} -
-
- - {/* Help Text */} -
- {transI18n("ranksNote")} -
-
-
-
- - {/* Action Buttons */} -
- - -
-
- - {/* Lightcone Image */} -
-
- Lightcone -
-
- - {/* Lightcone Info & Controls */} -
- {/* Basic Info */} - {lightconeDetail && ( -
-
-

- -

-
- {transI18n(lightconeDetail.BaseType.toLowerCase())} -
-
- {calcRarity(lightconeDetail.Rarity) + "⭐"} -
-
- {"id: " + lightcone.item_id} -
-
- -
-
-
-
- )} - - -
-
- ) : ( - /* No Lightcone Equipped State */ -
-
handleShow("action_detail_modal")} - className="w-24 h-24 mx-auto mb-6 bg-base-300 rounded-full flex items-center justify-center cursor-pointer" - > - - - -
-

{transI18n("noLightconeEquipped")}

-

{transI18n("equipLightconeNote")}

- -
- )} -
-
-
-
-
- )} - - -
-
- handleCloseModal("action_detail_modal")} - > - ✕ - -
- -
- -
-
- - ); -} +/* eslint-disable react-hooks/exhaustive-deps */ +"use client" + +import useUserDataStore from "@/stores/userDataStore"; +import { useEffect, useMemo } from "react"; +import LightconeBar from '../lightconeBar' +import { calcPromotion, calcRarity, replaceByParam } from '@/helper'; +import { getSkillTree } from '@/helper/getSkillTree'; +import { useTranslations } from 'next-intl'; +import ParseText from '../parseText'; +import useLocaleStore from '@/stores/localeStore'; +import useModelStore from '@/stores/modelStore'; +import Image from 'next/image'; +import useCurrentDataStore from "@/stores/currentDataStore"; +import useDetailDataStore from "@/stores/detailDataStore"; +import { getLocaleName } from "@/helper/getName"; +import { useShallow } from "zustand/react/shallow"; + +export default function AvatarInfo() { + const { avatarSelected, setResetDataLightcone } = useCurrentDataStore( + useShallow((state) => ({ + avatarSelected: state.avatarSelected, + setResetDataLightcone: state.setResetDataLightcone, + })) + ) + const { avatars, setAvatars, setAvatar } = useUserDataStore( + useShallow((state) => ({ + avatars: state.avatars, + setAvatars: state.setAvatars, + setAvatar: state.setAvatar, + })) + ) + const { isOpenLightcone, setIsOpenLightcone } = useModelStore( + useShallow((state) => ({ + isOpenLightcone: state.isOpenLightcone, + setIsOpenLightcone: state.setIsOpenLightcone, + })) + ) + const { mapLightCone, baseType } = useDetailDataStore( + useShallow((state) => ({ + mapLightCone: state.mapLightCone, + baseType: state.baseType, + })) + ) + const transI18n = useTranslations("DataPage") + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ); + + const lightcone = useMemo(() => { + if (!avatarSelected) return null; + const avatar = avatars[avatarSelected.ID]; + return avatar?.profileList?.[avatar?.profileSelect]?.lightcone ?? avatar?.profileList?.[0]?.lightcone ?? null; + }, [avatarSelected, avatars]); + + const handleUpdateLightcone = (updater: (lc: typeof lightcone) => typeof lightcone) => { + if (!avatarSelected || !avatars[avatarSelected.ID]) return; + const avatar = avatars[avatarSelected.ID]; + const profileIndex = avatar.profileSelect; + const currentProfile = avatar.profileList?.[profileIndex]; + if (!currentProfile) return; + const newProfileList = [...avatar.profileList]; + newProfileList[profileIndex] = { + ...currentProfile, + lightcone: updater(currentProfile.lightcone), + }; + setAvatar({ + ...avatar, + profileList: newProfileList, + }); + }; + + const lightconeDetail = useMemo(() => { + if (!mapLightCone || !lightcone?.item_id) return null; + return mapLightCone?.[lightcone.item_id.toString()] || null; + }, [lightcone, mapLightCone]); + + const handleShow = (modalId: string) => { + const modal = document.getElementById(modalId) as HTMLDialogElement | null; + if (modal) { + setIsOpenLightcone(true); + modal.showModal(); + } + }; + + // Close modal handler + const handleCloseModal = (modalId: string) => { + setIsOpenLightcone(false); + const modal = document.getElementById(modalId) as HTMLDialogElement | null; + if (modal) { + modal.close(); + } + }; + + // Handle ESC key to close modal + useEffect(() => { + if (!isOpenLightcone) { + handleCloseModal("action_detail_modal"); + return; + } + + const handleEscKey = (event: KeyboardEvent) => { + if (event.key === 'Escape' && isOpenLightcone) { + handleCloseModal("action_detail_modal"); + } + }; + + window.addEventListener('keydown', handleEscKey); + + return () => window.removeEventListener('keydown', handleEscKey); + }, [isOpenLightcone]); + + return ( +
+ {avatarSelected && avatars[avatarSelected?.ID.toString() || ""] && ( +
+ {/* Left Column: Character Configuration */} +
+
+ {/* Card Header */} +
+

+
+ + {transI18n("characterSettings")} + +

+ + ID: #{avatarSelected.ID} + +
+ +
+ {/* Level Control */} +
+
+ + + {transI18n("characterLevel")} + + + {avatars[avatarSelected?.ID.toString() || ""]?.level} / 80 + +
+ +
+ { + const newLevel = Math.min(80, Math.max(1, parseInt(e.target.value) || 1)); + setAvatars({ ...avatars, [avatarSelected?.ID.toString() || ""]: { ...avatars[avatarSelected?.ID.toString() || ""], level: newLevel, promotion: calcPromotion(newLevel) } }); + }} + className="range range-primary range-sm flex-1" + /> + +
+
+ + {/* Ultimate Energy Control */} +
+
+ + + {transI18n("ultimateEnergy")} + +
+ + {Math.round(avatars[avatarSelected?.ID.toString() || ""]?.sp_value)} / {avatars[avatarSelected?.ID.toString() || ""]?.sp_max} + + + ({((avatars[avatarSelected?.ID.toString() || ""]?.sp_value / avatars[avatarSelected?.ID.toString() || ""]?.sp_max) * 100).toFixed(0)}%) + +
+
+ +
+ { + if (!avatars[avatarSelected?.ID.toString() || ""]?.can_change_sp) return + const newSpValue = Math.min(avatars[avatarSelected?.ID.toString() || ""]?.sp_max, Math.max(0, parseInt(e.target.value) || 0)); + setAvatars({ ...avatars, [avatarSelected?.ID.toString() || ""]: { ...avatars[avatarSelected?.ID.toString() || ""], sp_value: newSpValue } }); + }} + className="range range-warning range-sm flex-1" + /> + +
+
+ + {/* Technique Toggle */} +
+
+ + + {transI18n("useTechnique")} + +

{transI18n("techniqueNote")}

+
+ 0} + onChange={(e) => { + if (!avatarSelected || avatarSelected?.MazeBuff?.length == 0) return + const techniques = e.target.checked ? avatarSelected?.MazeBuff : []; + const newAvatar = { ...avatars[avatarSelected?.ID.toString() || ""], techniques: techniques }; + setAvatar(newAvatar); + }} + className="toggle toggle-primary" + /> +
+ + {/* Enhancement Selection */} + {avatarSelected?.Enhanced && ( +
+
+ + + {transI18n("enhancement")} + + + {avatars[avatarSelected?.ID.toString() || ""]?.enhanced || transI18n("origin")} + +
+ +

{transI18n("enhancedNote")}

+
+ )} +
+
+
+ + {/* Right Column: Lightcone Equipment */} +
+
+ {/* Card Header */} +
+

+
+ + {transI18n("lightconeEquipment")} + +

+ {lightcone && ( + + S{lightcone.rank} • Lv.{lightcone.level} + + )} +
+ + {lightcone && lightconeDetail ? ( +
+ {/* Lightcone Hero Block */} +
+ {/* Artwork */} +
+ Lightcone +
+ + {/* Meta & Stats */} +
+
+

+ +

+
+ + {transI18n(lightconeDetail.BaseType.toLowerCase())} + + + {calcRarity(lightconeDetail.Rarity)}★ + + #{lightcone.item_id} +
+
+ + {/* Level Slider */} +
+
+ {transI18n("level")} + {lightcone.level}/80 +
+ { + const newLightconeLevel = Math.min(80, Math.max(1, parseInt(e.target.value) || 1)) + handleUpdateLightcone((lc) => lc ? { ...lc, level: newLightconeLevel, promotion: calcPromotion(newLightconeLevel) } : null) + }} + className="range range-primary range-sm w-full" + /> +
+ + {/* Superimposition Rank (S1-S5) */} +
+
+ {transI18n("superimpositionRank")} + S{lightcone.rank} +
+
+ {[1, 2, 3, 4, 5].map((r) => ( + + ))} +
+
+
+
+ + {/* Skill Description */} +
+
+
+ + {/* Action Buttons */} +
+ + +
+
+ ) : ( + /* Empty Lightcone State */ +
+
handleShow("action_detail_modal")} + className="w-16 h-16 mx-auto bg-base-200/70 rounded-2xl border-2 border-dashed border-base-content/30 flex items-center justify-center cursor-pointer hover:border-primary hover:scale-105 transition-all group" + > + + + +
+
+

{transI18n("noLightconeEquipped")}

+

{transI18n("equipLightconeNote")}

+
+ +
+ )} +
+
+
+ )} + + {/* Lightcone Selection Modal */} + +
+
+

+ {transI18n("lightconeEquipment")} +

+ +
+
+ +
+
+
+ +
+
+
+ ); +} diff --git a/src/components/card/characterCard.tsx b/src/components/card/characterCard.tsx index 5b3b6ed..b7c0351 100644 --- a/src/components/card/characterCard.tsx +++ b/src/components/card/characterCard.tsx @@ -1,83 +1,116 @@ -"use client"; -import { getNameChar } from '@/helper'; -import useLocaleStore from '@/stores/localeStore'; -import { AvatarDetail } from '@/types'; -import ParseText from '../parseText'; -import Image from 'next/image'; -import { useTranslations } from 'next-intl'; -import useDetailDataStore from '@/stores/detailDataStore'; - -interface CharacterCardProps { - data: AvatarDetail -} - -export default function CharacterCard({ data }: CharacterCardProps) { - const { locale } = useLocaleStore(); - const transI18n = useTranslations("DataPage"); - const { baseType, damageType } = useDetailDataStore() - - return ( -
  • -
    - -
    - ALT - {data.DamageType.toLowerCase()} - {data.BaseType.toLowerCase()} -
    -
    - - -
  • - - ); -} +"use client"; +import { getNameChar } from '@/helper'; +import useLocaleStore from '@/stores/localeStore'; +import { AvatarDetail } from '@/types'; +import ParseText from '../parseText'; +import Image from 'next/image'; +import { useTranslations } from 'next-intl'; +import useDetailDataStore from '@/stores/detailDataStore'; +import { useShallow } from 'zustand/react/shallow'; + +import useUserDataStore from '@/stores/userDataStore'; + +interface CharacterCardProps { + data: AvatarDetail +} + +export default function CharacterCard({ data }: CharacterCardProps) { + const { locale } = useLocaleStore(useShallow((state) => ({ locale: state.locale }))); + const transI18n = useTranslations("DataPage"); + const { baseType, damageType } = useDetailDataStore( + useShallow((state) => ({ + baseType: state.baseType, + damageType: state.damageType, + })) + ) + const { avatars } = useUserDataStore( + useShallow((state) => ({ avatars: state.avatars })) + ) + + const userAvatar = avatars[data.ID.toString()] + const level = userAvatar?.level + const rank = userAvatar?.data?.rank ?? 0 + + const is5Star = data.Rarity === "CombatPowerAvatarRarityType5"; + const is4Star = data.Rarity === "CombatPowerAvatarRarityType4"; + + return ( +
  • + {/* Artwork container with vibrant rarity background */} +
    + {data.ID.toString()} + + {/* Level and Eidolons Badge Overlay */} + {level && ( +
    + + {level} + + {rank > 0 && ( + + E{rank} + + )} +
    + )} + + {/* Damage Type Badge */} + {damageType?.[data.DamageType]?.Icon && ( + {data.DamageType.toLowerCase()} + )} + + {/* Base Type / Path Badge */} + {baseType?.[data.BaseType]?.Icon && ( + {data.BaseType.toLowerCase()} + )} +
    + + {/* Name Label - Clear Full Name Display */} +
    + +
    +
  • + ); +} diff --git a/src/components/card/characterInfoCard.tsx b/src/components/card/characterInfoCard.tsx index e4c61f0..3d47847 100644 --- a/src/components/card/characterInfoCard.tsx +++ b/src/components/card/characterInfoCard.tsx @@ -1,125 +1,157 @@ -"use client"; - -import React from 'react'; -import { CharacterInfoCardType } from '@/types'; -import useLocaleStore from '@/stores/localeStore'; -import Image from 'next/image'; -import ParseText from '../parseText'; -import useDetailDataStore from '@/stores/detailDataStore'; -import { getLocaleName } from '@/helper/getName'; - -export default function CharacterInfoCard({ character, selectedCharacters, onCharacterToggle }: { character: CharacterInfoCardType, selectedCharacters: CharacterInfoCardType[], onCharacterToggle: (characterId: CharacterInfoCardType) => void }) { - const isSelected = selectedCharacters.some((selectedCharacter) => selectedCharacter.avatar_id === character.avatar_id); - const { mapAvatar, mapLightCone, baseType, damageType } = useDetailDataStore(); - const { locale } = useLocaleStore(); - - return ( -
    onCharacterToggle(character)} - > - - {/* Character Portrait */} -
    -
    - {getLocaleName(locale, - {mapAvatar[character.avatar_id.toString()]?.DamageType.toLowerCase()} - {mapAvatar[character.avatar_id.toString()]?.BaseType.toLowerCase()} -
    -
    - - {/* Character Name and Level */} -
    -
    - -
    Lv.{character.level} E{character.rank}
    -
    -
    - {character.relics.length > 0 && ( -
    - {character.relics.map((relic, index) => ( -
    -
    - Relic -
    -
    - +{relic.level} -
    -
    - ))} -
    - )} - - {/* Light Cone */} - {character.lightcone.item_id !== 0 && ( -
    -
    - {getLocaleName(locale, - -
    -
    -
    -
    - -
    -
    Lv.{character.lightcone.level} S{character.lightcone.rank}
    -
    -
    -
    - )} -
    - ); +"use client"; + +import React from 'react'; +import { CharacterInfoCardType } from '@/types'; +import useLocaleStore from '@/stores/localeStore'; +import Image from 'next/image'; +import ParseText from '../parseText'; +import useDetailDataStore from '@/stores/detailDataStore'; +import { getLocaleName } from '@/helper/getName'; +import { useShallow } from 'zustand/react/shallow'; + +export default function CharacterInfoCard({ + character, + selectedCharacters, + onCharacterToggle +}: { + character: CharacterInfoCardType, + selectedCharacters: CharacterInfoCardType[], + onCharacterToggle: (characterId: CharacterInfoCardType) => void +}) { + const isSelected = selectedCharacters.some((selectedCharacter) => selectedCharacter.avatar_id === character.avatar_id); + const { mapAvatar, mapLightCone, baseType, damageType } = useDetailDataStore( + useShallow((state) => ({ + mapAvatar: state.mapAvatar, + mapLightCone: state.mapLightCone, + baseType: state.baseType, + damageType: state.damageType, + })) + ); + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ); + + const avatar = mapAvatar?.[character.avatar_id.toString()]; + + return ( +
    onCharacterToggle(character)} + > + {/* Character Portrait */} +
    + {avatar && ( + <> + {getLocaleName(locale, + {damageType?.[avatar.DamageType]?.Icon && ( +
    + {avatar.DamageType.toLowerCase()} +
    + )} + {baseType?.[avatar.BaseType]?.Icon && ( +
    + {avatar.BaseType.toLowerCase()} +
    + )} + + )} +
    + + {/* Character Name and Level Badge */} +
    + +
    + + Lv.{character.level} + + + E{character.rank} + +
    +
    + + {/* Relics Mini-grid */} + {character.relics.length > 0 && ( +
    + {character.relics.map((relic, index) => ( +
    +
    + Relic +
    +
    + +{relic.level} +
    +
    + ))} +
    + )} + + {/* Light Cone */} + {character.lightcone && character.lightcone.item_id !== 0 && ( +
    +
    + Lightcone +
    +
    + +
    +
    + Lv.{character.lightcone.level} + S{character.lightcone.rank} +
    +
    + )} +
    + ); }; \ No newline at end of file diff --git a/src/components/card/lightconeCard.tsx b/src/components/card/lightconeCard.tsx index a0d153c..a772bce 100644 --- a/src/components/card/lightconeCard.tsx +++ b/src/components/card/lightconeCard.tsx @@ -1,53 +1,55 @@ -"use client"; - -import { getLocaleName } from '@/helper'; -import useLocaleStore from '@/stores/localeStore'; -import ParseText from '../parseText'; -import Image from 'next/image'; -import { LightConeDetail } from '@/types'; - -interface LightconeCardProps { - data: LightConeDetail -} - -export default function LightconeCard({ data }: LightconeCardProps) { - - const { locale } = useLocaleStore(); - const text = getLocaleName(locale, data.Name) - return ( -
  • -
    - -
    - ALT -
    -
    - - -
  • - - ); - -} +"use client"; + +import { getLocaleName } from '@/helper'; +import useLocaleStore from '@/stores/localeStore'; +import { useShallow } from 'zustand/react/shallow'; +import ParseText from '../parseText'; +import Image from 'next/image'; +import { LightConeDetail } from '@/types'; + +interface LightconeCardProps { + data: LightConeDetail +} + +export default function LightconeCard({ data }: LightconeCardProps) { + const { locale } = useLocaleStore(useShallow((state) => ({ locale: state.locale }))); + const text = getLocaleName(locale, data.Name); + + const is5Star = data.Rarity === "CombatPowerLightconeRarity5"; + const is4Star = data.Rarity === "CombatPowerLightconeRarity4"; + + return ( +
  • + {/* Artwork container with vibrant rarity background */} +
    + {data?.Name?.en +
    + + {/* Name Label - Uniform Fixed-Height Footer */} +
    + +
    +
  • + ); +} diff --git a/src/components/card/profileCard.tsx b/src/components/card/profileCard.tsx index 1a1065b..bf822c5 100644 --- a/src/components/card/profileCard.tsx +++ b/src/components/card/profileCard.tsx @@ -1,79 +1,90 @@ -"use client"; - -import React from 'react'; -import { AvatarProfileCardType } from '@/types'; -import useLocaleStore from '@/stores/localeStore'; -import Image from 'next/image'; -import ParseText from '../parseText'; -import useDetailDataStore from '@/stores/detailDataStore'; -import { getLocaleName } from '@/helper/getName'; - - -export default function ProfileCard({ profile, selectedProfile, onProfileToggle }: { profile: AvatarProfileCardType, selectedProfile: AvatarProfileCardType[], onProfileToggle: (profileId: AvatarProfileCardType) => void }) { - const isSelected = selectedProfile.some((selectedProfile) => selectedProfile.key === profile.key); - const { mapLightCone } = useDetailDataStore(); - const { locale } = useLocaleStore(); - - return ( -
    onProfileToggle(profile)} - > - {/* Light Cone */} - {profile.lightcone && ( -
    -
    - {getLocaleName(locale, - -
    -
    -
    -
    - -
    -
    Lv.{profile.lightcone.level} S{profile.lightcone.rank}
    -
    -
    -
    - )} - - {Object.keys(profile.relics).length > 0 && ( -
    - {Object.values(profile.relics).map((relic, index) => ( -
    -
    - Relic -
    -
    - +{relic.level} -
    -
    - ))} -
    - )} -
    - ); +"use client"; + +import React from 'react'; +import { AvatarProfileCardType } from '@/types'; +import useLocaleStore from '@/stores/localeStore'; +import Image from 'next/image'; +import ParseText from '../parseText'; +import useDetailDataStore from '@/stores/detailDataStore'; +import { getLocaleName } from '@/helper/getName'; +import { useShallow } from 'zustand/react/shallow'; + +export default function ProfileCard({ + profile, + selectedProfile, + onProfileToggle +}: { + profile: AvatarProfileCardType, + selectedProfile: AvatarProfileCardType[], + onProfileToggle: (profileId: AvatarProfileCardType) => void +}) { + const isSelected = selectedProfile.some((selectedProfile) => selectedProfile.key === profile.key); + const { mapLightCone } = useDetailDataStore( + useShallow((state) => ({ mapLightCone: state.mapLightCone })) + ); + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ); + + return ( +
    onProfileToggle(profile)} + > + {/* Light Cone */} + {profile.lightcone && ( +
    +
    + Lightcone +
    +
    + +
    +
    + Lv.{profile.lightcone.level} + S{profile.lightcone.rank} +
    +
    + )} + + {/* Relics Mini-grid */} + {Object.keys(profile.relics).length > 0 && ( +
    + {Object.values(profile.relics).map((relic, index) => ( +
    +
    + Relic +
    +
    + +{relic.level} +
    +
    + ))} +
    + )} +
    + ); }; \ No newline at end of file diff --git a/src/components/card/relicCard.tsx b/src/components/card/relicCard.tsx index 674dd5b..f51a33c 100644 --- a/src/components/card/relicCard.tsx +++ b/src/components/card/relicCard.tsx @@ -1,196 +1,135 @@ -"use client"; - -import useRelicMakerStore from "@/stores/relicMakerStore"; -import useUserDataStore from "@/stores/userDataStore"; -import Image from "next/image"; -import { useMemo } from "react"; - -interface RelicCardProps { - slot: string - avatarId: string -} -const getRarityColor = (rarity: string) => { - switch (rarity) { - case '3': return 'border-green-500 shadow-green-500/50 bg-linear-to-br from-green-700 via-green-400 to-green-500'; - case '4': return 'border-blue-500 shadow-blue-500/50 bg-linear-to-br from-blue-700 via-blue-400 to-blue-500'; - case '5': return 'border-purple-500 shadow-purple-500/50 bg-linear-to-br from-purple-700 via-purple-400 to-purple-500'; - case '6': return 'border-yellow-500 shadow-yellow-500/50 bg-linear-to-br from-yellow-700 via-yellow-400 to-yellow-500'; - default: return 'border-gray-500 shadow-gray-500/50'; - } -}; - -const getRarityName = (slot: string) => { - switch (slot) { - case '1': return ( -
    - Head -

    Head

    -
    - ); - case '2': return ( -
    - Hand -

    Hands

    -
    - ); - case '3': return ( -
    - Body -

    Body

    -
    - ); - case '4': return ( -
    - Foot -

    Feet

    -
    - ); - case '5': return ( -
    - Neck -

    Planar sphere

    -
    - ); - case '6': return ( -
    - Object -

    Link rope

    -
    - ); - default: return ''; - } -}; -export default function RelicCard({ slot, avatarId }: RelicCardProps) { - const { avatars } = useUserDataStore() - const { selectedRelicSlot } = useRelicMakerStore() - - const relicDetail = useMemo(() => { - const avatar = avatars[avatarId]; - if (avatar) { - if (avatar.profileList[avatar.profileSelect].relics[slot]) { - return avatar.profileList[avatar.profileSelect].relics[slot]; - } - return null; - } - return null; - }, [avatars, avatarId, slot]); - - return ( -
    - {relicDetail ? ( -
    -
    - - Relic - - - {/* Level Badge */} -
    - +{relicDetail.level} -
    -
    - -
    -
    {getRarityName(slot)}
    -
    -
    - ) : ( -
    -
    - - - - - - - {/* Level Badge */} -
    - +{0} -
    -
    - -
    -
    {getRarityName(slot)}
    -
    -
    - )} - -
    - ) +"use client"; + +import useRelicMakerStore from "@/stores/relicMakerStore"; +import useUserDataStore from "@/stores/userDataStore"; +import { useShallow } from "zustand/react/shallow"; +import Image from "next/image"; +import { useMemo } from "react"; + +interface RelicCardProps { + slot: string + avatarId: string +} + +const getRarityColor = (rarity: string) => { + switch (rarity) { + case '6': + return 'border-amber-400/90 shadow-[0_0_16px_rgba(251,191,36,0.4)] bg-linear-to-br from-amber-600 via-amber-400 to-amber-500'; + case '5': + return 'border-purple-400/90 shadow-[0_0_16px_rgba(192,132,252,0.4)] bg-linear-to-br from-purple-700 via-purple-400 to-purple-500'; + case '4': + return 'border-sky-400/90 shadow-[0_0_16px_rgba(56,189,248,0.4)] bg-linear-to-br from-blue-700 via-blue-400 to-sky-500'; + case '3': + return 'border-emerald-400/90 shadow-[0_0_16px_rgba(52,211,153,0.4)] bg-linear-to-br from-emerald-700 via-emerald-400 to-emerald-500'; + default: + return 'border-base-content/20 bg-base-300'; + } +}; + +const getSlotIconAndName = (slot: string) => { + const slotMap: Record = { + '1': { icon: '/relics/HEAD.png', name: 'Head' }, + '2': { icon: '/relics/HAND.png', name: 'Hands' }, + '3': { icon: '/relics/BODY.png', name: 'Body' }, + '4': { icon: '/relics/FOOT.png', name: 'Feet' }, + '5': { icon: '/relics/NECK.png', name: 'Planar Sphere' }, + '6': { icon: '/relics/OBJECT.png', name: 'Link Rope' }, + }; + + const current = slotMap[slot]; + if (!current) return null; + + return ( +
    + {current.name} + {current.name} +
    + ); +}; + +export default function RelicCard({ slot, avatarId }: RelicCardProps) { + const { avatars } = useUserDataStore( + useShallow((state) => ({ avatars: state.avatars })) + ) + const { selectedRelicSlot } = useRelicMakerStore( + useShallow((state) => ({ selectedRelicSlot: state.selectedRelicSlot })) + ) + + const relicDetail = useMemo(() => { + const avatar = avatars[avatarId]; + if (avatar) { + const profile = avatar.profileList?.[avatar.profileSelect] ?? avatar.profileList?.[0]; + return profile?.relics?.[slot] || null; + } + return null; + }, [avatars, avatarId, slot]); + + const isSelected = selectedRelicSlot === slot; + + return ( +
    + {relicDetail ? ( +
    +
    + Relic + + {/* Level Badge */} +
    + +{relicDetail.level} +
    +
    + + {getSlotIconAndName(slot)} +
    + ) : ( +
    +
    +
    + + + +
    + + {/* Level Badge */} +
    + +0 +
    +
    + + {getSlotIconAndName(slot)} +
    + )} +
    + ) } \ No newline at end of file diff --git a/src/components/card/simpleCharacterCard.tsx b/src/components/card/simpleCharacterCard.tsx index 963697c..1e57456 100644 --- a/src/components/card/simpleCharacterCard.tsx +++ b/src/components/card/simpleCharacterCard.tsx @@ -1,69 +1,84 @@ -"use client"; -import Image from 'next/image'; -import { AvatarDetail } from '@/types'; -import useDetailDataStore from '@/stores/detailDataStore'; - - -interface SimpleAvatarCardProps { - data: AvatarDetail; - isSelected?: boolean; - onClick?: () => void; - showRemoveHover?: boolean; -} - -export const SimpleAvatarCard = ({ data, isSelected, onClick, showRemoveHover }: SimpleAvatarCardProps) => { -const { baseType, damageType } = useDetailDataStore() - - return ( -
    - Avatar -
    - Element -
    -
    - Path -
    - - {showRemoveHover && ( -
    - - - -
    - )} -
    - ); +"use client"; +import Image from 'next/image'; +import { AvatarDetail } from '@/types'; +import useDetailDataStore from '@/stores/detailDataStore'; +import { useShallow } from 'zustand/react/shallow'; +import { X } from 'lucide-react'; + +interface SimpleAvatarCardProps { + data: AvatarDetail; + isSelected?: boolean; + onClick?: () => void; + showRemoveHover?: boolean; +} + +export const SimpleAvatarCard = ({ data, isSelected, onClick, showRemoveHover }: SimpleAvatarCardProps) => { + const { baseType, damageType } = useDetailDataStore( + useShallow((state) => ({ + baseType: state.baseType, + damageType: state.damageType, + })) + ) + + const is5Star = data.Rarity === "CombatPowerAvatarRarityType5"; + + return ( +
    +
    + Avatar + {damageType?.[data.DamageType]?.Icon && ( +
    + Element +
    + )} + {baseType?.[data.BaseType]?.Icon && ( +
    + Path +
    + )} + + {showRemoveHover && ( +
    + +
    + )} +
    +
    + ); }; \ No newline at end of file diff --git a/src/components/changelog/index.tsx b/src/components/changelog/index.tsx index f6173e9..c87d392 100644 --- a/src/components/changelog/index.tsx +++ b/src/components/changelog/index.tsx @@ -1,91 +1,86 @@ - -import useLocaleStore from '@/stores/localeStore'; -import { Check, Sparkles, Bug, Zap, Package, Calendar } from 'lucide-react'; - -export default function ChangelogBar() { - const { changelog } = useLocaleStore() - - const getIcon = (type: string) => { - switch (type) { - case 'feature': - return ; - case 'fix': - return ; - case 'improvement': - return ; - default: - return ; - } - }; - - const getBadgeClass = (type: string) => { - switch (type) { - case 'feature': - return 'badge-success'; - case 'fix': - return 'badge-error'; - case 'improvement': - return 'badge-warning'; - default: - return 'badge-info'; - } - }; - - const getTypeLabel = (type: string) => { - switch (type) { - case 'feature': - return 'Feature'; - case 'fix': - return 'Fix'; - case 'improvement': - return 'Improvement'; - default: - return 'Update'; - } - }; - - return ( -
    - {/* Alert */} - {/*
    - -
    */} - - {/* Timeline */} -
    - {changelog.map((change, index) => ( -
    -
    - {/* Version Header */} -
    -
    - {getIcon(change.type)} - {getTypeLabel(change.type)} -
    -

    - Version {change.version} -

    -
    - - {change.date} -
    -
    - - {/* Changes List */} -
      - {change.items.map((item, itemIndex) => ( -
    • -
      - -
      - {item} -
    • - ))} -
    -
    -
    - ))} -
    -
    - ); +import useLocaleStore from '@/stores/localeStore'; +import { useShallow } from 'zustand/react/shallow'; +import { Sparkles, Bug, Zap, Package, Calendar } from 'lucide-react'; + +export default function ChangelogBar() { + const { changelog } = useLocaleStore( + useShallow((state) => ({ changelog: state.changelog })) + ) + + const getIcon = (type: string) => { + switch (type) { + case 'feature': + return ; + case 'fix': + return ; + case 'improvement': + return ; + default: + return ; + } + }; + + const getBadgeClass = (type: string) => { + switch (type) { + case 'feature': + return 'bg-emerald-500/15 text-emerald-400 border-emerald-500/30'; + case 'fix': + return 'bg-rose-500/15 text-rose-400 border-rose-500/30'; + case 'improvement': + return 'bg-amber-500/15 text-amber-400 border-amber-500/30'; + default: + return 'bg-primary/15 text-primary border-primary/30'; + } + }; + + const getTypeLabel = (type: string) => { + switch (type) { + case 'feature': + return 'Feature'; + case 'fix': + return 'Fix'; + case 'improvement': + return 'Improvement'; + default: + return 'Update'; + } + }; + + return ( +
    +
    + {changelog.map((change, index) => ( +
    + {/* Version Header */} +
    +
    + + {getIcon(change.type)} + {getTypeLabel(change.type)} + +

    + Version {change.version} +

    +
    + +
    + + {change.date} +
    +
    + + {/* Changes List */} +
      + {change.items.map((item, itemIndex) => ( +
    • +
      + {item} +
    • + ))} +
    +
    + ))} +
    +
    + ); } \ No newline at end of file diff --git a/src/components/clientDataFetcher/index.tsx b/src/components/clientDataFetcher/index.tsx index eb02e5b..c1fa8c6 100644 --- a/src/components/clientDataFetcher/index.tsx +++ b/src/components/clientDataFetcher/index.tsx @@ -1,56 +1,56 @@ -"use client" - -import { - useFetchASGroupData, - useFetchAvatarData, - useFetchChangelog, - useFetchConfigData, - useFetchLightconeData, - useFetchMOCGroupData, - useFetchMonsterData, - useFetchPeakGroupData, - useFetchPFGroupData, - useFetchRelicSetData -} from "@/lib/hooks" - -export default function ClientDataFetcher({ - children -}: { - children: React.ReactNode -}) { - const q1 = useFetchConfigData() - const q2 = useFetchAvatarData() - const q3 = useFetchLightconeData() - const q4 = useFetchRelicSetData() - const q5 = useFetchMonsterData() - const q6 = useFetchPFGroupData() - const q7 = useFetchMOCGroupData() - const q8 = useFetchASGroupData() - const q9 = useFetchPeakGroupData() - const q10 = useFetchChangelog() - - const queries = [q1,q2,q3,q4,q5,q6,q7,q8,q9,q10] - - const loading = queries.some(q => q.isLoading) - - const progress = - (queries.filter(q => q.isSuccess).length / queries.length) * 100 - - if (loading) { - return ( -
    -
    Loading data...
    - - - -
    {Math.floor(progress)}%
    -
    - ) - } - - return <>{children} +"use client" + +import { + useFetchASGroupData, + useFetchAvatarData, + useFetchChangelog, + useFetchConfigData, + useFetchLightconeData, + useFetchMOCGroupData, + useFetchMonsterData, + useFetchPeakGroupData, + useFetchPFGroupData, + useFetchRelicSetData +} from "@/lib/hooks" + +export default function ClientDataFetcher({ + children +}: { + children: React.ReactNode +}) { + const q1 = useFetchConfigData() + const q2 = useFetchAvatarData() + const q3 = useFetchLightconeData() + const q4 = useFetchRelicSetData() + const q5 = useFetchMonsterData() + const q6 = useFetchPFGroupData() + const q7 = useFetchMOCGroupData() + const q8 = useFetchASGroupData() + const q9 = useFetchPeakGroupData() + const q10 = useFetchChangelog() + + const queries = [q1,q2,q3,q4,q5,q6,q7,q8,q9,q10] + + const loading = queries.some(q => q.isLoading) + + const progress = + (queries.filter(q => q.isSuccess).length / queries.length) * 100 + + if (loading) { + return ( +
    +
    Loading data...
    + + + +
    {Math.floor(progress)}%
    +
    + ) + } + + return <>{children} } \ No newline at end of file diff --git a/src/components/connectBar/index.tsx b/src/components/connectBar/index.tsx index 9e4a1fa..e19e088 100644 --- a/src/components/connectBar/index.tsx +++ b/src/components/connectBar/index.tsx @@ -1,169 +1,203 @@ -"use client" - -import { connectToPS, syncDataToPS } from "@/helper" -import useConnectStore from "@/stores/connectStore" -import useGlobalStore from "@/stores/globalStore" -import { PSConnectType } from "@/types" -import { useTranslations } from "next-intl" -import { useState } from "react" - -export default function ConnectBar() { - const transI18n = useTranslations("DataPage") - const [message, setMessage] = useState({ text: '', type: '' }); - const { - connectionType, - privateType, - serverUrl, - username, - password, - setConnectionType, - setPrivateType, - setServerUrl, - setUsername, - setPassword - } = useConnectStore() - const { isConnectPS, setIsConnectPS } = useGlobalStore() - - return ( -
    -
    - - -
    - - {connectionType === PSConnectType.Other && ( -
    -
    - - setServerUrl(e.target.value)} - /> -
    -
    - - -
    - -
    - - setUsername(e.target.value)} - /> -
    -
    - - setPassword(e.target.value)} - /> -
    -
    - )} - - {message.text && ( -
    - {message.text} -
    - )} - -
    -
    - {transI18n("status")}: - - {isConnectPS ? transI18n("connected") : transI18n("unconnected")} - -
    - - {/* Buttons */} -
    - - - {isConnectPS && ( - - )} -
    -
    - -
    - ) +"use client" + +import { connectToPS, syncDataToPS } from "@/helper" +import useConnectStore from "@/stores/connectStore" +import useGlobalStore from "@/stores/globalStore" +import { PSConnectType } from "@/types" +import { useTranslations } from "next-intl" +import { useState } from "react" +import { useShallow } from "zustand/react/shallow" +import { Server, RefreshCw, AlertCircle } from "lucide-react" + +export default function ConnectBar() { + const transI18n = useTranslations("DataPage") + const [message, setMessage] = useState({ text: '', type: '' }); + const { + connectionType, + privateType, + serverUrl, + username, + password, + setConnectionType, + setPrivateType, + setServerUrl, + setUsername, + setPassword + } = useConnectStore( + useShallow((state) => ({ + connectionType: state.connectionType, + privateType: state.privateType, + serverUrl: state.serverUrl, + username: state.username, + password: state.password, + setConnectionType: state.setConnectionType, + setPrivateType: state.setPrivateType, + setServerUrl: state.setServerUrl, + setUsername: state.setUsername, + setPassword: state.setPassword, + })) + ) + const { isConnectPS, setIsConnectPS } = useGlobalStore( + useShallow((state) => ({ + isConnectPS: state.isConnectPS, + setIsConnectPS: state.setIsConnectPS, + })) + ) + + return ( +
    +
    + {/* Connection Type Selection */} +
    + + +
    + + {connectionType === PSConnectType.Other && ( +
    +
    + + setServerUrl(e.target.value)} + /> +
    + +
    + + +
    + +
    + + setUsername(e.target.value)} + /> +
    + +
    + + setPassword(e.target.value)} + /> +
    +
    + )} + + {/* Status Message Notification */} + {message.text && ( +
    + + {message.text} +
    + )} + + {/* Footer Controls */} +
    +
    + {transI18n("status")}: +
    + + {isConnectPS ? transI18n("connected") : transI18n("unconnected")} +
    +
    + +
    + + + {isConnectPS && ( + + )} +
    +
    +
    +
    + ) } \ No newline at end of file diff --git a/src/components/eidolonsInfo/index.tsx b/src/components/eidolonsInfo/index.tsx index 50b47b2..638e2bf 100644 --- a/src/components/eidolonsInfo/index.tsx +++ b/src/components/eidolonsInfo/index.tsx @@ -1,85 +1,142 @@ -"use client" -import { replaceByParam, getLocaleName } from '@/helper'; -import Image from "next/image"; -import ParseText from "../parseText"; -import useLocaleStore from "@/stores/localeStore"; -import useUserDataStore from "@/stores/userDataStore"; -import { useMemo } from "react"; -import { useTranslations } from "next-intl"; -import useCurrentDataStore from "@/stores/currentDataStore"; -import ExtraEffectList from '../extraInfo'; - - -export default function EidolonsInfo() { - const { avatarSelected } = useCurrentDataStore() - const { locale } = useLocaleStore() - const transI18n = useTranslations("DataPage") - const { setAvatars, avatars } = useUserDataStore() - - const charRank = useMemo(() => { - if (!avatarSelected) return null; - const avatar = avatars[avatarSelected.ID]; - if (avatar?.enhanced != "") { - return avatarSelected?.Enhanced?.[avatar?.enhanced]?.Ranks - } - return avatarSelected?.Ranks - }, [avatarSelected, avatars]); - - return ( -
    -

    -
    - {transI18n("eidolons")} -

    -
    - {charRank && avatars[avatarSelected?.ID || ""] && ( -
    - {Object.entries(charRank || {}).map(([key, rank]) => ( -
    -
    { - let newRank = Number(rank.Rank) - if (avatars[avatarSelected?.ID || ""]?.data?.rank == Number(rank.Rank)) { - newRank = Number(rank.Rank) - 1 - } - setAvatars({ ...avatars, [avatarSelected?.ID || ""]: { ...avatars[avatarSelected?.ID || ""], data: { ...avatars[avatarSelected?.ID || ""].data, rank: newRank } } }) - }} - > - {`Rank - -
    - {rank.Rank}. - -
    -
    - -
    -
    - -
    -
    - ))} - -
    - )} -
    -
    - ); -} +"use client" +import { replaceByParam, getLocaleName } from '@/helper'; +import Image from "next/image"; +import ParseText from "../parseText"; +import useLocaleStore from "@/stores/localeStore"; +import useUserDataStore from "@/stores/userDataStore"; +import { useMemo } from "react"; +import { useTranslations } from "next-intl"; +import useCurrentDataStore from "@/stores/currentDataStore"; +import ExtraEffectList from '../extraInfo'; +import { useShallow } from "zustand/react/shallow"; + +export default function EidolonsInfo() { + const { avatarSelected } = useCurrentDataStore( + useShallow((state) => ({ avatarSelected: state.avatarSelected })) + ) + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ) + const transI18n = useTranslations("DataPage") + const { setAvatars, avatars } = useUserDataStore( + useShallow((state) => ({ + setAvatars: state.setAvatars, + avatars: state.avatars, + })) + ) + + const charRank = useMemo(() => { + if (!avatarSelected) return null; + const avatar = avatars[avatarSelected.ID]; + if (avatar?.enhanced != "") { + return avatarSelected?.Enhanced?.[avatar?.enhanced]?.Ranks + } + return avatarSelected?.Ranks + }, [avatarSelected, avatars]); + + const currentRank = avatars[avatarSelected?.ID.toString() || ""]?.data?.rank || 0; + + const handleToggleRank = (rankNum: number) => { + if (!avatarSelected) return; + let newRank = rankNum; + if (currentRank === rankNum) { + newRank = rankNum - 1; + } + setAvatars({ + ...avatars, + [avatarSelected.ID]: { + ...avatars[avatarSelected.ID], + data: { + ...avatars[avatarSelected.ID]?.data, + rank: newRank, + }, + }, + }); + }; + + return ( +
    +
    + {/* Header */} +
    +

    +
    + + {transI18n("eidolons")} + +

    + +
    + Active: + E{currentRank} +
    +
    + + {/* 6 Eidolons Organic Grid */} + {charRank && avatars[avatarSelected?.ID || ""] && ( +
    + {Object.entries(charRank || {}).map(([key, rank]) => { + const rankNum = Number(rank.Rank); + const isUnlocked = rankNum <= currentRank; + return ( +
    + {/* 1. Organic Floating Eidolon Shard (No artificial rectangle wrapper) */} +
    handleToggleRank(rankNum)} + className="cursor-pointer select-none transition-transform duration-200 hover:scale-105 active:scale-95" + title={`Click to ${isUnlocked ? 'deactivate' : 'activate'} E${rank.Rank}`} + > + {`Rank +
    + + {/* 2. Eidolon Name & Rank */} +
    handleToggleRank(rankNum)} + className="flex items-center justify-center gap-1.5 cursor-pointer group select-none" + > + + E{rank.Rank}. + + +
    + + {/* 3. Description & Extra Effects (Direct readable text, fully selectable & copyable) */} +
    +
    + +
    +
    + ); + })} +
    + )} +
    +
    + ); +} diff --git a/src/components/extraInfo/index.tsx b/src/components/extraInfo/index.tsx index 85d98a3..d1f16a9 100644 --- a/src/components/extraInfo/index.tsx +++ b/src/components/extraInfo/index.tsx @@ -1,99 +1,99 @@ -"use client" - -import { useState } from "react" -import { replaceByParam, getLocaleName } from "@/helper" -import { ExtraEffect } from "@/types" -import { useTranslations } from "next-intl" - -type Props = { - extras: Record | undefined - locale: string -} - -export default function ExtraEffectList({ extras, locale }: Props) { - const [openList, setOpenList] = useState(false) - const [openId, setOpenId] = useState(null) - const transI18n = useTranslations("DataPage") - if (!extras || Object.keys(extras).length === 0) return null - - return ( -
    -
    setOpenList(!openList)} - > - - {transI18n("listExtraEffect")} ({Object.keys(extras).length}) - - - - ▶ - -
    - -
    -
    - {Object.values(extras).map((extra) => { - const isOpen = openId === extra.ID - - return ( -
    -
    - setOpenId(isOpen ? null : extra.ID) - } - > -
    - - {transI18n("extra")} - - - - {getLocaleName(locale, extra.Name)} - -
    - - - ▶ - -
    - -
    -
    -
    -
    - ) - })} -
    -
    -
    - ) +"use client" + +import { useState } from "react" +import { replaceByParam, getLocaleName } from "@/helper" +import { ExtraEffect } from "@/types" +import { useTranslations } from "next-intl" + +type Props = { + extras: Record | undefined + locale: string +} + +export default function ExtraEffectList({ extras, locale }: Props) { + const [openList, setOpenList] = useState(false) + const [openId, setOpenId] = useState(null) + const transI18n = useTranslations("DataPage") + if (!extras || Object.keys(extras).length === 0) return null + + return ( +
    +
    setOpenList(!openList)} + > + + {transI18n("listExtraEffect")} ({Object.keys(extras).length}) + + + + ▶ + +
    + +
    +
    + {Object.values(extras).map((extra) => { + const isOpen = openId === extra.ID + + return ( +
    +
    + setOpenId(isOpen ? null : extra.ID) + } + > +
    + + {transI18n("extra")} + + + + {getLocaleName(locale, extra.Name)} + +
    + + + ▶ + +
    + +
    +
    +
    +
    + ) + })} +
    +
    +
    + ) } \ No newline at end of file diff --git a/src/components/extraSettingBar/index.tsx b/src/components/extraSettingBar/index.tsx index a24a642..2d5cde1 100644 --- a/src/components/extraSettingBar/index.tsx +++ b/src/components/extraSettingBar/index.tsx @@ -1,584 +1,598 @@ -'use client' -import { motion } from "framer-motion" -import { EyeOff, Eye, Hammer, RefreshCw, ShieldBan, User, Swords, SkipForward, BowArrow, Info, RouteIcon, Search, CupSoda, UsersIcon } from "lucide-react" -import useGlobalStore from '@/stores/globalStore' -import { useTranslations } from "next-intl" -import { getLocaleName, getNameChar } from "@/helper" -import useLocaleStore from "@/stores/localeStore" -import SelectCustomImage from "../select/customSelectImage" -import { useMemo, useState } from "react" -import useDetailDataStore from "@/stores/detailDataStore" -import Editor from "react-simple-code-editor" -import Prism from "prismjs" -import "prismjs/components/prism-lua" -import "prismjs/themes/prism-tomorrow.css" -import { SimpleAvatarCard } from "../card/simpleCharacterCard" - -export default function ExtraSettingBar() { - const { extraData, setExtraData, isEnableChangePath, setIsEnableChangePath, isEnableLua, setIsEnableLua } = useGlobalStore() - const transI18n = useTranslations("DataPage") - const { mapAvatar, mapPeak, stage, baseType } = useDetailDataStore() - const { locale } = useLocaleStore() - const [showSearchStage, setShowSearchStage] = useState(false) - const [showSearchLineup, setShowSearchLineup] = useState(false) - const [isChildClick, setIsChildClick] = useState(false) - const [stageSearchTerm, setStageSearchTerm] = useState("") - const [stagePage, setStagePage] = useState(1) - - const pageSize = 30 - const stageList = useMemo(() => Object.values(stage), [stage]) - - const term = stageSearchTerm.toLowerCase() - - const filteredStages = useMemo(() => stageList.filter((s) => - getLocaleName(locale, s.Name).toLowerCase().includes(term) || - String(s.ID).toLowerCase().includes(term) - ), [stageList, term, locale]) - - const paginatedStages = useMemo(() => filteredStages.slice( - (stagePage - 1) * pageSize, - stagePage * pageSize - ), [filteredStages, stagePage, pageSize]) - - const hasMorePages = useMemo(() => stagePage * pageSize < filteredStages.length, [stagePage, filteredStages]) - - const onChangeSearch = (v: string) => { - setStageSearchTerm(v) - setStagePage(1) - } - - return ( -
    - {extraData?.theory_craft && ( -
    -

    - {transI18n("theoryCraft")} -
    - -
    -

    - - - - - - {extraData?.theory_craft?.mode && ( - <> - - - - - - - - -
    - -
    - {(extraData?.theory_craft?.custom_lineup || []).length > 0 && ( - (extraData?.theory_craft?.custom_lineup || []).map((avatarId) => { - const avatarData = mapAvatar[avatarId]; - if (!avatarData) return null; - return ( - { - const newLineup = (extraData?.theory_craft?.custom_lineup || []).filter(id => id !== avatarId); - setExtraData({ - ...extraData, - theory_craft: { - stage_id: extraData?.theory_craft?.stage_id ?? 30118121, - cycle_count: extraData?.theory_craft?.cycle_count ?? 1, - mode: extraData?.theory_craft?.mode ?? false, - hp: extraData?.theory_craft?.hp ?? {}, - custom_lineup: newLineup - } - }); - }} - /> - ); - }) - )} - - -
    - - {showSearchLineup && ( -
    e.stopPropagation()} - className="mt-2 w-full z-50 border bg-base-200 border-slate-600 rounded-lg p-4 shadow-2xl" - > -
    - {transI18n("selectedCharacters")} - -
    - -
    - {Object.values(mapAvatar).map((avatar) => { - const currentLineup = extraData?.theory_craft?.custom_lineup || []; - const isSelected = currentLineup.includes(avatar.ID.toString()); - - return ( - { - const idStr = avatar.ID.toString(); - let newLineup = [...currentLineup]; - - if (isSelected) { - newLineup = newLineup.filter(id => id !== idStr); - } else { - newLineup.push(idStr); - } - - setExtraData({ - ...extraData, - theory_craft: { - stage_id: extraData?.theory_craft?.stage_id ?? 30118121, - cycle_count: extraData?.theory_craft?.cycle_count ?? 1, - mode: extraData?.theory_craft?.mode ?? false, - hp: extraData?.theory_craft?.hp ?? {}, - custom_lineup: newLineup - } - }); - }} - /> - ); - })} -
    -
    - )} -
    -
    - - )} -
    - )} - - {/*MULTIPATH CHAR */} -
    -

    - {transI18n("multipathCharacter")} -
    - -
    - setIsEnableChangePath(e.target.checked)} - /> -

    - {isEnableChangePath && ( - <> - - - - - - - - - )} -
    - - {/* CHALLENGE */} -
    -

    {transI18n("challenge")}

    - - - - - - - - -
    - - {/*EXTRA FEATURES */} -
    -

    {transI18n("extraFeatures")}

    - - {extraData?.setting?.hide_ui !== undefined && ( - - - - )} - - {extraData?.setting?.censorship !== undefined && ( - - - - )} -
    - -
    -

    - {"Lua"} -
    - -
    - setIsEnableLua(e.target.checked)} - /> -

    - {isEnableLua && ( - <> -
    - - -
    - - setExtraData( - { - ...extraData, - lua: code - } - ) - } - highlight={(code) => Prism.highlight(code, Prism.languages.lua, "lua")} - padding={16} - textareaClassName="outline-none" - className="text-sm font-mono min-h-75" - style={{ - background: "#1e1e1e", - color: "#fff", - }} - /> -
    -
    - - )} -
    - -
    - ) -} +'use client' +import { EyeOff, Eye, Hammer, RefreshCw, ShieldBan, User, Swords, SkipForward, BowArrow, Info, RouteIcon, Search, CupSoda, UsersIcon } from "lucide-react" +import useGlobalStore from '@/stores/globalStore' +import { useTranslations } from "next-intl" +import { getLocaleName, getNameChar } from "@/helper" +import useLocaleStore from "@/stores/localeStore" +import SelectCustomImage from "../select/customSelectImage" +import { useMemo, useState } from "react" +import useDetailDataStore from "@/stores/detailDataStore" +import Editor from "react-simple-code-editor" +import Prism from "prismjs" +import "prismjs/components/prism-lua" +import "prismjs/themes/prism-tomorrow.css" +import { SimpleAvatarCard } from "../card/simpleCharacterCard" +import { useShallow } from "zustand/react/shallow" + +export default function ExtraSettingBar() { + const { extraData, setExtraData, isEnableChangePath, setIsEnableChangePath, isEnableLua, setIsEnableLua } = useGlobalStore( + useShallow((state) => ({ + extraData: state.extraData, + setExtraData: state.setExtraData, + isEnableChangePath: state.isEnableChangePath, + setIsEnableChangePath: state.setIsEnableChangePath, + isEnableLua: state.isEnableLua, + setIsEnableLua: state.setIsEnableLua, + })) + ) + const transI18n = useTranslations("DataPage") + const { mapAvatar, mapPeak, stage, baseType } = useDetailDataStore( + useShallow((state) => ({ + mapAvatar: state.mapAvatar, + mapPeak: state.mapPeak, + stage: state.stage, + baseType: state.baseType, + })) + ) + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ) + const [showSearchStage, setShowSearchStage] = useState(false) + const [showSearchLineup, setShowSearchLineup] = useState(false) + const [isChildClick, setIsChildClick] = useState(false) + const [stageSearchTerm, setStageSearchTerm] = useState("") + const [stagePage, setStagePage] = useState(1) + + const pageSize = 30 + const stageList = useMemo(() => Object.values(stage), [stage]) + + const term = stageSearchTerm.toLowerCase() + + const filteredStages = useMemo(() => stageList.filter((s) => + getLocaleName(locale, s.Name).toLowerCase().includes(term) || + String(s.ID).toLowerCase().includes(term) + ), [stageList, term, locale]) + + const paginatedStages = useMemo(() => filteredStages.slice( + (stagePage - 1) * pageSize, + stagePage * pageSize + ), [filteredStages, stagePage, pageSize]) + + const hasMorePages = useMemo(() => stagePage * pageSize < filteredStages.length, [stagePage, filteredStages]) + + const onChangeSearch = (v: string) => { + setStageSearchTerm(v) + setStagePage(1) + } + + return ( +
    + {/* THEORY CRAFT */} + {extraData?.theory_craft && ( +
    +
    +

    + + {transI18n("theoryCraft")} +

    +
    + +
    +
    + +
    + + { + setExtraData({ + ...extraData, + theory_craft: { + hp: extraData?.theory_craft?.hp || {}, + cycle_count: extraData?.theory_craft?.cycle_count || 1, + mode: e.target.checked, + stage_id: extraData?.theory_craft?.stage_id || 0 + } + }) + }} + /> +
    + + {extraData?.theory_craft?.mode && ( +
    + {/* Cycle Count */} +
    +
    + + {transI18n("cycleCount")} +
    + + setExtraData({ + ...extraData, + theory_craft: { + hp: extraData?.theory_craft?.hp || {}, + cycle_count: Number(e.target.value) || 1, + mode: extraData?.theory_craft?.mode || false, + stage_id: extraData?.theory_craft?.stage_id || 0 + } + }) + } + min="1" + /> +
    + + {/* Stage Selection */} +
    +
    + + {transI18n("stage")} +
    +
    + + + {showSearchStage && ( +
    e.stopPropagation()} className="absolute top-full mt-2 w-full z-50 bg-base-100 border border-base-content/15 rounded-2xl p-3.5 shadow-2xl space-y-3"> + onChangeSearch(e.target.value)} + autoFocus + /> + +
    + {paginatedStages.length > 0 ? ( + paginatedStages.map((stage) => ( +
    { + e.stopPropagation() + setIsChildClick(true) + + if (extraData?.theory_craft?.stage_id !== Number(stage.ID)) { + setExtraData({ + ...extraData, + theory_craft: { + stage_id: Number(stage.ID), + cycle_count: extraData?.theory_craft?.cycle_count ?? 1, + mode: extraData?.theory_craft?.mode ?? false, + hp: extraData?.theory_craft?.hp ?? {}, + custom_lineup: extraData?.theory_craft?.custom_lineup ?? [] + } + }) + } + setShowSearchStage(pre => !pre) + onChangeSearch("") + }} + > + {getLocaleName(locale, stage.Name)} +
    + )) + ) : ( +
    {transI18n("noStageFound")}
    + )} +
    + + {paginatedStages.length > 0 && ( +
    + + Page {stagePage} + +
    + )} +
    + )} +
    +
    + + {/* Custom Lineup */} +
    +
    + + {transI18n("customLineup")} +
    + +
    + {(extraData?.theory_craft?.custom_lineup || []).map((avatarId) => { + const avatarData = mapAvatar[avatarId]; + if (!avatarData) return null; + return ( + { + const newLineup = (extraData?.theory_craft?.custom_lineup || []).filter(id => id !== avatarId); + setExtraData({ + ...extraData, + theory_craft: { + stage_id: extraData?.theory_craft?.stage_id ?? 30118121, + cycle_count: extraData?.theory_craft?.cycle_count ?? 1, + mode: extraData?.theory_craft?.mode ?? false, + hp: extraData?.theory_craft?.hp ?? {}, + custom_lineup: newLineup + } + }); + }} + /> + ); + })} + + +
    + + {showSearchLineup && ( +
    e.stopPropagation()} + className="mt-2 w-full z-50 bg-base-100 border border-base-content/15 rounded-2xl p-4 shadow-2xl space-y-3" + > +
    + {transI18n("selectedCharacters")} + +
    + +
    + {Object.values(mapAvatar).map((avatar) => { + const currentLineup = extraData?.theory_craft?.custom_lineup || []; + const isSelected = currentLineup.includes(avatar.ID.toString()); + + return ( + { + const idStr = avatar.ID.toString(); + let newLineup = [...currentLineup]; + + if (isSelected) { + newLineup = newLineup.filter(id => id !== idStr); + } else { + newLineup.push(idStr); + } + + setExtraData({ + ...extraData, + theory_craft: { + stage_id: extraData?.theory_craft?.stage_id ?? 30118121, + cycle_count: extraData?.theory_craft?.cycle_count ?? 1, + mode: extraData?.theory_craft?.mode ?? false, + hp: extraData?.theory_craft?.hp ?? {}, + custom_lineup: newLineup + } + }); + }} + /> + ); + })} +
    +
    + )} +
    +
    + )} +
    + )} + + {/* MULTIPATH CHAR */} +
    +
    +
    +

    + {transI18n("multipathCharacter")} +

    +
    + +
    +
    + setIsEnableChangePath(e.target.checked)} + /> +
    + + {isEnableChangePath && ( +
    +
    +
    + + {transI18n("mainPath")} +
    + extraData?.multi_path?.multi_path_main?.includes(Number(it.ID))).map((it) => ({ + value: it.ID.toString(), + label: getNameChar(locale, transI18n, it), + imageUrl: `${process.env.CDN_URL}/${baseType?.[it.BaseType]?.Icon}` + }))} + excludeSet={[]} + selectedCustomSet={extraData?.multi_path?.main?.toString() || ""} + placeholder={transI18n("selectAMainStat")} + setSelectedCustomSet={(it) => { + if (!it) return + setExtraData({ + ...extraData, + multi_path: { + march_7: extraData?.multi_path?.march_7 || 1001, + main: Number(it) || 8001, + multi_path_main: extraData?.multi_path?.multi_path_main || [], + multi_path_march_7: extraData?.multi_path?.multi_path_march_7 || [] + }, + lua: extraData?.lua || null + }) + }} + /> +
    + +
    +
    + + {transI18n("march7Path")} +
    + extraData?.multi_path?.multi_path_march_7?.includes(Number(it.ID))).map((it) => ({ + value: it.ID.toString(), + label: getNameChar(locale, transI18n, it), + imageUrl: `${process.env.CDN_URL}/${baseType?.[it.BaseType]?.Icon}` + }))} + excludeSet={[]} + selectedCustomSet={extraData?.multi_path?.march_7?.toString() || ""} + placeholder={transI18n("selectAMainStat")} + setSelectedCustomSet={(it) => { + if (!it) return + setExtraData({ + ...extraData, + multi_path: { + march_7: Number(it) || 1001, + main: extraData?.multi_path?.main || 8001, + multi_path_main: extraData?.multi_path?.multi_path_main || [], + multi_path_march_7: extraData?.multi_path?.multi_path_march_7 || [] + }, + lua: extraData?.lua || null + }) + }} + /> +
    +
    + )} +
    + + {/* CHALLENGE */} +
    +
    +

    + {transI18n("challenge")} +

    +
    + +
    +
    +
    +
    + + {transI18n("anomalyArbitration")} +
    +
    + +
    +
    + +
    + +
    +
    +
    + + {transI18n("skipNode")} +
    +
    + +
    +
    + +
    +
    +
    + + {/* EXTRA FEATURES */} +
    +
    +

    + {transI18n("extraFeatures")} +

    +
    + +
    + {extraData?.setting?.hide_ui !== undefined && ( +
    +
    + {extraData?.setting?.hide_ui + ? + : + } + {transI18n("hideUI")} +
    + +
    +
    + + + setExtraData({ + ...extraData, + setting: { + hide_ui: e.target.checked, + censorship: extraData?.setting?.censorship || false, + cm: extraData?.setting?.cm || false, + first_person: extraData?.setting?.first_person || false + } + }) + } + /> +
    + )} + + {extraData?.setting?.censorship !== undefined && ( +
    +
    + + {transI18n("disableCensorship")} +
    + +
    +
    + + + setExtraData({ + ...extraData, + setting: { + censorship: e.target.checked, + hide_ui: extraData?.setting?.hide_ui || false, + cm: extraData?.setting?.cm || false, + first_person: extraData?.setting?.first_person || false + } + }) + } + /> +
    + )} +
    +
    + + {/* LUA EDITOR */} +
    +
    +
    + +

    Lua Scripting

    +
    + setIsEnableLua(e.target.checked)} + /> +
    + + {isEnableLua && ( +
    + + setExtraData({ + ...extraData, + lua: code + }) + } + highlight={(code) => Prism.highlight(code, Prism.languages.lua, "lua")} + padding={16} + textareaClassName="outline-none font-mono" + className="text-xs font-mono min-h-60 bg-[#161822] text-white" + style={{ + background: "#161822", + color: "#e2e8f0", + }} + /> +
    + )} +
    +
    + ) +} diff --git a/src/components/footer/index.tsx b/src/components/footer/index.tsx index e9fb058..507911b 100644 --- a/src/components/footer/index.tsx +++ b/src/components/footer/index.tsx @@ -1,9 +1,18 @@ -export default function Footer() { - return ( -
    - -
    - ) -} +export default function Footer() { + return ( +
    +
    +
    + Firefly Shelter + • + S Game Toolkit +
    +
    + © {new Date().getFullYear()} + • + Next.js & DaisyUI +
    +
    +
    + ) +} diff --git a/src/components/header/index.tsx b/src/components/header/index.tsx index 8e31aa4..6da08a6 100644 --- a/src/components/header/index.tsx +++ b/src/components/header/index.tsx @@ -1,81 +1,121 @@ -/* eslint-disable react-hooks/exhaustive-deps */ -"use client" -import { downloadJson } from "@/helper"; -import { converterToFreeSRJson } from "@/helper/converterToFreeSRJson"; -import { useChangeTheme } from "@/hooks/useChangeTheme"; -import { listCurrentLanguage, listCurrentLanguageApi } from "@/constant/constant"; -import useLocaleStore from "@/stores/localeStore"; -import useUserDataStore from "@/stores/userDataStore"; -import { motion } from "framer-motion"; -import { useTranslations } from "next-intl"; -import { useRouter } from "next/navigation"; -import { useEffect, useState } from "react"; -import EnkaImport from "../importBar/enka"; -import useModelStore from "@/stores/modelStore"; -import FreeSRImport from "../importBar/freesr"; -import { toast } from "react-toastify"; -import { micsSchema } from "@/zod"; -import useGlobalStore from "@/stores/globalStore"; -import MonsterBar from "../monsterBar"; -import Image from "next/image"; -import ConnectBar from "../connectBar"; -import ExtraSettingBar from "../extraSettingBar"; -import ChangelogBar from "../changelog"; -import { ModalConfig } from "@/types"; -import { ScrollText } from "lucide-react"; - -const themes = [ - { label: "Winter" }, - { label: "Night" }, - { label: "Cupcake" }, - { label: "Coffee" }, -]; - -export default function Header() { - const { changeTheme } = useChangeTheme() - const { locale, setLocale } = useLocaleStore() - const { - avatars, - battle_type, - setAvatars, - setBattleType, - moc_config, - pf_config, - as_config, - ce_config, - peak_config, - setMocConfig, - setPfConfig, - setAsConfig, - setCeConfig, - setPeakConfig, - } = useUserDataStore() - - const router = useRouter() - const transI18n = useTranslations("DataPage") - const { - setIsOpenImport, - isOpenImport, - setIsOpenMonster, - isOpenMonster, - setIsOpenConnect, - isOpenConnect, - setIsOpenExtra, - isOpenExtra, - setIsChangelog, - isChangelog - } = useModelStore() - - const [importModal, setImportModal] = useState("enka"); - - const { isConnectPS, extraData } = useGlobalStore() - - useEffect(() => { - - const cookieLocale = document.cookie.split("; ") - .find((row) => row.startsWith("MYNEXTAPP_LOCALE")) - ?.split("=")[1]; - +/* eslint-disable react-hooks/exhaustive-deps */ +"use client" +import { downloadJson } from "@/helper"; +import { converterToFreeSRJson } from "@/helper/converterToFreeSRJson"; +import { useChangeTheme } from "@/hooks/useChangeTheme"; +import { listCurrentLanguage, listCurrentLanguageApi } from "@/constant/constant"; +import useLocaleStore from "@/stores/localeStore"; +import useUserDataStore from "@/stores/userDataStore"; +import { useTranslations } from "next-intl"; +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; +import EnkaImport from "../importBar/enka"; +import useModelStore from "@/stores/modelStore"; +import FreeSRImport from "../importBar/freesr"; +import { toast } from "react-toastify"; +import { micsSchema } from "@/zod"; +import useGlobalStore from "@/stores/globalStore"; +import MonsterBar from "../monsterBar"; +import Image from "next/image"; +import ConnectBar from "../connectBar"; +import ExtraSettingBar from "../extraSettingBar"; +import ChangelogBar from "../changelog"; +import { ModalConfig } from "@/types"; +import { ScrollText } from "lucide-react"; +import { useShallow } from "zustand/react/shallow"; + +const themes = [ + { label: "Winter" }, + { label: "Night" }, + { label: "Cupcake" }, + { label: "Coffee" }, +]; + +export default function Header() { + const { changeTheme } = useChangeTheme() + const { locale, setLocale } = useLocaleStore( + useShallow((state) => ({ + locale: state.locale, + setLocale: state.setLocale, + })) + ) + const { + avatars, + battle_type, + setAvatars, + setBattleType, + moc_config, + pf_config, + as_config, + ce_config, + peak_config, + setMocConfig, + setPfConfig, + setAsConfig, + setCeConfig, + setPeakConfig, + } = useUserDataStore( + useShallow((state) => ({ + avatars: state.avatars, + battle_type: state.battle_type, + setAvatars: state.setAvatars, + setBattleType: state.setBattleType, + moc_config: state.moc_config, + pf_config: state.pf_config, + as_config: state.as_config, + ce_config: state.ce_config, + peak_config: state.peak_config, + setMocConfig: state.setMocConfig, + setPfConfig: state.setPfConfig, + setAsConfig: state.setAsConfig, + setCeConfig: state.setCeConfig, + setPeakConfig: state.setPeakConfig, + })) + ) + + const router = useRouter() + const transI18n = useTranslations("DataPage") + const { + setIsOpenImport, + isOpenImport, + setIsOpenMonster, + isOpenMonster, + setIsOpenConnect, + isOpenConnect, + setIsOpenExtra, + isOpenExtra, + setIsChangelog, + isChangelog + } = useModelStore( + useShallow((state) => ({ + setIsOpenImport: state.setIsOpenImport, + isOpenImport: state.isOpenImport, + setIsOpenMonster: state.setIsOpenMonster, + isOpenMonster: state.isOpenMonster, + setIsOpenConnect: state.setIsOpenConnect, + isOpenConnect: state.isOpenConnect, + setIsOpenExtra: state.setIsOpenExtra, + isOpenExtra: state.isOpenExtra, + setIsChangelog: state.setIsChangelog, + isChangelog: state.isChangelog, + })) + ) + + const [importModal, setImportModal] = useState("enka"); + + const { isConnectPS, extraData } = useGlobalStore( + useShallow((state) => ({ + isConnectPS: state.isConnectPS, + extraData: state.extraData, + })) + ) + + useEffect(() => { + + const cookieLocale = document.cookie.split("; ") + .find((row) => row.startsWith("MYNEXTAPP_LOCALE")) + ?.split("=")[1]; + if (cookieLocale) { if (!listCurrentLanguageApi.hasOwnProperty(cookieLocale)) { setLocale("en") @@ -85,535 +125,535 @@ export default function Header() { setLocale(cookieLocale) } - } else { - let browserLocale = navigator.language.slice(0, 2); - - if (!listCurrentLanguageApi.hasOwnProperty(browserLocale)) { - browserLocale = "en" - } - setLocale(browserLocale); - document.cookie = `MYNEXTAPP_LOCALE=${browserLocale};` - router.refresh() - } - }, [router, setLocale]) - - const changeLocale = (newLocale: string) => { - setLocale(newLocale) - document.cookie = `MYNEXTAPP_LOCALE=${newLocale};` - router.refresh() - } - - const handleShow = (modalId: string) => { - const modal = document.getElementById(modalId) as HTMLDialogElement | null; - if (modal) { - modal.showModal(); - } - }; - - // Close modal handler - const handleCloseModal = (modalId: string) => { - const modal = document.getElementById(modalId) as HTMLDialogElement | null; - if (modal) { - modal.close() - } - }; - - const modalConfigs: ModalConfig[] = [ - { - id: "connect_modal", - title: transI18n("psConnection"), - isOpen: isOpenConnect, - onClose: () => { - setIsOpenConnect(false) - handleCloseModal("connect_modal") - }, - content: - }, - { - id: "import_modal", - title: transI18n("importSetting"), - isOpen: isOpenImport, - onClose: () => { - setIsOpenImport(false) - handleCloseModal("import_modal") - }, - content: ( - <> - {importModal === "enka" && } - {importModal === "freesr" && } - - ) - }, - { - id: "monster_modal", - title: transI18n("monsterSetting"), - isOpen: isOpenMonster, - onClose: () => { - setIsOpenMonster(false) - handleCloseModal("monster_modal") - }, - content: - }, - { - id: "extra_modal", - title: transI18n("extraSetting"), - isOpen: isOpenExtra, - onClose: () => { - setIsOpenExtra(false) - handleCloseModal("extra_modal") - }, - content: - }, - { - id: "changelog_modal", - title: "Changelog", - isOpen: isChangelog, - onClose: () => { - setIsChangelog(false) - handleCloseModal("changelog_modal") - }, - content: - } - ] - - // Handle ESC key to close modal - useEffect(() => { - for (const item of modalConfigs) { - if (!item?.isOpen) { - handleCloseModal(item?.id || "") - } else { - handleShow(item?.id || "") - } - } - const handleEscKey = (event: KeyboardEvent) => { - if (event.key === 'Escape') { - for (const item of modalConfigs) { - handleCloseModal(item?.id || "") - } - } - }; - - window.addEventListener('keydown', handleEscKey); - return () => window.removeEventListener('keydown', handleEscKey); - }, [isOpenImport, isOpenMonster, isOpenConnect, isOpenExtra, isChangelog]); - - const handleImportDatabase = (event: React.ChangeEvent) => { - - const file = event.target.files?.[0]; - if (!file) { - toast.error(transI18n("pleaseSelectAFile")) - return - } - if (!file.name.endsWith(".json") || file.type !== "application/json") { - toast.error(transI18n("fileMustBeAValidJsonFile")) - return - } - - if (file) { - - const reader = new FileReader(); - reader.onload = (e) => { - try { - const data = JSON.parse(e.target?.result as string); - const parsed = micsSchema.parse(data) - setAvatars(parsed.avatars) - setBattleType(parsed.battle_type) - setMocConfig(parsed.moc_config) - setPfConfig(parsed.pf_config) - setAsConfig(parsed.as_config) - setCeConfig(parsed.ce_config) - setPeakConfig(parsed.peak_config) - toast.success(transI18n("importDatabaseSuccess")) - } catch { - toast.error(transI18n("fileMustBeAValidJsonFile")) - } - }; - reader.readAsText(file); - } - - }; - - return ( -
    -
    - {/* Mobile menu dropdown */} -
    -
    - - - -
    - -
    - - {/* Logo */} - - -
    - Logo -
    -

    - Firefly Sr - - Tools - -

    -

    Firefly Shelter

    -
    -
    -
    - -
    - - {/* Desktop navigation */} -
    - -
    - - {/* Right side items */} -
    -
    -
    -
    - {isConnectPS ? transI18n("connected") : transI18n("unconnected")} -
    -
    -
    -
    - -
    { - setIsChangelog(true) - }} - > - -
    - - {/* Language selector - REFINED */} -
    - {/* Nút bấm hiển thị */} -
    - - - - - {listCurrentLanguage[locale as keyof typeof listCurrentLanguage]?.flag || "EN"} - - - - -
    - -
      - {Object.entries(listCurrentLanguage).map(([key, value]) => ( -
    • - -
    • - ))} -
    -
    -
    -
    - - - - - - -
    - -
    -
      - {themes.map((theme) => ( -
    • { - if (changeTheme) changeTheme(theme.label.toLowerCase()); - }} - > - -
    • - ))} -
    -
    -
    -
    - - {modalConfigs?.map(({ id, title, onClose, content }) => ( - -
    -
    - - ✕ - -
    - -
    -

    - {title} -

    -
    - - {content} -
    -
    - ))} -
    - ) + } else { + let browserLocale = navigator.language.slice(0, 2); + + if (!listCurrentLanguageApi.hasOwnProperty(browserLocale)) { + browserLocale = "en" + } + setLocale(browserLocale); + document.cookie = `MYNEXTAPP_LOCALE=${browserLocale};` + router.refresh() + } + }, [router, setLocale]) + + const changeLocale = (newLocale: string) => { + setLocale(newLocale) + document.cookie = `MYNEXTAPP_LOCALE=${newLocale};` + router.refresh() + } + + const handleShow = (modalId: string) => { + const modal = document.getElementById(modalId) as HTMLDialogElement | null; + if (modal) { + modal.showModal(); + } + }; + + // Close modal handler + const handleCloseModal = (modalId: string) => { + const modal = document.getElementById(modalId) as HTMLDialogElement | null; + if (modal) { + modal.close() + } + }; + + const modalConfigs: ModalConfig[] = [ + { + id: "connect_modal", + title: transI18n("psConnection"), + isOpen: isOpenConnect, + onClose: () => { + setIsOpenConnect(false) + handleCloseModal("connect_modal") + }, + content: + }, + { + id: "import_modal", + title: transI18n("importSetting"), + isOpen: isOpenImport, + onClose: () => { + setIsOpenImport(false) + handleCloseModal("import_modal") + }, + content: ( + <> + {importModal === "enka" && } + {importModal === "freesr" && } + + ) + }, + { + id: "monster_modal", + title: transI18n("monsterSetting"), + isOpen: isOpenMonster, + onClose: () => { + setIsOpenMonster(false) + handleCloseModal("monster_modal") + }, + content: + }, + { + id: "extra_modal", + title: transI18n("extraSetting"), + isOpen: isOpenExtra, + onClose: () => { + setIsOpenExtra(false) + handleCloseModal("extra_modal") + }, + content: + }, + { + id: "changelog_modal", + title: "Changelog", + isOpen: isChangelog, + onClose: () => { + setIsChangelog(false) + handleCloseModal("changelog_modal") + }, + content: + } + ] + + // Handle ESC key to close modal + useEffect(() => { + for (const item of modalConfigs) { + if (!item?.isOpen) { + handleCloseModal(item?.id || "") + } else { + handleShow(item?.id || "") + } + } + const handleEscKey = (event: KeyboardEvent) => { + if (event.key === 'Escape') { + for (const item of modalConfigs) { + handleCloseModal(item?.id || "") + } + } + }; + + window.addEventListener('keydown', handleEscKey); + return () => window.removeEventListener('keydown', handleEscKey); + }, [isOpenImport, isOpenMonster, isOpenConnect, isOpenExtra, isChangelog]); + + const handleImportDatabase = (event: React.ChangeEvent) => { + + const file = event.target.files?.[0]; + if (!file) { + toast.error(transI18n("pleaseSelectAFile")) + return + } + if (!file.name.endsWith(".json") || file.type !== "application/json") { + toast.error(transI18n("fileMustBeAValidJsonFile")) + return + } + + if (file) { + + const reader = new FileReader(); + reader.onload = (e) => { + try { + const data = JSON.parse(e.target?.result as string); + const parsed = micsSchema.parse(data) + setAvatars(parsed.avatars) + setBattleType(parsed.battle_type) + setMocConfig(parsed.moc_config) + setPfConfig(parsed.pf_config) + setAsConfig(parsed.as_config) + setCeConfig(parsed.ce_config) + setPeakConfig(parsed.peak_config) + toast.success(transI18n("importDatabaseSuccess")) + } catch { + toast.error(transI18n("fileMustBeAValidJsonFile")) + } + }; + reader.readAsText(file); + } + + }; + + return ( +
    +
    +
    + {/* Mobile menu dropdown */} +
    +
    + + + +
    + +
    + + {/* Brand Logo */} + +
    +
    + Logo +
    +
    +

    + Firefly + + SrTools + +

    +

    Firefly Shelter

    +
    +
    +
    + + {/* Desktop navigation */} +
    + +
    + + {/* Right side items */} +
    + {/* PS Connection Status Badge */} +
    +
    + + {isConnectPS && ( + + )} + + + + {isConnectPS ? transI18n("connected") : transI18n("unconnected")} + +
    +
    + + {/* View Logs Button */} + + + {/* Language selector */} +
    +
    + {listCurrentLanguage[locale as keyof typeof listCurrentLanguage]?.flag || "EN"} + + + +
    + +
      + {Object.entries(listCurrentLanguage).map(([key, value]) => ( +
    • + +
    • + ))} +
    +
    + + {/* Theme selector */} +
    +
    + + + +
    + +
    +
      + {themes.map((theme) => ( +
    • { + if (changeTheme) changeTheme(theme.label.toLowerCase()); + }} + > + +
    • + ))} +
    +
    +
    +
    +
    + + {/* Modals */} + {modalConfigs?.map(({ id, title, onClose, content }) => ( + +
    + {/* Modal Header */} +
    +

    + {title} +

    + +
    + + {/* Modal Body */} +
    + {content} +
    +
    +
    + +
    +
    + ))} +
    + ) } diff --git a/src/components/importBar/copy.tsx b/src/components/importBar/copy.tsx index 3f542e6..2ec7a00 100644 --- a/src/components/importBar/copy.tsx +++ b/src/components/importBar/copy.tsx @@ -1,74 +1,107 @@ -"use client" -import useUserDataStore from "@/stores/userDataStore"; -import { useState, useMemo } from "react"; -import useCopyProfileStore from "@/stores/copyProfile"; -import ProfileCard from "../card/profileCard"; -import { AvatarProfileCardType, AvatarProfileStore } from "@/types"; -import Image from "next/image"; -import { getNameChar, calcRarity } from "@/helper"; -import useLocaleStore from "@/stores/localeStore"; -import { useTranslations } from "next-intl"; -import SelectCustomImage from "../select/customSelectImage"; -import useCurrentDataStore from "@/stores/currentDataStore"; -import useDetailDataStore from "@/stores/detailDataStore"; - -export default function CopyImport() { - const { avatars, setAvatar } = useUserDataStore(); - const { avatarSelected } = useCurrentDataStore() - const { mapAvatar, baseType, damageType } = useDetailDataStore() - const { locale } = useLocaleStore() - const { - selectedProfiles, - avatarCopySelected, - setSelectedProfiles, - setAvatarCopySelected, - listElement, - listPath, - listRank, - setListElement, - setListPath, - setListRank - } = useCopyProfileStore() - const transI18n = useTranslations("DataPage") - - const [message, setMessage] = useState({ - type: "", - text: "" - }) - - const listAvatar = useMemo(() => { - if (!mapAvatar || !locale || !transI18n) return [] - let list = Object.values(mapAvatar); - const allElementFalse = !Object.values(listElement).some(v => v) - const allPathFalse = !Object.values(listPath).some(v => v) - const allRarityFalse = !Object.values(listRank).some(v => v) - list = list.filter(item => (allElementFalse || listElement[item.DamageType]) && (allPathFalse || listPath[item.BaseType]) && (allRarityFalse || listRank[calcRarity(item.Rarity)])) - list.sort((a, b) => { - const r = calcRarity(b.Rarity) - calcRarity(a.Rarity) - if (r !== 0) return r - return a.ID - b.ID - }) - return list - }, [mapAvatar, listElement, listPath, listRank, locale, transI18n]) - - - const handleProfileToggle = (profile: AvatarProfileCardType) => { - if (selectedProfiles.some((selectedProfile) => selectedProfile.key === profile.key)) { - setSelectedProfiles(selectedProfiles.filter((selectedProfile) => selectedProfile.key !== profile.key)); - return; - } - setSelectedProfiles([...selectedProfiles, profile]); - }; - - - const clearSelection = () => { - setSelectedProfiles([]); - setMessage({ - type: "success", - text: transI18n("clearAll") - }) - }; - +"use client" +import useUserDataStore from "@/stores/userDataStore"; +import { useState, useMemo } from "react"; +import useCopyProfileStore from "@/stores/copyProfile"; +import ProfileCard from "../card/profileCard"; +import { AvatarProfileCardType, AvatarProfileStore } from "@/types"; +import Image from "next/image"; +import { getNameChar, calcRarity } from "@/helper"; +import useLocaleStore from "@/stores/localeStore"; +import { useTranslations } from "next-intl"; +import SelectCustomImage from "../select/customSelectImage"; +import useCurrentDataStore from "@/stores/currentDataStore"; +import useDetailDataStore from "@/stores/detailDataStore"; +import { useShallow } from "zustand/react/shallow"; + +export default function CopyImport() { + const { avatars, setAvatar } = useUserDataStore( + useShallow((state) => ({ + avatars: state.avatars, + setAvatar: state.setAvatar, + })) + ); + const { avatarSelected } = useCurrentDataStore( + useShallow((state) => ({ + avatarSelected: state.avatarSelected, + })) + ); + const { mapAvatar, baseType, damageType } = useDetailDataStore( + useShallow((state) => ({ + mapAvatar: state.mapAvatar, + baseType: state.baseType, + damageType: state.damageType, + })) + ); + const { locale } = useLocaleStore( + useShallow((state) => ({ + locale: state.locale, + })) + ); + const { + selectedProfiles, + avatarCopySelected, + setSelectedProfiles, + setAvatarCopySelected, + listElement, + listPath, + listRank, + setListElement, + setListPath, + setListRank + } = useCopyProfileStore( + useShallow((state) => ({ + selectedProfiles: state.selectedProfiles, + avatarCopySelected: state.avatarCopySelected, + setSelectedProfiles: state.setSelectedProfiles, + setAvatarCopySelected: state.setAvatarCopySelected, + listElement: state.listElement, + listPath: state.listPath, + listRank: state.listRank, + setListElement: state.setListElement, + setListPath: state.setListPath, + setListRank: state.setListRank, + })) + ); + const transI18n = useTranslations("DataPage") + + const [message, setMessage] = useState({ + type: "", + text: "" + }) + + const listAvatar = useMemo(() => { + if (!mapAvatar || !locale || !transI18n) return [] + let list = Object.values(mapAvatar); + const allElementFalse = !Object.values(listElement).some(v => v) + const allPathFalse = !Object.values(listPath).some(v => v) + const allRarityFalse = !Object.values(listRank).some(v => v) + list = list.filter(item => (allElementFalse || listElement[item.DamageType]) && (allPathFalse || listPath[item.BaseType]) && (allRarityFalse || listRank[calcRarity(item.Rarity)])) + list.sort((a, b) => { + const r = calcRarity(b.Rarity) - calcRarity(a.Rarity) + if (r !== 0) return r + return a.ID - b.ID + }) + return list + }, [mapAvatar, listElement, listPath, listRank, locale, transI18n]) + + + const handleProfileToggle = (profile: AvatarProfileCardType) => { + if (selectedProfiles.some((selectedProfile) => selectedProfile.key === profile.key)) { + setSelectedProfiles(selectedProfiles.filter((selectedProfile) => selectedProfile.key !== profile.key)); + return; + } + setSelectedProfiles([...selectedProfiles, profile]); + }; + + + const clearSelection = () => { + setSelectedProfiles([]); + setMessage({ + type: "success", + text: transI18n("clearAll") + }) + }; + const selectAll = () => { if (avatarCopySelected) { const sourceAvatar = avatars[avatarCopySelected.ID.toString()] @@ -79,32 +112,32 @@ export default function CopyImport() { return null; } return { - key: index, - ...profile, - } as AvatarProfileCardType - }).filter((profile) => profile !== null)); - } - setMessage({ - type: "success", - text: transI18n("selectAll") - }) - }; - - const handleCopy = () => { - if (selectedProfiles.length === 0) { - setMessage({ - type: "error", - text: transI18n("pleaseSelectAtLeastOneProfile") - }); - return; - } - if (!avatarCopySelected) { - setMessage({ - type: "error", - text: transI18n("noAvatarToCopySelected") - }); - return; - } + key: index, + ...profile, + } as AvatarProfileCardType + }).filter((profile) => profile !== null)); + } + setMessage({ + type: "success", + text: transI18n("selectAll") + }) + }; + + const handleCopy = () => { + if (selectedProfiles.length === 0) { + setMessage({ + type: "error", + text: transI18n("pleaseSelectAtLeastOneProfile") + }); + return; + } + if (!avatarCopySelected) { + setMessage({ + type: "error", + text: transI18n("noAvatarToCopySelected") + }); + return; + } if (!avatarSelected) { setMessage({ type: "error", @@ -129,181 +162,205 @@ export default function CopyImport() { if (!selectedKeys.has(index) || (!profile.lightcone?.item_id && Object.keys(profile.relics ?? {}).length == 0)) { return null; } - return { - ...profile, - profile_name: profile.profile_name + ` - Copy: ${avatarCopySelected?.ID}`, - } as AvatarProfileStore - }).filter((profile) => profile !== null); + const cloned = structuredClone(profile); + cloned.profile_name = profile.profile_name + ` - Copy: ${avatarCopySelected?.ID}`; + return cloned as AvatarProfileStore; + }).filter((profile): profile is AvatarProfileStore => profile !== null); const newAvatar = { ...targetAvatar, - profileList: targetAvatar.profileList.concat(newListProfile), + profileList: [...targetAvatar.profileList, ...newListProfile], profileSelect: targetAvatar.profileList.length + newListProfile.length - 1, } - setAvatar(newAvatar); - setSelectedProfiles([]); - setMessage({ - type: "success", - text: transI18n("copied") - }); - }; - - return ( -
    -
    - {/* Header */} -
    - -
    - -
    -
    {transI18n("filter")}
    -
    - {/* Path */} -
    -
    - {Object.entries(baseType).filter(([key]) => key !== "").map(([key, value]) => ( -
    { - setListPath({ ...listPath, [key]: !listPath[key] }) - }} - className="w-12.5 h-12.5 hover:bg-gray-600 grid items-center justify-items-center rounded-md shadow-md cursor-pointer" - style={{ - backgroundColor: listPath[key] ? "#374151" : "#6B7280" - }}> - {key} -
    - ))} -
    -
    - - {/* Element */} -
    -
    - {Object.entries(damageType).filter(([key]) => key !== "").map(([key, value]) => ( -
    { - setListElement({ ...listElement, [key]: !listElement[key] }) - }} - className="w-12.5 h-12.5 hover:bg-gray-600 grid items-center justify-items-center rounded-md shadow-md cursor-pointer" - style={{ - backgroundColor: listElement[key] ? "#374151" : "#6B7280" - }}> - {key} -
    - ))} -
    -
    - - {/* Rank */} -
    -
    - {Object.entries(listRank).map(([key], index) => ( -
    { - setListRank({ ...listRank, [key]: !listRank[key] }) - }} - className="w-12.5 h-12.5 hover:bg-gray-600 grid items-center justify-items-center rounded-md shadow-md cursor-pointer" - style={{ - backgroundColor: listRank[key] ? "#374151" : "#6B7280" - }}> -
    {key}*
    -
    - ))} -
    -
    -
    - -
    -
    - - {listAvatar.length > 0 && ( -
    -
    {transI18n("characterName")}
    - ({ - value: avatar.ID.toString(), - label: getNameChar(locale, transI18n, avatar), - imageUrl: `${process.env.CDN_URL}/${avatar.Image.AvatarIconPath}` - }))} - excludeSet={[]} - selectedCustomSet={avatarCopySelected?.ID.toString() || ""} - placeholder="Character Select" - setSelectedCustomSet={(value) => setAvatarCopySelected(mapAvatar[value] || null)} - /> -
    - )} - -
    -
    - - - - {/* Selection Info */} -
    - - {transI18n("selectedProfiles")}: {selectedProfiles.length} - - - - {selectedProfiles.length > 0 && ( - - )} -
    - {message.type && message.text && ( -
    {message.type == "error" ? "😭" : "🎉"} {message.text}
    - )} -
    - - {/* Character Grid */} -
    + setAvatar(newAvatar); + setSelectedProfiles([]); + setMessage({ + type: "success", + text: transI18n("copied") + }); + }; + + return ( +
    +
    + {/* Header & Filters Card */} +
    + {/* Filters Section */} +
    +
    {transI18n("filter")}
    + +
    + {/* Path Filters */} +
    + {Object.entries(baseType).filter(([key]) => key !== "").map(([key, value]) => { + const isActive = !!listPath[key]; + return ( + + ); + })} +
    + +
    + + {/* Element Filters */} +
    + {Object.entries(damageType).filter(([key]) => key !== "").map(([key, value]) => { + const isActive = !!listElement[key]; + return ( + + ); + })} +
    + +
    + + {/* Rank Filters */} +
    + {Object.entries(listRank).map(([key], index) => { + const isActive = !!listRank[key]; + return ( + + ); + })} +
    +
    +
    + + {/* Character Select Dropdown */} + {listAvatar.length > 0 && ( +
    +
    {transI18n("characterName")}
    + ({ + value: avatar.ID.toString(), + label: getNameChar(locale, transI18n, avatar), + imageUrl: `${process.env.CDN_URL}/${avatar.Image.AvatarIconPath}` + }))} + excludeSet={[]} + selectedCustomSet={avatarCopySelected?.ID.toString() || ""} + placeholder="Character Select" + setSelectedCustomSet={(value) => setAvatarCopySelected(mapAvatar[value] || null)} + /> +
    + )} +
    + + {/* Selection Action Bar */} +
    +
    + + {transI18n("selectedProfiles")}: + + + {selectedProfiles.length} + +
    + +
    + + + {selectedProfiles.length > 0 && ( + + )} +
    +
    + + {message.type && message.text && ( +
    + {message.type === "error" ? "⚠️" : "🎉"} + {message.text} +
    + )} + + {/* Character Grid */} +
    {avatarCopySelected && avatars[avatarCopySelected?.ID.toString()]?.profileList.map((profile, index) => { if (!profile.lightcone?.item_id && Object.keys(profile.relics ?? {}).length == 0) { - return null; - } - return ( - - ) - })} -
    -
    -
    - ) + return null; + } + return ( + + ) + })} +
    +
    +
    + ) } diff --git a/src/components/importBar/enka.tsx b/src/components/importBar/enka.tsx index fe03804..ec1cebf 100644 --- a/src/components/importBar/enka.tsx +++ b/src/components/importBar/enka.tsx @@ -1,10 +1,10 @@ -"use client" -import { useState } from "react"; -import CharacterInfoCard from "../card/characterInfoCard"; -import useEnkaStore from "@/stores/enkaStore"; -import { SendDataThroughProxy } from "@/lib/api/api"; -import { CharacterInfoCardType, EnkaResponse } from "@/types"; -import useUserDataStore from "@/stores/userDataStore"; +"use client" +import { useState } from "react"; +import CharacterInfoCard from "../card/characterInfoCard"; +import useEnkaStore from "@/stores/enkaStore"; +import { SendDataThroughProxy } from "@/lib/api/api"; +import { CharacterInfoCardType, EnkaResponse } from "@/types"; +import useUserDataStore from "@/stores/userDataStore"; import { converterOneEnkaDataToAvatarStore } from "@/helper"; import useModelStore from "@/stores/modelStore"; import { toast } from "react-toastify"; @@ -12,6 +12,7 @@ import { useTranslations } from "next-intl"; import { avatarEnkaDetailSchema, enkaResponseSchema } from "@/zod"; import { z } from "zod"; import useDetailDataStore from "@/stores/detailDataStore"; +import { useShallow } from "zustand/react/shallow"; type AvatarEnkaDetailInput = z.infer; @@ -31,24 +32,46 @@ const toCharacterInfoCard = (character: AvatarEnkaDetailInput): CharacterInfoCar relic_set_id: parseInt(relic.tid.toString().slice(1, -1), 10), })), }); - -export default function EnkaImport() { - const { - uidInput, - setUidInput, - enkaData, - selectedCharacters, - setSelectedCharacters, - setEnkaData, - } = useEnkaStore(); - const transI18n = useTranslations("DataPage") - const { avatars, setAvatar } = useUserDataStore(); - const { setIsOpenImport } = useModelStore() - const { mapAvatar } = useDetailDataStore() + +export default function EnkaImport() { + const { + uidInput, + setUidInput, + enkaData, + selectedCharacters, + setSelectedCharacters, + setEnkaData, + } = useEnkaStore( + useShallow((state) => ({ + uidInput: state.uidInput, + setUidInput: state.setUidInput, + enkaData: state.enkaData, + selectedCharacters: state.selectedCharacters, + setSelectedCharacters: state.setSelectedCharacters, + setEnkaData: state.setEnkaData, + })) + ); + const transI18n = useTranslations("DataPage") + const { avatars, setAvatar } = useUserDataStore( + useShallow((state) => ({ + avatars: state.avatars, + setAvatar: state.setAvatar, + })) + ); + const { setIsOpenImport } = useModelStore( + useShallow((state) => ({ + setIsOpenImport: state.setIsOpenImport, + })) + ) + const { mapAvatar } = useDetailDataStore( + useShallow((state) => ({ + mapAvatar: state.mapAvatar, + })) + ) const [isLoading, setIsLoading] = useState(false) const [Error, setError] = useState("") const validCharacters = enkaData?.detailInfo.avatarDetailList.filter((character) => mapAvatar?.[character.avatarId]) ?? [] - + const handlerFetchData = async () => { if (!uidInput) { setError(transI18n("pleaseEnterUid")) @@ -77,36 +100,36 @@ export default function EnkaImport() { setIsLoading(false) } } - - const handleCharacterToggle = (character: CharacterInfoCardType) => { - if (selectedCharacters.some((selectedCharacter) => selectedCharacter.key === character.key)) { - setSelectedCharacters(selectedCharacters.filter((selectedCharacter) => selectedCharacter.key !== character.key)); - return; - } - setSelectedCharacters([...selectedCharacters, character]); - }; - - const clearSelection = () => { - setSelectedCharacters([]); - }; - + + const handleCharacterToggle = (character: CharacterInfoCardType) => { + if (selectedCharacters.some((selectedCharacter) => selectedCharacter.key === character.key)) { + setSelectedCharacters(selectedCharacters.filter((selectedCharacter) => selectedCharacter.key !== character.key)); + return; + } + setSelectedCharacters([...selectedCharacters, character]); + }; + + const clearSelection = () => { + setSelectedCharacters([]); + }; + const selectAll = () => { if (enkaData) { setSelectedCharacters(validCharacters.map(toCharacterInfoCard)); } }; - - const handleImport = () => { - if (selectedCharacters.length === 0) { - setError(transI18n("pleaseSelectAtLeastOneCharacter")); - return; - } - if (!enkaData) { - setError(transI18n("noDataToImport")); - return; - } - setError(""); - const listAvatars = { ...avatars } + + const handleImport = () => { + if (selectedCharacters.length === 0) { + setError(transI18n("pleaseSelectAtLeastOneCharacter")); + return; + } + if (!enkaData) { + setError(transI18n("noDataToImport")); + return; + } + setError(""); + const listAvatars = { ...avatars } const parsed = enkaResponseSchema.safeParse(enkaData) if (!parsed.success) { setError(transI18n("failedToFetchEnkaData")); @@ -115,90 +138,104 @@ export default function EnkaImport() { const filterData = parsed.data.detailInfo.avatarDetailList.filter((character) => mapAvatar?.[character.avatarId] && selectedCharacters.some((selectedCharacter) => selectedCharacter.avatar_id === character.avatarId)) filterData.forEach((character) => { - const newAvatar = { ...listAvatars[character.avatarId.toString()] } - if (Object.keys(newAvatar).length !== 0) { - newAvatar.level = character.level ?? 0 - newAvatar.promotion = character.promotion ?? 0 - newAvatar.data = { - rank: character.rank ?? 0, - skills: character.skillTreeList.reduce((acc, skill) => { - acc[skill.pointId] = skill.level; - return acc; - }, {} as Record), - } - const newProfile = converterOneEnkaDataToAvatarStore(character, newAvatar.profileList.length) - if (newProfile) { - newAvatar.profileList.push(newProfile) - newAvatar.profileSelect = newAvatar.profileList.length - 1 - } - setAvatar(newAvatar) - } - - }) - setIsOpenImport(false) - toast.success(transI18n("importEnkaDataSuccess")) - }; - - return ( -
    -
    - {/* Header */} -
    -

    HSR UID

    - -
    - setUidInput(e.target.value)} - className="bg-slate-800 text-white px-4 py-3 rounded-lg border border-slate-700 flex-1 max-w-md focus:outline-none focus:border-blue-500" - placeholder="Enter UID" - /> - - {selectedCharacters.length > 0 && ( - - )} -
    - {Error && ( -
    😭 {Error}
    - )} - - {/* Player Info */} - {enkaData && ( -
    -
    Name: {enkaData.detailInfo.nickname}
    -
    UID: {enkaData.detailInfo.uid}
    -
    Level: {enkaData.detailInfo.level}
    -
    - )} - - {/* Selection Info */} -
    - - {transI18n("selectedCharacters")}: {selectedCharacters.length} - - - -
    -
    - {isLoading && ( -
    -
    -
    - )} - {/* Character Grid */} -
    + const currentAvatar = listAvatars[character.avatarId.toString()] + if (currentAvatar && Object.keys(currentAvatar).length !== 0) { + const newProfileList = [...(currentAvatar.profileList || [])] + const newProfile = converterOneEnkaDataToAvatarStore(character, newProfileList.length) + if (newProfile) { + newProfileList.push(newProfile) + } + const newAvatar = { + ...currentAvatar, + level: character.level ?? 0, + promotion: character.promotion ?? 0, + data: { + rank: character.rank ?? 0, + skills: character.skillTreeList.reduce((acc, skill) => { + acc[skill.pointId] = skill.level; + return acc; + }, {} as Record), + }, + profileList: newProfileList, + profileSelect: newProfile ? newProfileList.length - 1 : currentAvatar.profileSelect, + } + setAvatar(newAvatar) + } + }) + setIsOpenImport(false) + toast.success(transI18n("importEnkaDataSuccess")) + }; + + return ( +
    +
    + {/* Header */} +
    +

    HSR UID

    + +
    + setUidInput(e.target.value)} + className="input input-bordered w-full max-w-xs rounded-xl bg-base-200 border-base-300 text-sm focus:border-primary" + placeholder="Enter UID" + /> + + {selectedCharacters.length > 0 && ( + + )} +
    + {Error && ( +
    😭 {Error}
    + )} + + {/* Player Info */} + {enkaData && ( +
    +
    Name: {enkaData.detailInfo.nickname}
    +
    UID: {enkaData.detailInfo.uid}
    +
    Level: {enkaData.detailInfo.level}
    +
    + )} + + {/* Selection Info */} +
    +
    + + {transI18n("selectedCharacters")}: + + + {selectedCharacters.length} + +
    +
    + + +
    +
    +
    + {isLoading && ( +
    +
    +
    + )} + {/* Character Grid */} +
    {validCharacters.map((character) => ( - ))} -
    -
    -
    - ); + ))} +
    +
    +
    + ); } diff --git a/src/components/importBar/freesr.tsx b/src/components/importBar/freesr.tsx index 66a50bf..4312099 100644 --- a/src/components/importBar/freesr.tsx +++ b/src/components/importBar/freesr.tsx @@ -1,228 +1,262 @@ -"use client" - -import useFreeSRStore from "@/stores/freesrStore"; -import useModelStore from "@/stores/modelStore"; -import useUserDataStore from "@/stores/userDataStore"; -import { CharacterInfoCardType } from "@/types"; -import { useState } from "react"; -import CharacterInfoCard from "../card/characterInfoCard"; -import { freeSrJsonSchema } from "@/zod"; -import { toast } from "react-toastify"; -import { converterOneFreeSRDataToAvatarStore } from "@/helper"; -import { useTranslations } from "next-intl"; -import useDetailDataStore from "@/stores/detailDataStore"; -import { z } from "zod"; - -type FreeSRJsonInput = z.infer; - -const toCharacterInfoCard = (data: FreeSRJsonInput, character: FreeSRJsonInput["avatars"][string]): CharacterInfoCardType => { - const lightcone = data.lightcones.find((lightcone) => lightcone.equip_avatar === character.avatar_id) - const relics = data.relics.filter((relic) => relic.equip_avatar === character.avatar_id) - - return { - key: character.avatar_id, - avatar_id: character.avatar_id, - rank: character.data.rank ?? 0, - level: character.level, - lightcone: { - level: lightcone?.level ?? 0, - rank: lightcone?.rank ?? 0, - item_id: lightcone?.item_id ?? 0, - }, - relics: relics.map((relic) => ({ - level: relic.level, - relic_id: relic.relic_id, - relic_set_id: relic.relic_set_id, - })), - } -} - -export default function FreeSRImport() { - const { avatars, setAvatar } = useUserDataStore(); - const { mapAvatar } = useDetailDataStore(); - const { setIsOpenImport } = useModelStore() - const [isLoading, setIsLoading] = useState(false) - const [Error, setError] = useState("") - const { freeSRData, setFreeSRData, selectedCharacters, setSelectedCharacters } = useFreeSRStore() - const transI18n = useTranslations("DataPage") - const parsedFreeSRData = freeSrJsonSchema.safeParse(freeSRData) - const validFreeSRData = parsedFreeSRData.success ? parsedFreeSRData.data : null - - const handleCharacterToggle = (character: CharacterInfoCardType) => { - if (selectedCharacters.some((selectedCharacter) => selectedCharacter.key === character.key)) { - setSelectedCharacters(selectedCharacters.filter((selectedCharacter) => selectedCharacter.key !== character.key)); - return; - } - setSelectedCharacters([...selectedCharacters, character]); - }; - - const clearSelection = () => { - setSelectedCharacters([]); - }; - - const selectAll = () => { - const parsed = freeSrJsonSchema.safeParse(freeSRData) - if (parsed.success) { - setSelectedCharacters(Object.values(parsed.data.avatars).filter(it => mapAvatar?.[it.avatar_id]).map((character) => toCharacterInfoCard(parsed.data, character))); - } - }; - - const handlerReadFile = (event: React.ChangeEvent) => { - setIsLoading(true) - const file = event.target.files?.[0]; - if (!file) { - setSelectedCharacters([]) - setFreeSRData(null) - setError(transI18n("pleaseSelectAFile")) - setIsLoading(false) - return - } - if (!file.name.endsWith(".json") || file.type !== "application/json") { - setSelectedCharacters([]) - setFreeSRData(null) - setError(transI18n("fileMustBeAValidJsonFile")) - setIsLoading(false) - return - } - - if (file) { - - const reader = new FileReader(); - reader.onload = (e) => { - try { - const data = JSON.parse(e.target?.result as string); - const parsed = freeSrJsonSchema.safeParse(data) - if (!parsed.success) { - setSelectedCharacters([]) - setFreeSRData(null) - setError(transI18n("fileMustBeAValidJsonFile")) - return - } - - setFreeSRData(parsed.data) - setError("") - - setSelectedCharacters(Object.values(parsed.data.avatars).filter(it => mapAvatar?.[it.avatar_id]).map((character) => toCharacterInfoCard(parsed.data, character))); - } catch { - - setSelectedCharacters([]) - setFreeSRData(null) - setError(transI18n("fileMustBeAValidJsonFile")) - } finally { - setIsLoading(false) - } - }; - reader.onerror = () => { - setSelectedCharacters([]) - setFreeSRData(null) - setError(transI18n("fileMustBeAValidJsonFile")) - setIsLoading(false) - } - reader.readAsText(file); - } - }; - - const handleImport = () => { - if (selectedCharacters.length === 0) { - setError(transI18n("pleaseSelectAtLeastOneCharacter")); - return; - } - if (!freeSRData) { - setError(transI18n("noDataToImport")); - return; - } - setError(""); - - const parsed = freeSrJsonSchema.safeParse(freeSRData) - if (!parsed.success) { - setError(transI18n("fileMustBeAValidJsonFile")); - return; - } - - const listAvatars = { ...avatars } - const filterData = Object.values(parsed.data.avatars).filter((character) => selectedCharacters.some((selectedCharacter) => selectedCharacter.avatar_id === character.avatar_id)) - filterData.forEach((character) => { - const newAvatar = { ...listAvatars[character.avatar_id] } - if (Object.keys(newAvatar).length !== 0) { - newAvatar.level = character.level - newAvatar.promotion = character.promotion - newAvatar.data = { - rank: character.data.rank ?? 0, - skills: character.data.skills - } - const newProfile = converterOneFreeSRDataToAvatarStore(parsed.data, newAvatar.profileList.length, character.avatar_id) - if (newProfile) { - newAvatar.profileList.push(newProfile) - newAvatar.profileSelect = newAvatar.profileList.length - 1 - } - setAvatar(newAvatar) - } - - }) - setIsOpenImport(false) - toast.success(transI18n("importFreeSRDataSuccess")) - } - - return ( -
    -
    - {/* Header */} -
    -

    {transI18n("freeSRImport")}

    - -
    -
    - {transI18n("pickAFile")} - - -
    - - {selectedCharacters.length > 0 && ( - - )} -
    - {Error && ( -
    😭 {Error}
    - )} - - - {/* Selection Info */} -
    - - {transI18n("selectedCharacters")}: {selectedCharacters.length} - - - -
    -
    - {isLoading && ( -
    -
    -
    - )} - {/* Character Grid */} -
    - {validFreeSRData && Object.values(validFreeSRData.avatars).filter(it => mapAvatar?.[it.avatar_id]).map((character) => { - return ( - - ) - })} -
    -
    -
    - ) -} +"use client" + +import useFreeSRStore from "@/stores/freesrStore"; +import useModelStore from "@/stores/modelStore"; +import useUserDataStore from "@/stores/userDataStore"; +import { CharacterInfoCardType } from "@/types"; +import { useState } from "react"; +import CharacterInfoCard from "../card/characterInfoCard"; +import { freeSrJsonSchema } from "@/zod"; +import { toast } from "react-toastify"; +import { converterOneFreeSRDataToAvatarStore } from "@/helper"; +import { useTranslations } from "next-intl"; +import useDetailDataStore from "@/stores/detailDataStore"; +import { useShallow } from "zustand/react/shallow"; +import { z } from "zod"; + +type FreeSRJsonInput = z.infer; + +const toCharacterInfoCard = (data: FreeSRJsonInput, character: FreeSRJsonInput["avatars"][string]): CharacterInfoCardType => { + const lightcone = data.lightcones.find((lightcone) => lightcone.equip_avatar === character.avatar_id) + const relics = data.relics.filter((relic) => relic.equip_avatar === character.avatar_id) + + return { + key: character.avatar_id, + avatar_id: character.avatar_id, + rank: character.data.rank ?? 0, + level: character.level, + lightcone: { + level: lightcone?.level ?? 0, + rank: lightcone?.rank ?? 0, + item_id: lightcone?.item_id ?? 0, + }, + relics: relics.map((relic) => ({ + level: relic.level, + relic_id: relic.relic_id, + relic_set_id: relic.relic_set_id, + })), + } +} + +export default function FreeSRImport() { + const { avatars, setAvatar } = useUserDataStore( + useShallow((state) => ({ + avatars: state.avatars, + setAvatar: state.setAvatar, + })) + ); + const { mapAvatar } = useDetailDataStore( + useShallow((state) => ({ + mapAvatar: state.mapAvatar, + })) + ); + const { setIsOpenImport } = useModelStore( + useShallow((state) => ({ + setIsOpenImport: state.setIsOpenImport, + })) + ) + const [isLoading, setIsLoading] = useState(false) + const [Error, setError] = useState("") + const { freeSRData, setFreeSRData, selectedCharacters, setSelectedCharacters } = useFreeSRStore( + useShallow((state) => ({ + freeSRData: state.freeSRData, + setFreeSRData: state.setFreeSRData, + selectedCharacters: state.selectedCharacters, + setSelectedCharacters: state.setSelectedCharacters, + })) + ) + const transI18n = useTranslations("DataPage") + const parsedFreeSRData = freeSrJsonSchema.safeParse(freeSRData) + const validFreeSRData = parsedFreeSRData.success ? parsedFreeSRData.data : null + + const handleCharacterToggle = (character: CharacterInfoCardType) => { + if (selectedCharacters.some((selectedCharacter) => selectedCharacter.key === character.key)) { + setSelectedCharacters(selectedCharacters.filter((selectedCharacter) => selectedCharacter.key !== character.key)); + return; + } + setSelectedCharacters([...selectedCharacters, character]); + }; + + const clearSelection = () => { + setSelectedCharacters([]); + }; + + const selectAll = () => { + const parsed = freeSrJsonSchema.safeParse(freeSRData) + if (parsed.success) { + setSelectedCharacters(Object.values(parsed.data.avatars).filter(it => mapAvatar?.[it.avatar_id]).map((character) => toCharacterInfoCard(parsed.data, character))); + } + }; + + const handlerReadFile = (event: React.ChangeEvent) => { + setIsLoading(true) + const file = event.target.files?.[0]; + if (!file) { + setSelectedCharacters([]) + setFreeSRData(null) + setError(transI18n("pleaseSelectAFile")) + setIsLoading(false) + return + } + if (!file.name.endsWith(".json") || file.type !== "application/json") { + setSelectedCharacters([]) + setFreeSRData(null) + setError(transI18n("fileMustBeAValidJsonFile")) + setIsLoading(false) + return + } + + if (file) { + + const reader = new FileReader(); + reader.onload = (e) => { + try { + const data = JSON.parse(e.target?.result as string); + const parsed = freeSrJsonSchema.safeParse(data) + if (!parsed.success) { + setSelectedCharacters([]) + setFreeSRData(null) + setError(transI18n("fileMustBeAValidJsonFile")) + return + } + + setFreeSRData(parsed.data) + setError("") + + setSelectedCharacters(Object.values(parsed.data.avatars).filter(it => mapAvatar?.[it.avatar_id]).map((character) => toCharacterInfoCard(parsed.data, character))); + } catch { + + setSelectedCharacters([]) + setFreeSRData(null) + setError(transI18n("fileMustBeAValidJsonFile")) + } finally { + setIsLoading(false) + } + }; + reader.onerror = () => { + setSelectedCharacters([]) + setFreeSRData(null) + setError(transI18n("fileMustBeAValidJsonFile")) + setIsLoading(false) + } + reader.readAsText(file); + } + }; + + const handleImport = () => { + if (selectedCharacters.length === 0) { + setError(transI18n("pleaseSelectAtLeastOneCharacter")); + return; + } + if (!freeSRData) { + setError(transI18n("noDataToImport")); + return; + } + setError(""); + + const parsed = freeSrJsonSchema.safeParse(freeSRData) + if (!parsed.success) { + setError(transI18n("fileMustBeAValidJsonFile")); + return; + } + + const listAvatars = { ...avatars } + const filterData = Object.values(parsed.data.avatars).filter((character) => selectedCharacters.some((selectedCharacter) => selectedCharacter.avatar_id === character.avatar_id)) + filterData.forEach((character) => { + const currentAvatar = listAvatars[character.avatar_id] + if (currentAvatar && Object.keys(currentAvatar).length !== 0) { + const newProfileList = [...(currentAvatar.profileList || [])] + const newProfile = converterOneFreeSRDataToAvatarStore(parsed.data, newProfileList.length, character.avatar_id) + if (newProfile) { + newProfileList.push(newProfile) + } + const newAvatar = { + ...currentAvatar, + level: character.level, + promotion: character.promotion, + data: { + rank: character.data.rank ?? 0, + skills: character.data.skills + }, + profileList: newProfileList, + profileSelect: newProfile ? newProfileList.length - 1 : currentAvatar.profileSelect, + } + setAvatar(newAvatar) + } + }) + setIsOpenImport(false) + toast.success(transI18n("importFreeSRDataSuccess")) + } + + return ( +
    +
    + {/* Header */} +
    +

    {transI18n("freeSRImport")}

    + +
    +
    + {transI18n("pickAFile")} + + +
    + + {selectedCharacters.length > 0 && ( + + )} +
    + {Error && ( +
    😭 {Error}
    + )} + + {/* Selection Info */} +
    +
    + + {transI18n("selectedCharacters")}: + + + {selectedCharacters.length} + +
    +
    + + +
    +
    +
    + {isLoading && ( +
    +
    +
    + )} + {/* Character Grid */} +
    + {validFreeSRData && Object.values(validFreeSRData.avatars).filter(it => mapAvatar?.[it.avatar_id]).map((character) => { + return ( + + ) + })} +
    +
    +
    + ) +} diff --git a/src/components/lightconeBar/index.tsx b/src/components/lightconeBar/index.tsx index 25bcd79..093ec50 100644 --- a/src/components/lightconeBar/index.tsx +++ b/src/components/lightconeBar/index.tsx @@ -1,145 +1,212 @@ -"use client" - -import { useMemo } from "react" -import Image from "next/image"; -import useLocaleStore from "@/stores/localeStore" -import LightconeCard from "../card/lightconeCard"; -import useUserDataStore from "@/stores/userDataStore"; -import useModelStore from "@/stores/modelStore"; -import { useTranslations } from "next-intl"; -import useCurrentDataStore from "@/stores/currentDataStore"; -import useDetailDataStore from "@/stores/detailDataStore"; -import { calcRarity, getLocaleName } from "@/helper"; - -export default function LightconeBar() { - const { locale } = useLocaleStore() - const { - avatarSelected, - mapLightconePathActive, - mapLightconeRankActive, - setMapLightconePathActive, - setMapLightconeRankActive, - lightconeSearch, - setLightconeSearch - } = useCurrentDataStore() - const { setAvatar, avatars } = useUserDataStore() - const { setIsOpenLightcone } = useModelStore() - const { mapLightCone, baseType } = useDetailDataStore() - const transI18n = useTranslations("DataPage") - - const listLightcone = useMemo(() => { - if (!mapLightCone || !locale) return [] - - let list = Object.values(mapLightCone) - - if (lightconeSearch) { - list = list.filter(item => getLocaleName(locale, item.Name).toLowerCase().includes(lightconeSearch.toLowerCase())) - } - - const allRankFalse = !Object.values(mapLightconeRankActive).some(v => v) - const allPathFalse = !Object.values(mapLightconePathActive).some(v => v) - - list = list.filter(item => - (allRankFalse || mapLightconeRankActive[item.Rarity]) && - (allPathFalse || mapLightconePathActive[item.BaseType]) - ) - - list.sort((a, b) => { - const r = calcRarity(b.Rarity) - calcRarity(a.Rarity) - if (r !== 0) return r - return b.ID - a.ID - }) - - return list - }, [mapLightCone, mapLightconePathActive, mapLightconeRankActive, lightconeSearch, locale]) - - - - return ( -
    -
    -

    - {transI18n("lightConeSetting")} -

    -
    -
    -
    -
    Search
    - setLightconeSearch(e.target.value)} - type="text" placeholder="LightCone Name" className="input input-accent mt-1 w-full" - /> -
    -
    -
    Filter
    -
    -
    - {Object.entries(baseType).filter(([key]) => key !== "").map(([key, value]) => ( -
    { - setMapLightconePathActive({ ...mapLightconePathActive, [key]: !mapLightconePathActive[key] }) - }} - className="h-9.5 w-9.5 md:h-12.5 md:w-12.5 hover:bg-gray-600 grid place-items-center rounded-md shadow-lg cursor-pointer" - style={{ - backgroundColor: mapLightconePathActive[key] ? "#374151" : "#6B7280" - }} - > - {key} -
    - ))} -
    - -
    - {Object.keys(mapLightconeRankActive).map((key, index) => ( -
    { - setMapLightconeRankActive({ ...mapLightconeRankActive, [key]: !mapLightconeRankActive[key] }) - }} - className="h-9.5 w-9.5 md:h-12.5 md:w-12.5 hover:bg-gray-600 grid place-items-center rounded-md shadow-lg cursor-pointer" - style={{ - backgroundColor: mapLightconeRankActive[key] ? "#374151" : "#6B7280" - }} - > -
    - {key}* -
    -
    - ))} -
    -
    - -
    -
    -
    - {listLightcone.map((item, index) => ( -
    { - if (avatarSelected) { - const avatar = avatars[avatarSelected?.ID?.toString()] - avatar.profileList[avatar.profileSelect].lightcone = { - level: 80, - item_id: item.ID, - rank: 1, - promotion: 6 - } - setAvatar({ ...avatar }) - setIsOpenLightcone(false) - } - }}> - -
    - ))} -
    -
    - ) +"use client" + +import { useMemo } from "react" +import Image from "next/image"; +import useLocaleStore from "@/stores/localeStore" +import LightconeCard from "../card/lightconeCard"; +import useUserDataStore from "@/stores/userDataStore"; +import useModelStore from "@/stores/modelStore"; +import { useTranslations } from "next-intl"; +import useCurrentDataStore from "@/stores/currentDataStore"; +import useDetailDataStore from "@/stores/detailDataStore"; +import { calcRarity, getLocaleName } from "@/helper"; +import { useShallow } from "zustand/react/shallow"; +import { Search, X } from "lucide-react"; + +export default function LightconeBar() { + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ) + const { + avatarSelected, + mapLightconePathActive, + mapLightconeRankActive, + setMapLightconePathActive, + setMapLightconeRankActive, + lightconeSearch, + setLightconeSearch + } = useCurrentDataStore( + useShallow((state) => ({ + avatarSelected: state.avatarSelected, + mapLightconePathActive: state.mapLightconePathActive, + mapLightconeRankActive: state.mapLightconeRankActive, + setMapLightconePathActive: state.setMapLightconePathActive, + setMapLightconeRankActive: state.setMapLightconeRankActive, + lightconeSearch: state.lightconeSearch, + setLightconeSearch: state.setLightconeSearch, + })) + ) + const { setAvatar, avatars } = useUserDataStore( + useShallow((state) => ({ + setAvatar: state.setAvatar, + avatars: state.avatars, + })) + ) + const { setIsOpenLightcone } = useModelStore( + useShallow((state) => ({ + setIsOpenLightcone: state.setIsOpenLightcone, + })) + ) + const { mapLightCone, baseType } = useDetailDataStore( + useShallow((state) => ({ + mapLightCone: state.mapLightCone, + baseType: state.baseType, + })) + ) + const transI18n = useTranslations("DataPage") + + const listLightcone = useMemo(() => { + if (!mapLightCone || !locale) return [] + + let list = Object.values(mapLightCone) + + if (lightconeSearch) { + list = list.filter(item => getLocaleName(locale, item.Name).toLowerCase().includes(lightconeSearch.toLowerCase())) + } + + const allRankFalse = !Object.values(mapLightconeRankActive).some(v => v) + const allPathFalse = !Object.values(mapLightconePathActive).some(v => v) + + list = list.filter(item => { + const itemRank = calcRarity(item.Rarity).toString(); + return ( + (allRankFalse || !!mapLightconeRankActive[itemRank] || !!mapLightconeRankActive[item.Rarity]) && + (allPathFalse || !!mapLightconePathActive[item.BaseType]) + ); + }) + + list.sort((a, b) => { + const r = calcRarity(b.Rarity) - calcRarity(a.Rarity) + if (r !== 0) return r + return b.ID - a.ID + }) + + return list + }, [mapLightCone, mapLightconePathActive, mapLightconeRankActive, lightconeSearch, locale]) + + return ( +
    + {/* Search & Filters */} +
    + {/* Search Bar */} + + + {/* Filter Chips */} +
    + {/* Path Filter Chips */} +
    + {Object.entries(baseType).filter(([key]) => key !== "").map(([key, value]) => { + const isActive = !!mapLightconePathActive[key]; + return ( + + ); + })} +
    + + {/* Rarity Filter Chips */} +
    + {Object.keys(mapLightconeRankActive).map((key) => { + const isActive = !!mapLightconeRankActive[key]; + return ( + + ); + })} +
    +
    +
    + + {/* Results Grid */} +
    + {listLightcone.map((item) => ( +
    { + if (avatarSelected) { + const avatar = avatars[avatarSelected.ID.toString()] + if (avatar) { + const profileIndex = avatar.profileSelect + const currentProfile = avatar.profileList?.[profileIndex] + if (currentProfile) { + const newProfileList = [...avatar.profileList] + newProfileList[profileIndex] = { + ...currentProfile, + lightcone: { + level: 80, + item_id: item.ID, + rank: 1, + promotion: 6 + } + } + setAvatar({ + ...avatar, + profileList: newProfileList + }) + setIsOpenLightcone(false) + } + } + } + }} + > + +
    + ))} +
    +
    + ) } \ No newline at end of file diff --git a/src/components/monsterBar/as.tsx b/src/components/monsterBar/as.tsx index e64e98e..70815cc 100644 --- a/src/components/monsterBar/as.tsx +++ b/src/components/monsterBar/as.tsx @@ -8,14 +8,30 @@ import Image from "next/image"; import { ASEvent, MonsterStore } from "@/types"; import { useTranslations } from "next-intl"; import useDetailDataStore from "@/stores/detailDataStore"; +import { useShallow } from "zustand/react/shallow"; export default function AsBar() { - const { locale } = useLocaleStore() + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ) const { as_config, setAsConfig - } = useUserDataStore() - const { mapMonster, mapAS, damageType, hardLevelConfig, eliteConfig } = useDetailDataStore() + } = useUserDataStore( + useShallow((state) => ({ + as_config: state.as_config, + setAsConfig: state.setAsConfig, + })) + ) + const { mapMonster, mapAS, damageType, hardLevelConfig, eliteConfig } = useDetailDataStore( + useShallow((state) => ({ + mapMonster: state.mapMonster, + mapAS: state.mapAS, + damageType: state.damageType, + hardLevelConfig: state.hardLevelConfig, + eliteConfig: state.eliteConfig, + })) + ) const transI18n = useTranslations("DataPage") const challengeSelected = useMemo(() => { @@ -108,6 +124,13 @@ export default function AsBar() { if (targetEventList.length > 0) { newBattleConfig.stage_id = targetEventList[0].ID + if (targetEventList[0].Invasion) { + newBattleConfig.blessings.push({ + id: targetEventList[0].Invasion.MazeBuff.ID, + level: 1 + }) + } + for (const wave of targetEventList[0].MonsterList) { const newWave: MonsterStore[] = [] for (const value of Object.values(wave)) { @@ -135,10 +158,10 @@ export default function AsBar() { if (!mapAS) return null return ( -
    +
    {/* Title Card */} -
    +
    b.ID - a.ID).map((as) => ({ @@ -209,13 +232,13 @@ export default function AsBar() {
    )} {/* Turbulence Buff */} -
    -

    {transI18n("turbulenceBuff")}

    +
    +

    {transI18n("turbulenceBuff")}

    {challengeSelected ? ( challengeSelected.MazeBuff.map((buff, i) => (
    )) ) : ( -
    {transI18n("noTurbulenceBuff")}
    +
    {transI18n("noTurbulenceBuff")}
    )}
    @@ -246,7 +269,7 @@ export default function AsBar() { const targetEvent = eventList[0]; return ( -
    +

    {side.wave}

    {targetEvent?.MonsterList?.map((wave, waveIndex) => ( diff --git a/src/components/monsterBar/ce.tsx b/src/components/monsterBar/ce.tsx index 9bc26b4..1679e60 100644 --- a/src/components/monsterBar/ce.tsx +++ b/src/components/monsterBar/ce.tsx @@ -17,19 +17,37 @@ import { useTranslations } from "next-intl"; import useGlobalStore from "@/stores/globalStore"; import useDetailDataStore from "@/stores/detailDataStore"; import { MonsterDetail } from "@/types"; - +import { useShallow } from "zustand/react/shallow"; export default function CeBar() { const [searchTerm, setSearchTerm] = useState(""); const [showSearchWaveId, setShowSearchWaveId] = useState(null); - const { ce_config, setCeConfig } = useUserDataStore() - const { mapMonster, stage, damageType } = useDetailDataStore() - const { locale } = useLocaleStore() + const { ce_config, setCeConfig } = useUserDataStore( + useShallow((state) => ({ + ce_config: state.ce_config, + setCeConfig: state.setCeConfig, + })) + ) + const { mapMonster, stage, damageType } = useDetailDataStore( + useShallow((state) => ({ + mapMonster: state.mapMonster, + stage: state.stage, + damageType: state.damageType, + })) + ) + const { locale } = useLocaleStore( + useShallow((state) => ({ locale: state.locale })) + ) const transI18n = useTranslations("DataPage") const [showSearchStage, setShowSearchStage] = useState(false) const [stageSearchTerm, setStageSearchTerm] = useState("") const [stagePage, setStagePage] = useState(1) - const { extraData, setExtraData } = useGlobalStore() + const { extraData, setExtraData } = useGlobalStore( + useShallow((state) => ({ + extraData: state.extraData, + setExtraData: state.setExtraData, + })) + ) const pageSize = 30 @@ -59,10 +77,6 @@ export default function CeBar() { [monsterPage, filteredMonsters] ) - useEffect(() => { - setMonsterPage(1) - }, [searchTerm]) - const stageList = useMemo(() => Object.values(stage).map((item) => ({ id: item.ID.toString(), name: `${getLocaleName(locale, item.Name)} (${item.ID})`, @@ -79,11 +93,6 @@ export default function CeBar() { const hasMorePages = useMemo(() => stagePage * pageSize < filteredStages.length, [stagePage, filteredStages]) - useEffect(() => { - setStagePage(1) - }, [stageSearchTerm]) - - useEffect(() => { if (!ce_config) return if (!extraData || !extraData.theory_craft?.mode) return @@ -110,27 +119,26 @@ export default function CeBar() { return ( -
    { - +
    { setShowSearchWaveId(null) setShowSearchStage(false) }}> -
    +
    {showSearchStage && ( -
    e.stopPropagation()} className="absolute top-full mt-2 w-full z-50 border bg-base-200 border-slate-600 rounded-lg p-4 shadow-lg"> +
    e.stopPropagation()} className="absolute top-full mt-2 w-full z-50 border bg-base-200 border-base-content/20 rounded-xl p-4 shadow-xl">
    - -
    +
    {paginatedStages.length > 0 ? ( - <> - {paginatedStages.map((stage) => ( -
    { - if (ce_config.stage_id !== Number(stage.id)) { - setCeConfig({ ...ce_config, stage_id: Number(stage.id), cycle_count: 30 }) - } - setShowSearchStage(false) - setStageSearchTerm("") - }} - > - {stage.name} -
    - ))} - - - + paginatedStages.map((stage) => ( + + )) ) : (
    {transI18n("noStageFound")}
    )}
    {paginatedStages.length > 0 && ( -
    +
    -
    +
    {ce_config.monsters.map((wave, waveIndex) => ( -
    -
    +
    +
    -

    {transI18n("wave")} {waveIndex + 1}

    +

    {transI18n("wave")} {waveIndex + 1}

    -
    -
    +
    ); diff --git a/src/components/monsterBar/index.tsx b/src/components/monsterBar/index.tsx index b8ea4d2..982f783 100644 --- a/src/components/monsterBar/index.tsx +++ b/src/components/monsterBar/index.tsx @@ -6,9 +6,15 @@ import AsBar from "./as"; import { useTranslations } from "next-intl"; import CeBar from "./ce"; import PeakBar from "./peak"; +import { useShallow } from "zustand/react/shallow"; export default function MonsterBar() { - const { battle_type, setBattleType } = useUserDataStore() + const { battle_type, setBattleType } = useUserDataStore( + useShallow((state) => ({ + battle_type: state.battle_type, + setBattleType: state.setBattleType, + })) + ) const transI18n = useTranslations("DataPage") const navItems = [ @@ -23,9 +29,9 @@ export default function MonsterBar() { return ( -
    +
    {/* Header Navigation */} -