From 6cfca656e8a40f585e85c0160b55c523f9d74b5e Mon Sep 17 00:00:00 2001 From: Alexander Medvedev Date: Mon, 24 Aug 2026 16:38:08 +0200 Subject: [PATCH] chore: smaller fixes --- package-lock.json | 480 +++++++++----------- package.json | 26 +- src/App.css | 453 +++++++++--------- src/App.tsx | 109 ++++- src/pages/PluginDetail.tsx | 43 ++ src/pages/ProfilePage.tsx | 4 +- src/pages/dashboard/Dashboard.css | 264 ++++++++++- src/pages/dashboard/plugin/AddPlugin.css | 10 +- src/pages/dashboard/plugin/ManagePlugin.css | 21 +- 9 files changed, 875 insertions(+), 535 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3336df3..6310b85 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,20 +8,20 @@ "name": "client", "version": "0.0.0", "dependencies": { - "@marsidev/react-turnstile": "^1.5.4", + "@marsidev/react-turnstile": "^1.6.0", "@vnedyalk0v/react19-simple-maps": "^2.0.10", "axios": "^1.19.0", "country-list": "^2.4.1", "d3-geo": "^3.1.1", "d3-scale": "^4.0.2", - "i18next": "^26.3.6", + "i18next": "^26.4.0", "i18next-browser-languagedetector": "^8.2.1", - "lucide-react": "^1.28.0", + "lucide-react": "^1.34.0", "or": "^0.2.0", "qrcode.react": "^4.2.0", "react": "^19.2.8", "react-dom": "^19.2.8", - "react-i18next": "^17.0.11", + "react-i18next": "^17.0.12", "react-is": "^19.2.8", "react-markdown": "^10.1.0", "react-router-dom": "^7.18.2", @@ -31,17 +31,17 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@types/country-list": "^2.1.4", - "@types/node": "^26.1.2", + "@types/node": "^26.2.0", "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "eslint": "^10.8.0", + "@types/react-dom": "^19.2.5", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.9.0", "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.3", - "globals": "^17.8.0", + "eslint-plugin-react-refresh": "^0.5.4", + "globals": "^17.11.0", "typescript": "^7.0.2", - "typescript-eslint": "^8.65.0", - "vite": "^8.2.0" + "typescript-eslint": "^8.67.0", + "vite": "^8.2.2" } }, "node_modules/@babel/code-frame": { @@ -237,9 +237,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", - "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", + "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -293,40 +293,6 @@ "node": ">=6.9.0" } }, - "node_modules/@emnapi/core": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", - "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "2.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz", - "integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", - "integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -572,41 +538,19 @@ } }, "node_modules/@marsidev/react-turnstile": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@marsidev/react-turnstile/-/react-turnstile-1.5.4.tgz", - "integrity": "sha512-2+ulBzQPYcC5jZ4Pghlcc6a6+CQ6L0cgTxtbavZbcHcG5/wSQsTAM+vDudF94L9AUPG4uSNQF1kotmvx0Ns/QA==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@marsidev/react-turnstile/-/react-turnstile-1.6.0.tgz", + "integrity": "sha512-T2Um71ZdBgQBiyS01xgRMvDWk+mEsrLtXLFVhOC917OVEO584wbPOWj1sw35RaM17+q9QoADgLVcH60xr9NRqQ==", "license": "MIT", "peerDependencies": { "react": "^17.0.2 || ^18.0.0 || ^19.0", "react-dom": "^17.0.2 || ^18.0.0 || ^19.0" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", - "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" - } - }, "node_modules/@oxc-project/types": { - "version": "0.142.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", - "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", + "version": "0.146.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz", + "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==", "dev": true, "license": "MIT", "funding": { @@ -639,10 +583,27 @@ } } }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.5.tgz", + "integrity": "sha512-DLe/i+l8ynIBY7XEQ191TeZvCoowIGa18R+dIV30GW7DiOtp74i/xX8hs8GUjW5ARV7VZuie3d6AumSmCwbeRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.1.tgz", - "integrity": "sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz", + "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==", "cpu": [ "arm64" ], @@ -657,9 +618,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz", - "integrity": "sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz", + "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==", "cpu": [ "arm64" ], @@ -674,9 +635,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz", - "integrity": "sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz", + "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==", "cpu": [ "x64" ], @@ -691,9 +652,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.1.tgz", - "integrity": "sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz", + "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==", "cpu": [ "x64" ], @@ -708,9 +669,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.1.tgz", - "integrity": "sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz", + "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==", "cpu": [ "arm" ], @@ -725,9 +686,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz", - "integrity": "sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz", + "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==", "cpu": [ "arm64" ], @@ -742,9 +703,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz", - "integrity": "sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz", + "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==", "cpu": [ "arm64" ], @@ -759,9 +720,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.1.tgz", - "integrity": "sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz", + "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==", "cpu": [ "ppc64" ], @@ -776,9 +737,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.1.tgz", - "integrity": "sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz", + "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==", "cpu": [ "s390x" ], @@ -793,9 +754,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz", - "integrity": "sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz", + "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==", "cpu": [ "x64" ], @@ -810,9 +771,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz", - "integrity": "sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz", + "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==", "cpu": [ "x64" ], @@ -827,9 +788,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.1.tgz", - "integrity": "sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz", + "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==", "cpu": [ "arm64" ], @@ -843,26 +804,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz", - "integrity": "sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "2.0.0-alpha.3", - "@emnapi/runtime": "2.0.0-alpha.3", - "@napi-rs/wasm-runtime": "^1.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz", - "integrity": "sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz", + "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==", "cpu": [ "arm64" ], @@ -877,9 +822,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz", - "integrity": "sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz", + "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==", "cpu": [ "x64" ], @@ -912,17 +857,6 @@ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/country-list": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@types/country-list/-/country-list-2.1.4.tgz", @@ -1056,9 +990,9 @@ "license": "MIT" }, "node_modules/@types/node": { - "version": "26.1.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", - "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", + "version": "26.2.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz", + "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==", "dev": true, "license": "MIT", "dependencies": { @@ -1076,9 +1010,9 @@ } }, "node_modules/@types/react-dom": { - "version": "19.2.4", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", - "integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", + "version": "19.2.5", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz", + "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==", "dev": true, "license": "MIT", "peerDependencies": { @@ -1098,17 +1032,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", - "integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz", + "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.65.0", - "@typescript-eslint/type-utils": "8.65.0", - "@typescript-eslint/utils": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/type-utils": "8.67.0", + "@typescript-eslint/utils": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1121,7 +1055,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.65.0", + "@typescript-eslint/parser": "^8.67.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -1137,16 +1071,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", - "integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz", + "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3" }, "engines": { @@ -1162,14 +1096,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", - "integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz", + "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.65.0", - "@typescript-eslint/types": "^8.65.0", + "@typescript-eslint/tsconfig-utils": "^8.67.0", + "@typescript-eslint/types": "^8.67.0", "debug": "^4.4.3" }, "engines": { @@ -1184,14 +1118,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", - "integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz", + "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0" + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1202,9 +1136,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", - "integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz", + "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==", "dev": true, "license": "MIT", "engines": { @@ -1219,15 +1153,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", - "integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz", + "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0", - "@typescript-eslint/utils": "8.65.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -1244,9 +1178,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", - "integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz", + "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==", "dev": true, "license": "MIT", "engines": { @@ -1258,16 +1192,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", - "integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz", + "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.65.0", - "@typescript-eslint/tsconfig-utils": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/visitor-keys": "8.65.0", + "@typescript-eslint/project-service": "8.67.0", + "@typescript-eslint/tsconfig-utils": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/visitor-keys": "8.67.0", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1299,16 +1233,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", - "integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz", + "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.65.0", - "@typescript-eslint/types": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0" + "@typescript-eslint/scope-manager": "8.67.0", + "@typescript-eslint/types": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1323,13 +1257,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", - "integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz", + "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.65.0", + "@typescript-eslint/types": "8.67.0", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1687,9 +1621,9 @@ "license": "ISC" }, "node_modules/@vitejs/plugin-react": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", - "integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz", + "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==", "dev": true, "license": "MIT", "dependencies": { @@ -1701,6 +1635,7 @@ "peerDependencies": { "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "babel-plugin-react-compiler": "^1.0.0", + "oxc-transform-react": "^0.145.0", "vite": "^8.0.0" }, "peerDependenciesMeta": { @@ -1709,6 +1644,9 @@ }, "babel-plugin-react-compiler": { "optional": true + }, + "oxc-transform-react": { + "optional": true } } }, @@ -2436,9 +2374,9 @@ } }, "node_modules/eslint": { - "version": "10.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz", - "integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==", + "version": "10.9.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.0.tgz", + "integrity": "sha512-5KeEOJZBfEVA47boFiBsf+6MmmJpffM7qEBg4pLla2e4nlKgdKlqCW0oSLOGsT8Wl5uCGJptLV1bkaiShj90Gw==", "dev": true, "license": "MIT", "workspaces": [ @@ -2515,9 +2453,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.3.tgz", - "integrity": "sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz", + "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==", "dev": true, "license": "MIT", "peerDependencies": { @@ -2853,9 +2791,9 @@ } }, "node_modules/globals": { - "version": "17.8.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz", - "integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==", + "version": "17.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz", + "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==", "dev": true, "license": "MIT", "engines": { @@ -3006,9 +2944,9 @@ } }, "node_modules/i18next": { - "version": "26.3.6", - "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.6.tgz", - "integrity": "sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==", + "version": "26.4.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.0.tgz", + "integrity": "sha512-rsmK5bFqsD1AetSFSIa43wtNR4WpvvH4p0tLEsTxkC7QTrfdFm06nbQ95bh8Og4wwaCnUEcm9DVYL2cgxitiQg==", "funding": [ { "type": "individual", @@ -3549,9 +3487,9 @@ } }, "node_modules/lucide-react": { - "version": "1.28.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.28.0.tgz", - "integrity": "sha512-fARAFJULsGuDDydjp6+6blekG/sBIM29TerzLjc9bQUKAcEfrSc4ZQKb25KRz4OMKd87cZTb5dgq0w/T6KufVg==", + "version": "1.34.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.34.0.tgz", + "integrity": "sha512-vnjGJNI7Htk5+oWW8gXGuaLgwgAb0T6/iZbBrp9JCfRFwdNWZ0YTm3eyxjOLgwN6r8iyAf3UA70zNmBRBNv7yg==", "license": "ISC", "peerDependencies": { "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" @@ -4465,9 +4403,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", "dev": true, "funding": [ { @@ -4624,9 +4562,9 @@ } }, "node_modules/postcss": { - "version": "8.5.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", - "integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", "dev": true, "funding": [ { @@ -4644,7 +4582,7 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.16", + "nanoid": "^3.3.17", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, @@ -4722,12 +4660,12 @@ } }, "node_modules/react-i18next": { - "version": "17.0.11", - "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.11.tgz", - "integrity": "sha512-cDtkXgxjuFTWUH6V+aQn1Ve5vDiUztCNPWW5GtSHDccsgRXO1nE6QFWCEmc1KAutrb3OUv87wFShJL5RhUwPXg==", + "version": "17.0.12", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.12.tgz", + "integrity": "sha512-lFWPEGkxQ6RhusdUkysFBD58VHfSSzvHBzqMgN0SvfVpdQGfwtNkStTqdy08/sJd7s807qqutgx93fRpD0DJ3Q==", "license": "MIT", "dependencies": { - "@babel/runtime": "^7.29.2", + "@babel/runtime": "^7.29.7", "html-parse-stringify": "^4.0.1", "use-sync-external-store": "^1.6.0" }, @@ -4960,13 +4898,13 @@ "license": "MIT" }, "node_modules/rolldown": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", - "integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz", + "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.142.0", + "@oxc-project/types": "=0.146.0", "@rolldown/pluginutils": "^1.0.0" }, "bin": { @@ -4976,21 +4914,21 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.1", - "@rolldown/binding-darwin-arm64": "1.2.1", - "@rolldown/binding-darwin-x64": "1.2.1", - "@rolldown/binding-freebsd-x64": "1.2.1", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.1", - "@rolldown/binding-linux-arm64-gnu": "1.2.1", - "@rolldown/binding-linux-arm64-musl": "1.2.1", - "@rolldown/binding-linux-ppc64-gnu": "1.2.1", - "@rolldown/binding-linux-s390x-gnu": "1.2.1", - "@rolldown/binding-linux-x64-gnu": "1.2.1", - "@rolldown/binding-linux-x64-musl": "1.2.1", - "@rolldown/binding-openharmony-arm64": "1.2.1", - "@rolldown/binding-wasm32-wasi": "1.2.1", - "@rolldown/binding-win32-arm64-msvc": "1.2.1", - "@rolldown/binding-win32-x64-msvc": "1.2.1" + "@rolldown/binding-android-arm-eabi": "1.2.5", + "@rolldown/binding-android-arm64": "1.2.5", + "@rolldown/binding-darwin-arm64": "1.2.5", + "@rolldown/binding-darwin-x64": "1.2.5", + "@rolldown/binding-freebsd-x64": "1.2.5", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.5", + "@rolldown/binding-linux-arm64-gnu": "1.2.5", + "@rolldown/binding-linux-arm64-musl": "1.2.5", + "@rolldown/binding-linux-ppc64-gnu": "1.2.5", + "@rolldown/binding-linux-s390x-gnu": "1.2.5", + "@rolldown/binding-linux-x64-gnu": "1.2.5", + "@rolldown/binding-linux-x64-musl": "1.2.5", + "@rolldown/binding-openharmony-arm64": "1.2.5", + "@rolldown/binding-win32-arm64-msvc": "1.2.5", + "@rolldown/binding-win32-x64-msvc": "1.2.5" } }, "node_modules/scheduler": { @@ -5160,14 +5098,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -5217,16 +5147,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.65.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", - "integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", + "version": "8.67.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.67.0.tgz", + "integrity": "sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.65.0", - "@typescript-eslint/parser": "8.65.0", - "@typescript-eslint/typescript-estree": "8.65.0", - "@typescript-eslint/utils": "8.65.0" + "@typescript-eslint/eslint-plugin": "8.67.0", + "@typescript-eslint/parser": "8.67.0", + "@typescript-eslint/typescript-estree": "8.67.0", + "@typescript-eslint/utils": "8.67.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -5435,16 +5365,16 @@ } }, "node_modules/vite": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", - "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz", + "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==", "dev": true, "license": "MIT", "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", - "postcss": "^8.5.23", - "rolldown": "~1.2.0", + "postcss": "^8.5.26", + "rolldown": "~1.2.4", "tinyglobby": "^0.2.17" }, "bin": { @@ -5461,7 +5391,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.4.0", + "@vitejs/devtools": "^0.4.0 || ^0.5.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", diff --git a/package.json b/package.json index 0738aab..de72a0a 100644 --- a/package.json +++ b/package.json @@ -11,20 +11,20 @@ "preview": "vite preview" }, "dependencies": { - "@marsidev/react-turnstile": "^1.5.4", + "@marsidev/react-turnstile": "^1.6.0", "@vnedyalk0v/react19-simple-maps": "^2.0.10", "axios": "^1.19.0", "country-list": "^2.4.1", "d3-geo": "^3.1.1", "d3-scale": "^4.0.2", - "i18next": "^26.3.6", + "i18next": "^26.4.0", "i18next-browser-languagedetector": "^8.2.1", - "lucide-react": "^1.28.0", + "lucide-react": "^1.34.0", "or": "^0.2.0", "qrcode.react": "^4.2.0", "react": "^19.2.8", "react-dom": "^19.2.8", - "react-i18next": "^17.0.11", + "react-i18next": "^17.0.12", "react-is": "^19.2.8", "react-markdown": "^10.1.0", "react-router-dom": "^7.18.2", @@ -34,19 +34,19 @@ "devDependencies": { "@eslint/js": "^10.0.1", "@types/country-list": "^2.1.4", - "@types/node": "^26.1.2", + "@types/node": "^26.2.0", "@types/react": "^19.2.18", - "@types/react-dom": "^19.2.4", - "@vitejs/plugin-react": "^6.0.5", - "eslint": "^10.8.0", + "@types/react-dom": "^19.2.5", + "@vitejs/plugin-react": "^6.1.0", + "eslint": "^10.9.0", "eslint-plugin-react-hooks": "^7.1.1", - "eslint-plugin-react-refresh": "^0.5.3", - "globals": "^17.8.0", + "eslint-plugin-react-refresh": "^0.5.4", + "globals": "^17.11.0", "typescript": "^7.0.2", - "typescript-eslint": "^8.65.0", - "vite": "^8.2.0" + "typescript-eslint": "^8.67.0", + "vite": "^8.2.2" }, "overrides": { - "vite": "^8.2.0" + "vite": "^8.2.2" } } diff --git a/src/App.css b/src/App.css index 80e9b98..b2f9693 100644 --- a/src/App.css +++ b/src/App.css @@ -474,8 +474,7 @@ h3 { grid-template-columns: 1fr; } - .auth-card, - .settings-card { + .auth-card { padding: 2rem 1.5rem; } } @@ -909,8 +908,7 @@ h3 { padding: 2rem; } -.auth-card, -.settings-card { +.auth-card { background: var(--surface); border: 1px solid var(--border); padding: 3rem; @@ -1950,7 +1948,103 @@ h3 { /* Screenshot Gallery */ .screenshot-gallery { - margin-bottom: 3rem; + margin-bottom: 2rem; +} + +.plugin-recent-update { + background: var(--surface); + border: 1px solid var(--border); + border-left: 3px solid var(--primary); + border-radius: 12px; + padding: 1.25rem 1.5rem; + margin-bottom: 2.25rem; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); +} + +.plugin-recent-update-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 1rem; + flex-wrap: wrap; + margin-bottom: 0.85rem; + padding-bottom: 0.85rem; + border-bottom: 1px solid var(--border); +} + +.plugin-recent-update-title-group { + display: flex; + align-items: center; + gap: 0.65rem; + flex-wrap: wrap; +} + +.plugin-recent-update-title { + font-size: 1rem; + font-weight: 800; + color: var(--text); + margin: 0; + display: flex; + align-items: center; + gap: 0.45rem; + text-transform: uppercase; + letter-spacing: 0.5px; +} + +.plugin-recent-update-badge { + display: inline-flex; + align-items: center; + padding: 2px 8px; + border-radius: 6px; + background: rgba(var(--primary-rgb), 0.12); + color: var(--primary); + font-family: var(--font-mono); + font-size: 0.82rem; + font-weight: 700; + border: 1px solid rgba(var(--primary-rgb), 0.25); +} + +.plugin-recent-update-date { + font-size: 0.82rem; + color: var(--text-muted); +} + +.plugin-recent-update-history-btn { + display: inline-flex; + align-items: center; + gap: 5px; + background: rgba(255, 255, 255, 0.04); + border: 1px solid var(--border); + color: var(--text-muted); + padding: 5px 12px; + border-radius: 6px; + font-size: 0.78rem; + font-weight: 600; + cursor: pointer; + transition: all 0.15s ease; +} + +.plugin-recent-update-history-btn:hover { + color: var(--text); + background: rgba(255, 255, 255, 0.08); + border-color: var(--primary); +} + +.plugin-recent-update-body { + font-size: 0.92rem; + line-height: 1.6; + color: var(--text); +} + +.plugin-recent-update-body p:last-child { + margin-bottom: 0; +} + +.plugin-recent-update-empty { + font-size: 0.88rem; + color: var(--text-muted); + font-style: italic; + margin: 0; } .lightbox-overlay { @@ -2049,76 +2143,7 @@ h3 { } -/* --- Profile Page --- */ -.profile-page .page-title { - margin-bottom: 2rem; -} - -.profile-layout { - display: flex; - gap: 2rem; - max-width: 1200px; - margin: 0 auto; - align-items: flex-start; -} - -.profile-nav { - display: flex; - flex-direction: column; - background: var(--surface); - border: 1px solid var(--border); - border-radius: 12px; - padding: 1rem; - min-width: 200px; - position: sticky; - top: 120px; - /* Adjust based on navbar height */ -} - -.profile-nav-item { - display: block; - padding: 0.8rem 1rem; - margin-bottom: 0.5rem; - border: none; - background: transparent; - color: var(--text-muted); - text-align: left; - cursor: pointer; - font-size: 1rem; - font-weight: 600; - border-radius: 8px; - transition: all 0.2s; -} - -.profile-nav-item:hover { - color: var(--text); - background: rgba(var(--primary-rgb), 0.1); - /* Subtle hover effect */ -} - -.profile-nav-item.active { - color: var(--primary); - background: rgba(var(--primary-rgb), 0.2); - /* Highlight active tab */ - font-weight: 700; -} - -.profile-content { - flex-grow: 1; - background: var(--surface); - border: 1px solid var(--border); - border-radius: 12px; - padding: 2.5rem; -} - -.profile-section .section-title { - margin-top: 0; - margin-bottom: 2rem; -} - -.profile-section form { - margin-top: 1.5rem; -} +/* --- Form Groups & Messages --- */ .form-group { margin-bottom: 1.5rem; @@ -2568,120 +2593,7 @@ h3 { font-weight: 700; } -/* --- Profile Page --- */ -.profile-page .page-title { - margin-bottom: 2rem; -} -.profile-layout { - display: flex; - gap: 2rem; - max-width: 1200px; - margin: 0 auto; - align-items: flex-start; -} - -.profile-nav { - display: flex; - flex-direction: column; - background: var(--surface); - border: 1px solid var(--border); - border-radius: 12px; - padding: 1rem; - min-width: 200px; - position: sticky; - top: 120px; -} - -.profile-nav-item { - display: block; - padding: 0.8rem 1rem; - margin-bottom: 0.5rem; - border: none; - background: transparent; - color: var(--text-muted); - text-align: left; - cursor: pointer; - font-size: 1rem; - font-weight: 600; - border-radius: 8px; - transition: all 0.2s; -} - -.profile-nav-item:hover { - color: var(--text); - background: rgba(var(--primary-rgb), 0.1); -} - -.profile-nav-item.active { - color: var(--primary); - background: rgba(var(--primary-rgb), 0.2); - font-weight: 700; -} - -.profile-content { - flex-grow: 1; - background: var(--surface); - border: 1px solid var(--border); - border-radius: 12px; - padding: 2.5rem; -} - -.profile-section .section-title { - margin-top: 0; - margin-bottom: 2rem; -} - -.profile-section form { - margin-top: 1.5rem; -} - -.form-group { - margin-bottom: 1.5rem; -} - -.form-group label { - display: block; - font-size: 0.85rem; - color: var(--text-muted); - margin-bottom: 0.5rem; - text-transform: uppercase; - font-weight: 600; -} - -.form-group input { - width: 100%; - padding: 12px 15px; - border-radius: 8px; - border: 1px solid var(--border); - background: var(--bg); - color: var(--text); - font-size: 1rem; - outline: none; - transition: border-color 0.2s; -} - -.form-group input:focus { - border-color: var(--primary); -} - -.form-message { - margin-bottom: 1rem; - padding: 10px; - border-radius: 8px; - text-align: center; - font-weight: 600; -} - -.form-message.success { - background: rgba(74, 222, 128, 0.2); - color: var(--success); -} - -.form-message.error { - background: rgba(255, 68, 68, 0.2); - color: #ff4444; -} .btn-report { background: none; @@ -2830,7 +2742,7 @@ h3 { position: relative; display: flex; flex-direction: column; - background: var(--bg); + background: var(--surface); border: 1px solid var(--border); border-radius: 10px; overflow: hidden; @@ -3176,7 +3088,40 @@ h3 { SETTINGS PAGE (ProfilePage.tsx) ═══════════════════════════════════════════════════════════════════════════ */ +.profile-page { + max-width: 1200px; + width: 100%; + margin: 0 auto; + padding: 3rem 1.5rem 5rem; + box-sizing: border-box; +} + +.profile-page .page-title { + margin-bottom: 2.25rem; + font-size: clamp(2rem, 3.5vw, 2.75rem); +} + +.profile-layout { + display: grid; + grid-template-columns: 260px 1fr; + gap: 2rem; + align-items: start; + width: 100%; +} + /* ── Nav sidebar enhancements ── */ +.profile-nav { + display: flex; + flex-direction: column; + background: var(--surface); + border: 1px solid var(--border); + border-radius: 14px; + padding: 0.85rem; + position: sticky; + top: 90px; + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2); +} + .settings-nav-user { display: flex; align-items: center; @@ -3198,7 +3143,7 @@ h3 { } .settings-nav-meta { overflow: hidden; } .settings-nav-name { - font-size: 0.9rem; + font-size: 0.92rem; font-weight: 700; color: var(--text); margin: 0; @@ -3207,9 +3152,9 @@ h3 { text-overflow: ellipsis; } .settings-nav-email { - font-size: 0.75rem; + font-size: 0.78rem; color: var(--text-muted); - margin: 0.1rem 0 0; + margin: 0.15rem 0 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; @@ -3222,15 +3167,56 @@ h3 { .profile-nav-item { display: flex; align-items: center; - gap: 0.6rem; + gap: 0.65rem; + padding: 0.75rem 0.95rem; + margin-bottom: 0.2rem; + border: none; + background: transparent; + color: var(--text-muted); + text-align: left; + cursor: pointer; + font-size: 0.9rem; + font-weight: 600; + border-radius: 8px; + transition: all 0.18s ease; + width: 100%; + box-sizing: border-box; +} +.profile-nav-item:hover { + color: var(--text); + background: rgba(255, 255, 255, 0.05); +} +.profile-nav-item.active { + color: #ffffff; + background: var(--primary); + font-weight: 700; } .profile-nav-item.danger { color: #ef4444; } -.profile-nav-item.danger:hover { background: rgba(239, 68, 68, 0.1); } -.profile-nav-item.danger.active { background: rgba(239, 68, 68, 0.15); color: #ef4444; } +.profile-nav-item.danger:hover { background: rgba(239, 68, 68, 0.12); color: #ef4444; } +.profile-nav-item.danger.active { background: #ef4444; color: #ffffff; } + +/* ── Profile Content Area (Transparent, no nested box!) ── */ +.profile-content { + min-width: 0; + width: 100%; + background: transparent !important; + border: none !important; + padding: 0 !important; + display: flex; + flex-direction: column; + gap: 1.5rem; +} + +.profile-section { + display: flex; + flex-direction: column; + gap: 1.25rem; + width: 100%; +} /* ── Section header ── */ .settings-section-header { - margin-bottom: 2rem; + margin-bottom: 0.5rem; padding-bottom: 1.25rem; border-bottom: 1px solid var(--border); } @@ -3241,27 +3227,32 @@ h3 { line-height: 1.5; } -/* ── Settings card ── */ +/* ── Settings card (Unified clean card surface) ── */ .settings-card { - background: var(--bg); + background: var(--surface); border: 1px solid var(--border); - border-radius: 12px; + border-radius: 14px; margin-bottom: 1.25rem; overflow: hidden; - transition: border-color 0.2s; + width: 100%; + max-width: 100%; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); + transition: border-color 0.2s ease, box-shadow 0.2s ease; +} +.settings-card:hover { + border-color: color-mix(in srgb, var(--border) 60%, var(--primary)); } -.settings-card:hover { border-color: color-mix(in srgb, var(--border) 60%, var(--primary)); } .settings-card-header { display: flex; align-items: flex-start; gap: 0.85rem; - padding: 1.15rem 1.5rem; + padding: 1.25rem 1.75rem; border-bottom: 1px solid var(--border); - background: var(--surface); + background: rgba(255, 255, 255, 0.02); } .settings-card-icon { - width: 32px; - height: 32px; + width: 34px; + height: 34px; border-radius: 8px; background: rgba(var(--primary-rgb), 0.12); color: var(--primary); @@ -3271,19 +3262,19 @@ h3 { flex-shrink: 0; } .settings-card-title { - font-size: 0.92rem; + font-size: 0.95rem; font-weight: 700; color: var(--text); margin: 0; } .settings-card-desc { - font-size: 0.8rem; + font-size: 0.82rem; color: var(--text-muted); - margin: 0.2rem 0 0; + margin: 0.25rem 0 0; line-height: 1.45; } .settings-card-body { - padding: 1.5rem; + padding: 1.75rem; } /* ── Field ── */ @@ -3308,10 +3299,10 @@ h3 { } .settings-input { width: 100%; - padding: 10px 14px; + padding: 11px 14px; border-radius: 8px; border: 1px solid var(--border); - background: var(--surface); + background: var(--bg); color: var(--text); font-size: 0.92rem; outline: none; @@ -3322,6 +3313,10 @@ h3 { border-color: var(--primary); box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.15); } +.settings-input:disabled { + opacity: 0.6; + cursor: not-allowed; +} .settings-select { cursor: pointer; appearance: auto; } /* ── Password input with eye toggle ── */ @@ -3606,6 +3601,40 @@ h3 { .settings-danger-box { } /* ── Responsive ── */ +@media (max-width: 960px) { + .profile-layout { + grid-template-columns: 220px 1fr; + gap: 1.5rem; + } +} + @media (max-width: 768px) { - .settings-toast { right: 1rem; left: 1rem; max-width: none; } + .profile-page { + padding: 2rem 1rem 3.5rem; + } + + .profile-layout { + grid-template-columns: 1fr; + gap: 1.25rem; + } + + .profile-nav { + position: static; + top: auto; + padding: 0.75rem; + } + + .settings-card-header { + padding: 1.1rem 1.25rem; + } + + .settings-card-body { + padding: 1.25rem; + } + + .settings-toast { + right: 1rem; + left: 1rem; + max-width: none; + } } \ No newline at end of file diff --git a/src/App.tsx b/src/App.tsx index 5068907..fa357e7 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,7 +1,7 @@ import React, { createContext, useContext, useState, useEffect } from 'react'; import { BrowserRouter as Router, Routes, Route, Link, NavLink, useNavigate, Outlet, Navigate, useLocation } from 'react-router-dom'; import { useTranslation } from 'react-i18next'; -import { Search } from 'lucide-react'; +import { Search, Store, Package, Globe, PlusCircle } from 'lucide-react'; import Home from './pages/Home'; import PluginDetail from './pages/PluginDetail'; import LoginPage from './pages/auth/LoginPage'; @@ -124,9 +124,9 @@ const App = () => ( - {/* All routes share MainLayout (navbar + footer) */} - }> - } /> + {/* All marketplace routes share MainLayout (original navbar + footer) */} + }> + } /> } /> } /> } /> @@ -141,16 +141,18 @@ const App = () => ( } /> } /> } /> - }> - } /> - } /> - } /> - } /> - } /> - } /> } /> + + {/* Developer Studio layout (Developer Studio navbar replaces original navbar when in dev menu) */} + }> + } /> + } /> + } /> + } /> + } /> + @@ -169,17 +171,86 @@ const MainLayout = () => { import './pages/dashboard/Dashboard.css'; +const DeveloperStudioNavbar = ({ user }: any) => { + const [isMenuOpen, setIsMenuOpen] = useState(false); + const toggleMenu = () => setIsMenuOpen(!isMenuOpen); + + return ( +
+
+ {/* Brand */} + setIsMenuOpen(false)}> + Market Logo + DEVELOPER STUDIO + + + {/* Mobile menu toggle button */} + + + {/* Navigation & Actions */} +
+ + +
+ setIsMenuOpen(false)} title="Return to Marketplace"> + + Marketplace + + {user && (user.role === 'admin' || user.role === 'moderator') && ( + setIsMenuOpen(false)}> + Staff + + )} + {user && ( + setIsMenuOpen(false)}> + {user.username} + + )} +
+
+
+
+ ); +}; + const DashboardLayout = () => { + const { user } = useAuth(); return (
-
-
- - Market Logo - DEVELOPER STUDIO - -
-
+
diff --git a/src/pages/PluginDetail.tsx b/src/pages/PluginDetail.tsx index 71a8247..19ea877 100644 --- a/src/pages/PluginDetail.tsx +++ b/src/pages/PluginDetail.tsx @@ -6,6 +6,7 @@ import ReactMarkdown from 'react-markdown'; import remarkGfm from 'remark-gfm'; import { useNavigate } from 'react-router-dom'; import SEO from '../components/SEO'; +import { Sparkles, History } from 'lucide-react'; const getYoutubeVideoId = (url: string) => { if (!url) return null; @@ -679,6 +680,48 @@ const PluginDetail = () => {
)} + {Array.isArray(plugin.versions) && plugin.versions.length > 0 && ( +
+
+
+

+ + What's New +

+ + v{plugin.versions[0].version} + + {plugin.versions[0].created_at && ( + + {formatDate(plugin.versions[0].created_at)} + + )} +
+ {plugin.versions.length > 1 && ( + + )} +
+
+ {plugin.versions[0].release_notes ? ( + + {plugin.versions[0].release_notes} + + ) : ( +

+ Bug fixes and performance improvements. +

+ )} +
+
+ )} + {/* DESCRIPTION */}
{currentDescription} diff --git a/src/pages/ProfilePage.tsx b/src/pages/ProfilePage.tsx index 969ee0b..9821889 100644 --- a/src/pages/ProfilePage.tsx +++ b/src/pages/ProfilePage.tsx @@ -7,7 +7,7 @@ import { getCodeList } from 'country-list'; import DeveloperOnboardingModal from '../components/DeveloperOnboardingModal'; import { getPluginUrl } from '../utils/url'; import { - User, Mail, Globe, Lock, Shield, CreditCard, + User, Mail, Lock, Shield, CreditCard, BookOpen, AlertTriangle, LogOut, CheckCircle, AlertCircle, Eye, EyeOff, ChevronRight, Bell, Smartphone, Key, Trash2, Code, Sparkles, Building2 @@ -189,7 +189,7 @@ const ProfilePage = () => { if (formData.email && formData.email !== user?.email) { try { - const res = await api.post('/user/change-email', { newEmail: formData.email }); + await api.post('/user/change-email', { newEmail: formData.email }); updatedAny = true; } catch (err: any) { showToast(err.response?.data?.error || 'Failed to update email.', 'error'); diff --git a/src/pages/dashboard/Dashboard.css b/src/pages/dashboard/Dashboard.css index ada61e0..be68d74 100644 --- a/src/pages/dashboard/Dashboard.css +++ b/src/pages/dashboard/Dashboard.css @@ -13,13 +13,35 @@ --dash-shadow: 0 1px 3px rgba(0,0,0,0.08); /* New: for subtle shadows */ } -/* Dashboard Top App Header */ +/* Dashboard Layout Container */ +.dashboard-container { + min-height: 100vh; + display: flex; + flex-direction: column; + background-color: var(--dash-bg, #F6F8FA); + color: var(--dash-text, #24292E); +} + +.dashboard-content { + flex: 1; + max-width: 1400px; + width: 100%; + margin: 0 auto; + padding: 0 2rem 2.5rem 2rem; + box-sizing: border-box; +} + +/* Dashboard Top App Header (replaces main navbar in dev menu) */ .dashboard-app-header { background: var(--dash-surface); border-bottom: 1px solid var(--dash-border); - padding: 0.85rem 2rem; + padding: 0.75rem 2rem; margin-bottom: 2rem; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); + position: sticky; + top: 0; + z-index: 1000; + transition: background-color 0.2s ease, border-color 0.2s ease; } .dashboard-app-header-inner { @@ -28,6 +50,7 @@ display: flex; align-items: center; justify-content: space-between; + gap: 1.5rem; } .dashboard-app-brand { @@ -39,6 +62,7 @@ font-weight: 800; font-size: 1.1rem; letter-spacing: -0.3px; + flex-shrink: 0; } .dashboard-app-logo { @@ -51,6 +75,242 @@ color: var(--dash-accent, #ff7518); } +.dashboard-app-nav-wrap { + display: flex; + align-items: center; + justify-content: space-between; + flex: 1; + margin-left: 2rem; +} + +.dashboard-app-nav { + display: flex; + align-items: center; + gap: 0.4rem; +} + +.dashboard-app-nav-link { + display: flex; + align-items: center; + gap: 6px; + padding: 6px 14px; + border-radius: 6px; + font-size: 0.9rem; + font-weight: 500; + color: var(--dash-text-muted); + text-decoration: none !important; + transition: all 0.15s ease; +} + +.dashboard-app-nav-link:hover { + color: var(--dash-text); + background: var(--dash-surface-soft); +} + +.dashboard-app-nav-link.active { + color: var(--dash-primary); + background: var(--dash-primary-light); + font-weight: 600; +} + +.dashboard-app-actions { + display: flex; + align-items: center; + gap: 0.75rem; +} + +.dashboard-action-link { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 12px; + border-radius: 6px; + font-size: 0.85rem; + font-weight: 600; + text-decoration: none !important; + color: var(--dash-text-secondary); + border: 1px solid var(--dash-border); + background: var(--dash-surface); + transition: all 0.15s ease; +} + +.dashboard-action-link:hover { + color: var(--dash-text); + background: var(--dash-surface-soft); + border-color: var(--dash-text-muted); +} + +.dashboard-action-link.store-link { + background: transparent; + color: var(--dash-accent, #ff7518); + border-color: rgba(255, 117, 24, 0.3); +} + +.dashboard-action-link.store-link:hover { + background: rgba(255, 117, 24, 0.08); + border-color: var(--dash-accent, #ff7518); + color: var(--dash-accent, #ff7518); +} + +.dashboard-user-link { + display: inline-flex; + align-items: center; + gap: 6px; + padding: 6px 14px; + border-radius: 6px; + font-size: 0.85rem; + font-weight: 600; + text-decoration: none !important; + color: var(--dash-text); + background: var(--dash-surface-soft); + border: 1px solid var(--dash-border); + transition: all 0.15s ease; +} + +.dashboard-user-link:hover { + background: var(--dash-hover); + border-color: var(--dash-text-secondary); +} + +.dashboard-mobile-toggle { + display: none; + background: transparent; + border: none; + color: var(--dash-text); + cursor: pointer; + padding: 4px; + align-items: center; + justify-content: center; +} + +@media (max-width: 860px) { + .dashboard-mobile-toggle { + display: flex; + } + + .dashboard-app-nav-wrap { + display: none; + position: absolute; + top: 100%; + left: 0; + right: 0; + background: var(--dash-surface); + border-bottom: 1px solid var(--dash-border); + flex-direction: column; + padding: 1rem 1.5rem 1.5rem; + gap: 1rem; + margin-left: 0; + box-shadow: 0 8px 16px rgba(0,0,0,0.08); + } + + .dashboard-app-nav-wrap.open { + display: flex; + } + + .dashboard-app-nav { + flex-direction: column; + width: 100%; + align-items: stretch; + } + + .dashboard-app-nav-link { + padding: 10px 14px; + } + + .dashboard-app-actions { + flex-direction: column; + width: 100%; + align-items: stretch; + padding-top: 0.75rem; + border-top: 1px solid var(--dash-border); + } + + .dashboard-action-link, .dashboard-user-link { + justify-content: center; + padding: 10px; + } +} + +/* Studio dark theme overrides for developer studio header when in ManagePlugin or AddPlugin */ +.dashboard-container:has(.mp-root) .dashboard-app-header, +.dashboard-container:has(.ap-root) .dashboard-app-header { + background: var(--mp-surface, #151820); + border-color: var(--mp-border, #252a38); + margin-bottom: 0 !important; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); +} + +.dashboard-container:has(.mp-root) .dashboard-app-brand, +.dashboard-container:has(.ap-root) .dashboard-app-brand { + color: var(--mp-text, #e8eaf2); +} + +.dashboard-container:has(.mp-root) .dashboard-app-nav-link, +.dashboard-container:has(.ap-root) .dashboard-app-nav-link { + color: var(--mp-text-2, #8b91a8); +} + +.dashboard-container:has(.mp-root) .dashboard-app-nav-link:hover, +.dashboard-container:has(.ap-root) .dashboard-app-nav-link:hover { + color: var(--mp-text, #e8eaf2); + background: var(--mp-surface-2, #1c2030); +} + +.dashboard-container:has(.mp-root) .dashboard-app-nav-link.active, +.dashboard-container:has(.ap-root) .dashboard-app-nav-link.active { + color: #ffffff; + background: rgba(79, 126, 255, 0.18); +} + +.dashboard-container:has(.mp-root) .dashboard-action-link, +.dashboard-container:has(.ap-root) .dashboard-action-link { + background: var(--mp-surface-2, #1c2030); + border-color: var(--mp-border, #252a38); + color: var(--mp-text-2, #8b91a8); +} + +.dashboard-container:has(.mp-root) .dashboard-action-link:hover, +.dashboard-container:has(.ap-root) .dashboard-action-link:hover { + color: var(--mp-text, #e8eaf2); + background: #252a38; +} + +.dashboard-container:has(.mp-root) .dashboard-action-link.store-link, +.dashboard-container:has(.ap-root) .dashboard-action-link.store-link { + background: transparent; + color: var(--dash-accent, #ff7518); + border-color: rgba(255, 117, 24, 0.3); +} + +.dashboard-container:has(.mp-root) .dashboard-action-link.store-link:hover, +.dashboard-container:has(.ap-root) .dashboard-action-link.store-link:hover { + background: rgba(255, 117, 24, 0.12); + border-color: var(--dash-accent, #ff7518); +} + +.dashboard-container:has(.mp-root) .dashboard-user-link, +.dashboard-container:has(.ap-root) .dashboard-user-link { + background: var(--mp-surface-2, #1c2030); + border-color: var(--mp-border, #252a38); + color: var(--mp-text, #e8eaf2); +} + +.dashboard-container:has(.mp-root) .dashboard-user-link:hover, +.dashboard-container:has(.ap-root) .dashboard-user-link:hover { + background: #252a38; +} + +.dashboard-container:has(.mp-root) .dashboard-mobile-toggle, +.dashboard-container:has(.ap-root) .dashboard-mobile-toggle { + color: var(--mp-text, #e8eaf2); +} + +.dashboard-container:has(.mp-root) .dashboard-app-nav-wrap, +.dashboard-container:has(.ap-root) .dashboard-app-nav-wrap { + background: var(--mp-surface, #151820); + border-color: var(--mp-border, #252a38); +} + /* Override App.css within the dashboard */ .dashboard-content, .dashboard-nav { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; diff --git a/src/pages/dashboard/plugin/AddPlugin.css b/src/pages/dashboard/plugin/AddPlugin.css index 04081d6..64c4ab0 100644 --- a/src/pages/dashboard/plugin/AddPlugin.css +++ b/src/pages/dashboard/plugin/AddPlugin.css @@ -4,7 +4,8 @@ .ap-root { display: flex; flex-direction: column; - height: calc(100vh - 133px); + /* developer studio navbar ~58px */ + height: calc(100vh - 58px); background: var(--mp-bg); color: var(--mp-text); font-family: var(--font-display); @@ -338,6 +339,7 @@ .ap-success p { color: var(--mp-text-2); font-size: 0.9rem; margin: 0; } /* ── Dashboard padding reset ────────────────────────────────── */ -.dashboard-content:has(.ap-root) { padding: 0 !important; margin: 0 !important; overflow: hidden; } -.dashboard-container:has(.ap-root) .dashboard-nav { margin-bottom: 0 !important; } -.dashboard-container:has(.ap-root) .dashboard-content { padding: 0 !important; flex: 1; overflow: hidden; } \ No newline at end of file +.dashboard-content:has(.ap-root) { padding: 0 !important; margin: 0 !important; overflow: hidden; max-width: 100% !important; width: 100% !important; } +.dashboard-container:has(.ap-root) { display: flex; flex-direction: column; height: 100vh; overflow: hidden; } +.dashboard-container:has(.ap-root) .dashboard-app-header { margin-bottom: 0 !important; } +.dashboard-container:has(.ap-root) .dashboard-content { padding: 0 !important; flex: 1; overflow: hidden; max-width: 100% !important; width: 100% !important; } \ No newline at end of file diff --git a/src/pages/dashboard/plugin/ManagePlugin.css b/src/pages/dashboard/plugin/ManagePlugin.css index da8d2c4..79a9fd1 100644 --- a/src/pages/dashboard/plugin/ManagePlugin.css +++ b/src/pages/dashboard/plugin/ManagePlugin.css @@ -38,8 +38,8 @@ .mp-root { display: flex; - /* navbar ~83px + dashboard-nav ~50px */ - height: calc(100vh - 133px); + /* developer studio navbar ~58px */ + height: calc(100vh - 58px); background: var(--mp-bg); color: var(--mp-text); font-family: var(--font-display); @@ -52,7 +52,7 @@ flex-direction: column; align-items: center; justify-content: center; - min-height: calc(100vh - 133px); + min-height: calc(100vh - 58px); gap: 1rem; background: var(--mp-bg); color: var(--mp-text-2); @@ -626,22 +626,27 @@ padding: 0 !important; margin: 0 !important; overflow: hidden; -} - -/* Also kill the nav bottom margin and content padding from Dashboard.css */ -.dashboard-container:has(.mp-root) .dashboard-nav { - margin-bottom: 0 !important; + max-width: 100% !important; + width: 100% !important; } .dashboard-container:has(.mp-root) { display: flex; flex-direction: column; + height: 100vh; + overflow: hidden; +} + +.dashboard-container:has(.mp-root) .dashboard-app-header { + margin-bottom: 0 !important; } .dashboard-container:has(.mp-root) .dashboard-content { padding: 0 !important; flex: 1; overflow: hidden; + max-width: 100% !important; + width: 100% !important; } /* ── Scrollbar ──────────────────────────────────────────────── */