chore: smaller fixes

This commit is contained in:
Alexander Medvedev 2026-08-24 16:38:08 +02:00
parent b1ca88602c
commit 6cfca656e8
9 changed files with 875 additions and 535 deletions

480
package-lock.json generated
View File

@ -8,20 +8,20 @@
"name": "client", "name": "client",
"version": "0.0.0", "version": "0.0.0",
"dependencies": { "dependencies": {
"@marsidev/react-turnstile": "^1.5.4", "@marsidev/react-turnstile": "^1.6.0",
"@vnedyalk0v/react19-simple-maps": "^2.0.10", "@vnedyalk0v/react19-simple-maps": "^2.0.10",
"axios": "^1.19.0", "axios": "^1.19.0",
"country-list": "^2.4.1", "country-list": "^2.4.1",
"d3-geo": "^3.1.1", "d3-geo": "^3.1.1",
"d3-scale": "^4.0.2", "d3-scale": "^4.0.2",
"i18next": "^26.3.6", "i18next": "^26.4.0",
"i18next-browser-languagedetector": "^8.2.1", "i18next-browser-languagedetector": "^8.2.1",
"lucide-react": "^1.28.0", "lucide-react": "^1.34.0",
"or": "^0.2.0", "or": "^0.2.0",
"qrcode.react": "^4.2.0", "qrcode.react": "^4.2.0",
"react": "^19.2.8", "react": "^19.2.8",
"react-dom": "^19.2.8", "react-dom": "^19.2.8",
"react-i18next": "^17.0.11", "react-i18next": "^17.0.12",
"react-is": "^19.2.8", "react-is": "^19.2.8",
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",
"react-router-dom": "^7.18.2", "react-router-dom": "^7.18.2",
@ -31,17 +31,17 @@
"devDependencies": { "devDependencies": {
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@types/country-list": "^2.1.4", "@types/country-list": "^2.1.4",
"@types/node": "^26.1.2", "@types/node": "^26.2.0",
"@types/react": "^19.2.18", "@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4", "@types/react-dom": "^19.2.5",
"@vitejs/plugin-react": "^6.0.5", "@vitejs/plugin-react": "^6.1.0",
"eslint": "^10.8.0", "eslint": "^10.9.0",
"eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-react-refresh": "^0.5.3", "eslint-plugin-react-refresh": "^0.5.4",
"globals": "^17.8.0", "globals": "^17.11.0",
"typescript": "^7.0.2", "typescript": "^7.0.2",
"typescript-eslint": "^8.65.0", "typescript-eslint": "^8.67.0",
"vite": "^8.2.0" "vite": "^8.2.2"
} }
}, },
"node_modules/@babel/code-frame": { "node_modules/@babel/code-frame": {
@ -237,9 +237,9 @@
} }
}, },
"node_modules/@babel/runtime": { "node_modules/@babel/runtime": {
"version": "7.29.2", "version": "7.29.7",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
"integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
"license": "MIT", "license": "MIT",
"engines": { "engines": {
"node": ">=6.9.0" "node": ">=6.9.0"
@ -293,40 +293,6 @@
"node": ">=6.9.0" "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": { "node_modules/@eslint-community/eslint-utils": {
"version": "4.9.1", "version": "4.9.1",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz",
@ -572,41 +538,19 @@
} }
}, },
"node_modules/@marsidev/react-turnstile": { "node_modules/@marsidev/react-turnstile": {
"version": "1.5.4", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/@marsidev/react-turnstile/-/react-turnstile-1.5.4.tgz", "resolved": "https://registry.npmjs.org/@marsidev/react-turnstile/-/react-turnstile-1.6.0.tgz",
"integrity": "sha512-2+ulBzQPYcC5jZ4Pghlcc6a6+CQ6L0cgTxtbavZbcHcG5/wSQsTAM+vDudF94L9AUPG4uSNQF1kotmvx0Ns/QA==", "integrity": "sha512-T2Um71ZdBgQBiyS01xgRMvDWk+mEsrLtXLFVhOC917OVEO584wbPOWj1sw35RaM17+q9QoADgLVcH60xr9NRqQ==",
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
"react": "^17.0.2 || ^18.0.0 || ^19.0", "react": "^17.0.2 || ^18.0.0 || ^19.0",
"react-dom": "^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": { "node_modules/@oxc-project/types": {
"version": "0.142.0", "version": "0.146.0",
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz", "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.146.0.tgz",
"integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==", "integrity": "sha512-XC0QsnnhVe7sLIWmYmdPw7x5P0h4W8vUU3Nv1ySgWXtvCz8NizoAEpGXA0sOYoJQV2Rl13LgURAHQ5cI5ILCSA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"funding": { "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": { "node_modules/@rolldown/binding-android-arm64": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.5.tgz",
"integrity": "sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==", "integrity": "sha512-zXcwKlQApYAOELHd8PwKDFkagYF9Wy4e0RJ+0qnzl9Pjnpj75TEG8ufv40p2J7kCEfwZAsNiuzRIyNNMWT38ig==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -657,9 +618,9 @@
} }
}, },
"node_modules/@rolldown/binding-darwin-arm64": { "node_modules/@rolldown/binding-darwin-arm64": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.5.tgz",
"integrity": "sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==", "integrity": "sha512-dK4QakI42nzWgJT5sm4y4y/O//D4OxM75/cH28RLV+nzIN9AY+YsbuUVrUTjlLjXR6vpyxFbSsbmNuJ6BP9sww==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -674,9 +635,9 @@
} }
}, },
"node_modules/@rolldown/binding-darwin-x64": { "node_modules/@rolldown/binding-darwin-x64": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.5.tgz",
"integrity": "sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==", "integrity": "sha512-fqSALaUu1Wjd1nK2uW2kJDWdLCc8lx1IcY+MTY26Aurfdx19anlzhqXOgCFbBFQnlFDTn4TC1/7Nz4Bl2mLP3A==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -691,9 +652,9 @@
} }
}, },
"node_modules/@rolldown/binding-freebsd-x64": { "node_modules/@rolldown/binding-freebsd-x64": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.5.tgz",
"integrity": "sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==", "integrity": "sha512-/vCnNxlkxs9tKxNDcyWUePpJ/PgTzxIaVhoM5SmG8UV+GR/IcPam4VYxi7GIMo7PSDuNqlJqvprqii9NqqVCMw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -708,9 +669,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm-gnueabihf": { "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.5.tgz",
"integrity": "sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==", "integrity": "sha512-abk0NLA519LxRCszmbE0jYKuQ9YPocOXTiOXOo6Yr+YAT95VH+PtqYAjOJvGKt3viEd/x4qzabAlwd5bHOOARg==",
"cpu": [ "cpu": [
"arm" "arm"
], ],
@ -725,9 +686,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm64-gnu": { "node_modules/@rolldown/binding-linux-arm64-gnu": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.5.tgz",
"integrity": "sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==", "integrity": "sha512-Y7eALiJ8lr0M2HH103Js+g7V34wf6snlpZLAsHI90uLhr3PVlNsbFVAXJC9d/V6BnPyKtpSwI+NcB/RLxsQxuA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -742,9 +703,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-arm64-musl": { "node_modules/@rolldown/binding-linux-arm64-musl": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.5.tgz",
"integrity": "sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==", "integrity": "sha512-xMvZgnbZg4YVnR/AX2b3oOPDTFYJvUVaJg5FedA/LuvexAtXibZQej4cnTkw3rjsJ/ggUROB64TdtETiim+FYA==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -759,9 +720,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-ppc64-gnu": { "node_modules/@rolldown/binding-linux-ppc64-gnu": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.5.tgz",
"integrity": "sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==", "integrity": "sha512-GRjeqTUDHTo5GwntsLaAMcBahG3nlpjftXWZLN73HiYQlhwEowvarFgQnRnQZtIp4keXX7quXFbG38uPZBa2EA==",
"cpu": [ "cpu": [
"ppc64" "ppc64"
], ],
@ -776,9 +737,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-s390x-gnu": { "node_modules/@rolldown/binding-linux-s390x-gnu": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.5.tgz",
"integrity": "sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==", "integrity": "sha512-vLNTR45F2Uwc8AufkNXPmB4VliaXs+FvcheEogIzOXzO4l+LzieXF5A/TWxLy5HtqpsRCHUfd0lPVrrdgXdLHQ==",
"cpu": [ "cpu": [
"s390x" "s390x"
], ],
@ -793,9 +754,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-x64-gnu": { "node_modules/@rolldown/binding-linux-x64-gnu": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.5.tgz",
"integrity": "sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==", "integrity": "sha512-Mgj59/HTuYeK9Gz2MA+mBWKnHsAgkBSec15ZMb1st3oIfFbX7gCjOae7GydHhzcyQi9Z/7M1QuN9bR3oFqF0jQ==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -810,9 +771,9 @@
} }
}, },
"node_modules/@rolldown/binding-linux-x64-musl": { "node_modules/@rolldown/binding-linux-x64-musl": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.5.tgz",
"integrity": "sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==", "integrity": "sha512-mY8AP0/ichsbhAxGnLa3d3+MwV0EfgrPND2bplI3Ym8T6R2pJ0N87bvrKVwNXmdy3jnr6eQBecdqx/HMknBmpA==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -827,9 +788,9 @@
} }
}, },
"node_modules/@rolldown/binding-openharmony-arm64": { "node_modules/@rolldown/binding-openharmony-arm64": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.5.tgz",
"integrity": "sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==", "integrity": "sha512-8SLssA2oweAxyRgDp789ACfRb/3P+zNRJpzZxSizxF9m8NUDQ4+3xjo8ttjhVGGw6Qxb70oZiEtIjaKikCO7Yw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -843,26 +804,10 @@
"node": "^20.19.0 || >=22.12.0" "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": { "node_modules/@rolldown/binding-win32-arm64-msvc": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.5.tgz",
"integrity": "sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==", "integrity": "sha512-vGbruD5zquhoc8D9SViXgN2FBJtNdTyQ4DtG+SWiEGlJiAzoKcZ2xp+xuXCffhubVdt0NJlTZqkeRuERy7g8Cw==",
"cpu": [ "cpu": [
"arm64" "arm64"
], ],
@ -877,9 +822,9 @@
} }
}, },
"node_modules/@rolldown/binding-win32-x64-msvc": { "node_modules/@rolldown/binding-win32-x64-msvc": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz", "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.5.tgz",
"integrity": "sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==", "integrity": "sha512-e/SXpgISz+IoqVcSSI0rx/d/he8zqLex+/rCWpnHpmVfmPIUjag9H6P7zotf0gJHwPUhQxZ/mF8tr6acebT9yw==",
"cpu": [ "cpu": [
"x64" "x64"
], ],
@ -912,17 +857,6 @@
"integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==",
"license": "MIT" "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": { "node_modules/@types/country-list": {
"version": "2.1.4", "version": "2.1.4",
"resolved": "https://registry.npmjs.org/@types/country-list/-/country-list-2.1.4.tgz", "resolved": "https://registry.npmjs.org/@types/country-list/-/country-list-2.1.4.tgz",
@ -1056,9 +990,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "26.1.2", "version": "26.2.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-26.2.0.tgz",
"integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==", "integrity": "sha512-5IviulTZeRNp2vAJ514cc/HUlY5nZ9fCbq9DMyC52BrhFZACo3nI0R7qBxhQmo/d27NFe96ur/b7Wwxklda+kg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1076,9 +1010,9 @@
} }
}, },
"node_modules/@types/react-dom": { "node_modules/@types/react-dom": {
"version": "19.2.4", "version": "19.2.5",
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.4.tgz", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.5.tgz",
"integrity": "sha512-Bsc+QHgp+P/F02XDzNCY9jnZNCUuLki36KT7VKrTXXLdHf+vHMNZnW1rVu5DNW/rCK+fya3DATySbLM4yhtKUw==", "integrity": "sha512-fMPwH9v7r/pp43yUd2/Mbiex5KouJwwR3dzHkhLREUC6764VyDsqxhAxv6OFEYR1RhjOyD1naqba8ECDBe7ZQg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
@ -1098,17 +1032,17 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/@typescript-eslint/eslint-plugin": { "node_modules/@typescript-eslint/eslint-plugin": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.67.0.tgz",
"integrity": "sha512-IEgob78X12rHpUmtcwFsXhZdVGJtwTVP8FiCLZkR6GlYVrl2PcuB+KhCE5BlVC/eQpQnu8WXRtkHZuPar+gCRA==", "integrity": "sha512-Un7Heoyj65NREbKAyIrFxeM143NZpExWmy1Nep4DLeQOeLlTeumPjoNKnBrU5D5moWXbPJgRa5Uwcdu0faVNGQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/regexpp": "^4.12.2", "@eslint-community/regexpp": "^4.12.2",
"@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/scope-manager": "8.67.0",
"@typescript-eslint/type-utils": "8.65.0", "@typescript-eslint/type-utils": "8.67.0",
"@typescript-eslint/utils": "8.65.0", "@typescript-eslint/utils": "8.67.0",
"@typescript-eslint/visitor-keys": "8.65.0", "@typescript-eslint/visitor-keys": "8.67.0",
"ignore": "^7.0.5", "ignore": "^7.0.5",
"natural-compare": "^1.4.0", "natural-compare": "^1.4.0",
"ts-api-utils": "^2.5.0" "ts-api-utils": "^2.5.0"
@ -1121,7 +1055,7 @@
"url": "https://opencollective.com/typescript-eslint" "url": "https://opencollective.com/typescript-eslint"
}, },
"peerDependencies": { "peerDependencies": {
"@typescript-eslint/parser": "^8.65.0", "@typescript-eslint/parser": "^8.67.0",
"eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
"typescript": ">=4.8.4 <6.1.0" "typescript": ">=4.8.4 <6.1.0"
} }
@ -1137,16 +1071,16 @@
} }
}, },
"node_modules/@typescript-eslint/parser": { "node_modules/@typescript-eslint/parser": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.67.0.tgz",
"integrity": "sha512-CZ4nMxWwgu1HEEFNkeaCptra9QCtkmKdgf3sWh1rl1trIhmxLilgTV4cwcbQ4wemnT4sWQN8CaKOmdYx+g2gMA==", "integrity": "sha512-fUBfTuuEulWqX6V8+O3PtScV01tzYYRUDTAirHFKoRAt7nOzoGiPt0M/bB47wWNy0coOOcgEwAMUtBpykMxl6w==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/scope-manager": "8.67.0",
"@typescript-eslint/types": "8.65.0", "@typescript-eslint/types": "8.67.0",
"@typescript-eslint/typescript-estree": "8.65.0", "@typescript-eslint/typescript-estree": "8.67.0",
"@typescript-eslint/visitor-keys": "8.65.0", "@typescript-eslint/visitor-keys": "8.67.0",
"debug": "^4.4.3" "debug": "^4.4.3"
}, },
"engines": { "engines": {
@ -1162,14 +1096,14 @@
} }
}, },
"node_modules/@typescript-eslint/project-service": { "node_modules/@typescript-eslint/project-service": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.67.0.tgz",
"integrity": "sha512-SxnPhbTsGahizDgbu7oqFH/xVtzIqMd/s+WtnSxNxJZJpLbdT5IPdzg8EZxO3+PoKahXmwJLeNQOpKJb3/bi7Q==", "integrity": "sha512-cvE8c7ulYeXN9fYuszhCeCsbzyVEXuhrRCybnBre7TUmqb5nRmBfQAwCj0O3WJFDeyAZt4VYv51vMCC9LHSdYw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/tsconfig-utils": "^8.65.0", "@typescript-eslint/tsconfig-utils": "^8.67.0",
"@typescript-eslint/types": "^8.65.0", "@typescript-eslint/types": "^8.67.0",
"debug": "^4.4.3" "debug": "^4.4.3"
}, },
"engines": { "engines": {
@ -1184,14 +1118,14 @@
} }
}, },
"node_modules/@typescript-eslint/scope-manager": { "node_modules/@typescript-eslint/scope-manager": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.67.0.tgz",
"integrity": "sha512-Esbl8OSYiVxBokYgWPf7VVWg/BE798wXhimnn9ML9Pt5qoDf8bfQlgjlKXR/k98+AcNzlLKYrpCcrcuZ9DZLgg==", "integrity": "sha512-EgvsleTwS4E+WzzSvem8fAUubLwatMNF1B5hHSLQxcvs7q2dtRhGyujHwLJSYlG41niJ7GP24Aha2+0mb1b2kg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.65.0", "@typescript-eslint/types": "8.67.0",
"@typescript-eslint/visitor-keys": "8.65.0" "@typescript-eslint/visitor-keys": "8.67.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1202,9 +1136,9 @@
} }
}, },
"node_modules/@typescript-eslint/tsconfig-utils": { "node_modules/@typescript-eslint/tsconfig-utils": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.67.0.tgz",
"integrity": "sha512-j6GzGqCiRdA7Qhur2VVmKZAkBLfnHFQfx4TaJGL9RMveZqCo48jSHHO0DTgizEnGhtWnqmbtCUSrqSkdiY/0Hg==", "integrity": "sha512-vV+LUSv5njUWsknE71fqKTlXUva+R76SaeORd6Zojcunk/6DvKFXONU3BrAs2H49mbygUXt6gbYunzwqNwlhdg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -1219,15 +1153,15 @@
} }
}, },
"node_modules/@typescript-eslint/type-utils": { "node_modules/@typescript-eslint/type-utils": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.67.0.tgz",
"integrity": "sha512-YjaZ7PRI5qY7ax2L3PbvX0rRyGtipAReCWs0mhhDBHjH/vl0g0BonaGXrKdKpMbIIsMIwDgbk/xzkBTyAltS5g==", "integrity": "sha512-aVWDXbRmdXO9siTfX4ditQI1T9+zVcNazT48EJCD0v40/9RIFoUgZ05CmGEq9H2gixRpjUn/iplwvlcvutJW/Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.65.0", "@typescript-eslint/types": "8.67.0",
"@typescript-eslint/typescript-estree": "8.65.0", "@typescript-eslint/typescript-estree": "8.67.0",
"@typescript-eslint/utils": "8.65.0", "@typescript-eslint/utils": "8.67.0",
"debug": "^4.4.3", "debug": "^4.4.3",
"ts-api-utils": "^2.5.0" "ts-api-utils": "^2.5.0"
}, },
@ -1244,9 +1178,9 @@
} }
}, },
"node_modules/@typescript-eslint/types": { "node_modules/@typescript-eslint/types": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.67.0.tgz",
"integrity": "sha512-JSSwWNy+H0E/01jJEM+hrX6N0OFDzFzeIhHFSAS01tlVaevpG8cFyYRPhS5yjGOvBUx3sqQHVMjCL1CAZZMxBg==", "integrity": "sha512-sBtgslww8nsMYUjhdPBiSyUqSzT8uR6g93A2QXnQC8+cGdjz0CyaOdqHDRJb1AtORbZCNUJBBeFA/tNR2uQmww==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -1258,16 +1192,16 @@
} }
}, },
"node_modules/@typescript-eslint/typescript-estree": { "node_modules/@typescript-eslint/typescript-estree": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.67.0.tgz",
"integrity": "sha512-JboAE2swaYt4tb1fHhHTABE2K+OLy09XfcTbhnk4Pw96f9dd2e9iYsJ28gBggHlo5z5x1rkyWvcPoTuNTd4oGg==", "integrity": "sha512-EKQBCE9yNlRJYm7jdTW5AhDacDUmSwQb0FAJAmK2EKYrNXIsa2vxcSZx6PvJ/dEdI6lS+Y9W+EXckLj0iPFGcw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/project-service": "8.65.0", "@typescript-eslint/project-service": "8.67.0",
"@typescript-eslint/tsconfig-utils": "8.65.0", "@typescript-eslint/tsconfig-utils": "8.67.0",
"@typescript-eslint/types": "8.65.0", "@typescript-eslint/types": "8.67.0",
"@typescript-eslint/visitor-keys": "8.65.0", "@typescript-eslint/visitor-keys": "8.67.0",
"debug": "^4.4.3", "debug": "^4.4.3",
"minimatch": "^10.2.2", "minimatch": "^10.2.2",
"semver": "^7.7.3", "semver": "^7.7.3",
@ -1299,16 +1233,16 @@
} }
}, },
"node_modules/@typescript-eslint/utils": { "node_modules/@typescript-eslint/utils": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.67.0.tgz",
"integrity": "sha512-gXiwIHsYreboxeJucHKPvgwl7dXt50mF8s1/c00cP/WoVTyWKFdtfhRWwZiXYFU5H2O8vVoSLNrexFZjYS/SGA==", "integrity": "sha512-U9D1FdwEWBwok3hxxSdhclMb0twvt9QnjIQ0VfQ1AiX2epnpSgv2ubVDsayOFyY8K6FX+AQ7E0FKWVG3iKsj1A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@eslint-community/eslint-utils": "^4.9.1", "@eslint-community/eslint-utils": "^4.9.1",
"@typescript-eslint/scope-manager": "8.65.0", "@typescript-eslint/scope-manager": "8.67.0",
"@typescript-eslint/types": "8.65.0", "@typescript-eslint/types": "8.67.0",
"@typescript-eslint/typescript-estree": "8.65.0" "@typescript-eslint/typescript-estree": "8.67.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -1323,13 +1257,13 @@
} }
}, },
"node_modules/@typescript-eslint/visitor-keys": { "node_modules/@typescript-eslint/visitor-keys": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.65.0.tgz", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.67.0.tgz",
"integrity": "sha512-8C71BQkGjiMmXtop7pHVJu1l2NNShFdkCyD6a2ezzs5vU/L3LRtb69EtcteFwz0mYMPzIgOw0n6OV4VBUWZd7A==", "integrity": "sha512-fkv8dHRDqfGtTHuJeebdrQ7cX6Ad4WAS00rgHh9UGvMycF1mjBfsxry1XsLIFhWZ6Judlh6UdzK+TYlbpCXgnA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/types": "8.65.0", "@typescript-eslint/types": "8.67.0",
"eslint-visitor-keys": "^5.0.0" "eslint-visitor-keys": "^5.0.0"
}, },
"engines": { "engines": {
@ -1687,9 +1621,9 @@
"license": "ISC" "license": "ISC"
}, },
"node_modules/@vitejs/plugin-react": { "node_modules/@vitejs/plugin-react": {
"version": "6.0.5", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.0.5.tgz", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-6.1.0.tgz",
"integrity": "sha512-BOVzne/NL162sMdResB25mUv+vWMF5NoAjNf09TeGlE7ZpszZWSD3winycicLJw72yeVsoCn/2kOhEuCvEShMA==", "integrity": "sha512-qd2BzUBehkov86WFhg0JkEFEYyCLG9uPCe6qWTY/kRlss9OvJrOF2UbIWT7p+8IzZHkEu0DNGHc4HSv+JdDLsw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
@ -1701,6 +1635,7 @@
"peerDependencies": { "peerDependencies": {
"@rolldown/plugin-babel": "^0.1.7 || ^0.2.0", "@rolldown/plugin-babel": "^0.1.7 || ^0.2.0",
"babel-plugin-react-compiler": "^1.0.0", "babel-plugin-react-compiler": "^1.0.0",
"oxc-transform-react": "^0.145.0",
"vite": "^8.0.0" "vite": "^8.0.0"
}, },
"peerDependenciesMeta": { "peerDependenciesMeta": {
@ -1709,6 +1644,9 @@
}, },
"babel-plugin-react-compiler": { "babel-plugin-react-compiler": {
"optional": true "optional": true
},
"oxc-transform-react": {
"optional": true
} }
} }
}, },
@ -2436,9 +2374,9 @@
} }
}, },
"node_modules/eslint": { "node_modules/eslint": {
"version": "10.8.0", "version": "10.9.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-10.8.0.tgz", "resolved": "https://registry.npmjs.org/eslint/-/eslint-10.9.0.tgz",
"integrity": "sha512-nuKKvN+oIBO0koN7Tm7dlkmnkc21mtt0QJLwAKzjLq14y6lRTdVG36MZHJ8eQHwdJMwZbQNMlPOYedMq/oVJvQ==", "integrity": "sha512-5KeEOJZBfEVA47boFiBsf+6MmmJpffM7qEBg4pLla2e4nlKgdKlqCW0oSLOGsT8Wl5uCGJptLV1bkaiShj90Gw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"workspaces": [ "workspaces": [
@ -2515,9 +2453,9 @@
} }
}, },
"node_modules/eslint-plugin-react-refresh": { "node_modules/eslint-plugin-react-refresh": {
"version": "0.5.3", "version": "0.5.4",
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.3.tgz", "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.5.4.tgz",
"integrity": "sha512-5EMmLCV98Pi4o/f/3DP/v/tNqLHMIc9I8LKClNDWhZ9JTho89/kQcitCXQBMG7sAfVRK0Ie3T2EDOzp1YXYiVA==", "integrity": "sha512-7bqTKz7T0r+HKWFarNXByDE9/5+73wI2ru+M3zuqGbR7s/b/5/pQJXZoufWlrngqGqoZto73ZkGumCdLxk+4rw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peerDependencies": { "peerDependencies": {
@ -2853,9 +2791,9 @@
} }
}, },
"node_modules/globals": { "node_modules/globals": {
"version": "17.8.0", "version": "17.11.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-17.8.0.tgz", "resolved": "https://registry.npmjs.org/globals/-/globals-17.11.0.tgz",
"integrity": "sha512-Zz/LMDZScFmkakeL2cTHzf+PbWKdpU3uclqkZT7TjDG58j5WPt0PpA+n9uPI24fZtlw07q0OtEi84K+umsRzqQ==", "integrity": "sha512-Z2I8hM+PbJDXQDq3Icgpzv+mPdwr68iZUU9d5WW4FuXfDUQfkZaZuvjMv42/5crNyw154+9+VWXbYrUgDXbxNw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"engines": { "engines": {
@ -3006,9 +2944,9 @@
} }
}, },
"node_modules/i18next": { "node_modules/i18next": {
"version": "26.3.6", "version": "26.4.0",
"resolved": "https://registry.npmjs.org/i18next/-/i18next-26.3.6.tgz", "resolved": "https://registry.npmjs.org/i18next/-/i18next-26.4.0.tgz",
"integrity": "sha512-Bu5Z2nAXgfVyM8xvW3jk9EKRIuX37PudsrBViThNFx7CR7aaYTpP01cxNB/E4c4UUzTDiAZRstEhsRfPOL/8xA==", "integrity": "sha512-rsmK5bFqsD1AetSFSIa43wtNR4WpvvH4p0tLEsTxkC7QTrfdFm06nbQ95bh8Og4wwaCnUEcm9DVYL2cgxitiQg==",
"funding": [ "funding": [
{ {
"type": "individual", "type": "individual",
@ -3549,9 +3487,9 @@
} }
}, },
"node_modules/lucide-react": { "node_modules/lucide-react": {
"version": "1.28.0", "version": "1.34.0",
"resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.28.0.tgz", "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.34.0.tgz",
"integrity": "sha512-fARAFJULsGuDDydjp6+6blekG/sBIM29TerzLjc9bQUKAcEfrSc4ZQKb25KRz4OMKd87cZTb5dgq0w/T6KufVg==", "integrity": "sha512-vnjGJNI7Htk5+oWW8gXGuaLgwgAb0T6/iZbBrp9JCfRFwdNWZ0YTm3eyxjOLgwN6r8iyAf3UA70zNmBRBNv7yg==",
"license": "ISC", "license": "ISC",
"peerDependencies": { "peerDependencies": {
"react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0"
@ -4465,9 +4403,9 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/nanoid": { "node_modules/nanoid": {
"version": "3.3.16", "version": "3.3.18",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz",
"integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -4624,9 +4562,9 @@
} }
}, },
"node_modules/postcss": { "node_modules/postcss": {
"version": "8.5.23", "version": "8.5.26",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.23.tgz", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz",
"integrity": "sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==", "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
@ -4644,7 +4582,7 @@
], ],
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"nanoid": "^3.3.16", "nanoid": "^3.3.17",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
"source-map-js": "^1.2.1" "source-map-js": "^1.2.1"
}, },
@ -4722,12 +4660,12 @@
} }
}, },
"node_modules/react-i18next": { "node_modules/react-i18next": {
"version": "17.0.11", "version": "17.0.12",
"resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.11.tgz", "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-17.0.12.tgz",
"integrity": "sha512-cDtkXgxjuFTWUH6V+aQn1Ve5vDiUztCNPWW5GtSHDccsgRXO1nE6QFWCEmc1KAutrb3OUv87wFShJL5RhUwPXg==", "integrity": "sha512-lFWPEGkxQ6RhusdUkysFBD58VHfSSzvHBzqMgN0SvfVpdQGfwtNkStTqdy08/sJd7s807qqutgx93fRpD0DJ3Q==",
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@babel/runtime": "^7.29.2", "@babel/runtime": "^7.29.7",
"html-parse-stringify": "^4.0.1", "html-parse-stringify": "^4.0.1",
"use-sync-external-store": "^1.6.0" "use-sync-external-store": "^1.6.0"
}, },
@ -4960,13 +4898,13 @@
"license": "MIT" "license": "MIT"
}, },
"node_modules/rolldown": { "node_modules/rolldown": {
"version": "1.2.1", "version": "1.2.5",
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.5.tgz",
"integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==", "integrity": "sha512-VD2IE5PUG4Oj8zz2VGykiYd5wbnjdIiSsNQb8Qu5B+noEp+A78mu2iVvpp27g8es14Tk9rofNs5Tku9iQCS4fA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@oxc-project/types": "=0.142.0", "@oxc-project/types": "=0.146.0",
"@rolldown/pluginutils": "^1.0.0" "@rolldown/pluginutils": "^1.0.0"
}, },
"bin": { "bin": {
@ -4976,21 +4914,21 @@
"node": "^20.19.0 || >=22.12.0" "node": "^20.19.0 || >=22.12.0"
}, },
"optionalDependencies": { "optionalDependencies": {
"@rolldown/binding-android-arm64": "1.2.1", "@rolldown/binding-android-arm-eabi": "1.2.5",
"@rolldown/binding-darwin-arm64": "1.2.1", "@rolldown/binding-android-arm64": "1.2.5",
"@rolldown/binding-darwin-x64": "1.2.1", "@rolldown/binding-darwin-arm64": "1.2.5",
"@rolldown/binding-freebsd-x64": "1.2.1", "@rolldown/binding-darwin-x64": "1.2.5",
"@rolldown/binding-linux-arm-gnueabihf": "1.2.1", "@rolldown/binding-freebsd-x64": "1.2.5",
"@rolldown/binding-linux-arm64-gnu": "1.2.1", "@rolldown/binding-linux-arm-gnueabihf": "1.2.5",
"@rolldown/binding-linux-arm64-musl": "1.2.1", "@rolldown/binding-linux-arm64-gnu": "1.2.5",
"@rolldown/binding-linux-ppc64-gnu": "1.2.1", "@rolldown/binding-linux-arm64-musl": "1.2.5",
"@rolldown/binding-linux-s390x-gnu": "1.2.1", "@rolldown/binding-linux-ppc64-gnu": "1.2.5",
"@rolldown/binding-linux-x64-gnu": "1.2.1", "@rolldown/binding-linux-s390x-gnu": "1.2.5",
"@rolldown/binding-linux-x64-musl": "1.2.1", "@rolldown/binding-linux-x64-gnu": "1.2.5",
"@rolldown/binding-openharmony-arm64": "1.2.1", "@rolldown/binding-linux-x64-musl": "1.2.5",
"@rolldown/binding-wasm32-wasi": "1.2.1", "@rolldown/binding-openharmony-arm64": "1.2.5",
"@rolldown/binding-win32-arm64-msvc": "1.2.1", "@rolldown/binding-win32-arm64-msvc": "1.2.5",
"@rolldown/binding-win32-x64-msvc": "1.2.1" "@rolldown/binding-win32-x64-msvc": "1.2.5"
} }
}, },
"node_modules/scheduler": { "node_modules/scheduler": {
@ -5160,14 +5098,6 @@
"typescript": ">=4.8.4" "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": { "node_modules/type-check": {
"version": "0.4.0", "version": "0.4.0",
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
@ -5217,16 +5147,16 @@
} }
}, },
"node_modules/typescript-eslint": { "node_modules/typescript-eslint": {
"version": "8.65.0", "version": "8.67.0",
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.65.0.tgz", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.67.0.tgz",
"integrity": "sha512-/ggrHAwyjENDusvyxbuqxAC2dTnZg/Z8F+fgQtYIz+L6n/9HfSlEZcFGV/NsMNa6CkGk0xUjUAFwC0vHOflvIA==", "integrity": "sha512-S2udFs8tCKEKffuJ4TB1idGUZiXdCPGi3IPBGWXarbLQ5UPXORV8QEVzJ4gCRduURMb5EkpNCdjbk0eDIuI8Yg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"@typescript-eslint/eslint-plugin": "8.65.0", "@typescript-eslint/eslint-plugin": "8.67.0",
"@typescript-eslint/parser": "8.65.0", "@typescript-eslint/parser": "8.67.0",
"@typescript-eslint/typescript-estree": "8.65.0", "@typescript-eslint/typescript-estree": "8.67.0",
"@typescript-eslint/utils": "8.65.0" "@typescript-eslint/utils": "8.67.0"
}, },
"engines": { "engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0" "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
@ -5435,16 +5365,16 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "8.2.0", "version": "8.2.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.2.tgz",
"integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", "integrity": "sha512-cFKLV/PRgAUlIRm5WjMjJ86jrftzpqcgH+Us+DS8mI3CDNiH30Whrz8uHL3+MOLPAgqbMBAqWdAHAphOAM+z/Q==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
"lightningcss": "^1.33.0", "lightningcss": "^1.33.0",
"picomatch": "^4.0.5", "picomatch": "^4.0.5",
"postcss": "^8.5.23", "postcss": "^8.5.26",
"rolldown": "~1.2.0", "rolldown": "~1.2.4",
"tinyglobby": "^0.2.17" "tinyglobby": "^0.2.17"
}, },
"bin": { "bin": {
@ -5461,7 +5391,7 @@
}, },
"peerDependencies": { "peerDependencies": {
"@types/node": "^20.19.0 || >=22.12.0", "@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", "esbuild": "^0.27.0 || ^0.28.0",
"jiti": ">=1.21.0", "jiti": ">=1.21.0",
"less": "^4.0.0", "less": "^4.0.0",

View File

@ -11,20 +11,20 @@
"preview": "vite preview" "preview": "vite preview"
}, },
"dependencies": { "dependencies": {
"@marsidev/react-turnstile": "^1.5.4", "@marsidev/react-turnstile": "^1.6.0",
"@vnedyalk0v/react19-simple-maps": "^2.0.10", "@vnedyalk0v/react19-simple-maps": "^2.0.10",
"axios": "^1.19.0", "axios": "^1.19.0",
"country-list": "^2.4.1", "country-list": "^2.4.1",
"d3-geo": "^3.1.1", "d3-geo": "^3.1.1",
"d3-scale": "^4.0.2", "d3-scale": "^4.0.2",
"i18next": "^26.3.6", "i18next": "^26.4.0",
"i18next-browser-languagedetector": "^8.2.1", "i18next-browser-languagedetector": "^8.2.1",
"lucide-react": "^1.28.0", "lucide-react": "^1.34.0",
"or": "^0.2.0", "or": "^0.2.0",
"qrcode.react": "^4.2.0", "qrcode.react": "^4.2.0",
"react": "^19.2.8", "react": "^19.2.8",
"react-dom": "^19.2.8", "react-dom": "^19.2.8",
"react-i18next": "^17.0.11", "react-i18next": "^17.0.12",
"react-is": "^19.2.8", "react-is": "^19.2.8",
"react-markdown": "^10.1.0", "react-markdown": "^10.1.0",
"react-router-dom": "^7.18.2", "react-router-dom": "^7.18.2",
@ -34,19 +34,19 @@
"devDependencies": { "devDependencies": {
"@eslint/js": "^10.0.1", "@eslint/js": "^10.0.1",
"@types/country-list": "^2.1.4", "@types/country-list": "^2.1.4",
"@types/node": "^26.1.2", "@types/node": "^26.2.0",
"@types/react": "^19.2.18", "@types/react": "^19.2.18",
"@types/react-dom": "^19.2.4", "@types/react-dom": "^19.2.5",
"@vitejs/plugin-react": "^6.0.5", "@vitejs/plugin-react": "^6.1.0",
"eslint": "^10.8.0", "eslint": "^10.9.0",
"eslint-plugin-react-hooks": "^7.1.1", "eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-react-refresh": "^0.5.3", "eslint-plugin-react-refresh": "^0.5.4",
"globals": "^17.8.0", "globals": "^17.11.0",
"typescript": "^7.0.2", "typescript": "^7.0.2",
"typescript-eslint": "^8.65.0", "typescript-eslint": "^8.67.0",
"vite": "^8.2.0" "vite": "^8.2.2"
}, },
"overrides": { "overrides": {
"vite": "^8.2.0" "vite": "^8.2.2"
} }
} }

View File

@ -474,8 +474,7 @@ h3 {
grid-template-columns: 1fr; grid-template-columns: 1fr;
} }
.auth-card, .auth-card {
.settings-card {
padding: 2rem 1.5rem; padding: 2rem 1.5rem;
} }
} }
@ -909,8 +908,7 @@ h3 {
padding: 2rem; padding: 2rem;
} }
.auth-card, .auth-card {
.settings-card {
background: var(--surface); background: var(--surface);
border: 1px solid var(--border); border: 1px solid var(--border);
padding: 3rem; padding: 3rem;
@ -1950,7 +1948,103 @@ h3 {
/* Screenshot Gallery */ /* Screenshot Gallery */
.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 { .lightbox-overlay {
@ -2049,76 +2143,7 @@ h3 {
} }
/* --- Profile Page --- */ /* --- Form Groups & Messages --- */
.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-group { .form-group {
margin-bottom: 1.5rem; margin-bottom: 1.5rem;
@ -2568,120 +2593,7 @@ h3 {
font-weight: 700; 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 { .btn-report {
background: none; background: none;
@ -2830,7 +2742,7 @@ h3 {
position: relative; position: relative;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
background: var(--bg); background: var(--surface);
border: 1px solid var(--border); border: 1px solid var(--border);
border-radius: 10px; border-radius: 10px;
overflow: hidden; overflow: hidden;
@ -3176,7 +3088,40 @@ h3 {
SETTINGS PAGE (ProfilePage.tsx) 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 ── */ /* ── 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 { .settings-nav-user {
display: flex; display: flex;
align-items: center; align-items: center;
@ -3198,7 +3143,7 @@ h3 {
} }
.settings-nav-meta { overflow: hidden; } .settings-nav-meta { overflow: hidden; }
.settings-nav-name { .settings-nav-name {
font-size: 0.9rem; font-size: 0.92rem;
font-weight: 700; font-weight: 700;
color: var(--text); color: var(--text);
margin: 0; margin: 0;
@ -3207,9 +3152,9 @@ h3 {
text-overflow: ellipsis; text-overflow: ellipsis;
} }
.settings-nav-email { .settings-nav-email {
font-size: 0.75rem; font-size: 0.78rem;
color: var(--text-muted); color: var(--text-muted);
margin: 0.1rem 0 0; margin: 0.15rem 0 0;
white-space: nowrap; white-space: nowrap;
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
@ -3222,15 +3167,56 @@ h3 {
.profile-nav-item { .profile-nav-item {
display: flex; display: flex;
align-items: center; 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 { color: #ef4444; }
.profile-nav-item.danger:hover { background: rgba(239, 68, 68, 0.1); } .profile-nav-item.danger:hover { background: rgba(239, 68, 68, 0.12); color: #ef4444; }
.profile-nav-item.danger.active { background: rgba(239, 68, 68, 0.15); 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 ── */ /* ── Section header ── */
.settings-section-header { .settings-section-header {
margin-bottom: 2rem; margin-bottom: 0.5rem;
padding-bottom: 1.25rem; padding-bottom: 1.25rem;
border-bottom: 1px solid var(--border); border-bottom: 1px solid var(--border);
} }
@ -3241,27 +3227,32 @@ h3 {
line-height: 1.5; line-height: 1.5;
} }
/* ── Settings card ── */ /* ── Settings card (Unified clean card surface) ── */
.settings-card { .settings-card {
background: var(--bg); background: var(--surface);
border: 1px solid var(--border); border: 1px solid var(--border);
border-radius: 12px; border-radius: 14px;
margin-bottom: 1.25rem; margin-bottom: 1.25rem;
overflow: hidden; 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 { .settings-card-header {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
gap: 0.85rem; gap: 0.85rem;
padding: 1.15rem 1.5rem; padding: 1.25rem 1.75rem;
border-bottom: 1px solid var(--border); border-bottom: 1px solid var(--border);
background: var(--surface); background: rgba(255, 255, 255, 0.02);
} }
.settings-card-icon { .settings-card-icon {
width: 32px; width: 34px;
height: 32px; height: 34px;
border-radius: 8px; border-radius: 8px;
background: rgba(var(--primary-rgb), 0.12); background: rgba(var(--primary-rgb), 0.12);
color: var(--primary); color: var(--primary);
@ -3271,19 +3262,19 @@ h3 {
flex-shrink: 0; flex-shrink: 0;
} }
.settings-card-title { .settings-card-title {
font-size: 0.92rem; font-size: 0.95rem;
font-weight: 700; font-weight: 700;
color: var(--text); color: var(--text);
margin: 0; margin: 0;
} }
.settings-card-desc { .settings-card-desc {
font-size: 0.8rem; font-size: 0.82rem;
color: var(--text-muted); color: var(--text-muted);
margin: 0.2rem 0 0; margin: 0.25rem 0 0;
line-height: 1.45; line-height: 1.45;
} }
.settings-card-body { .settings-card-body {
padding: 1.5rem; padding: 1.75rem;
} }
/* ── Field ── */ /* ── Field ── */
@ -3308,10 +3299,10 @@ h3 {
} }
.settings-input { .settings-input {
width: 100%; width: 100%;
padding: 10px 14px; padding: 11px 14px;
border-radius: 8px; border-radius: 8px;
border: 1px solid var(--border); border: 1px solid var(--border);
background: var(--surface); background: var(--bg);
color: var(--text); color: var(--text);
font-size: 0.92rem; font-size: 0.92rem;
outline: none; outline: none;
@ -3322,6 +3313,10 @@ h3 {
border-color: var(--primary); border-color: var(--primary);
box-shadow: 0 0 0 3px rgba(var(--primary-rgb), 0.15); 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; } .settings-select { cursor: pointer; appearance: auto; }
/* ── Password input with eye toggle ── */ /* ── Password input with eye toggle ── */
@ -3606,6 +3601,40 @@ h3 {
.settings-danger-box { } .settings-danger-box { }
/* ── Responsive ── */ /* ── Responsive ── */
@media (max-width: 960px) {
.profile-layout {
grid-template-columns: 220px 1fr;
gap: 1.5rem;
}
}
@media (max-width: 768px) { @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;
}
} }

View File

@ -1,7 +1,7 @@
import React, { createContext, useContext, useState, useEffect } from 'react'; 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 { BrowserRouter as Router, Routes, Route, Link, NavLink, useNavigate, Outlet, Navigate, useLocation } from 'react-router-dom';
import { useTranslation } from 'react-i18next'; 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 Home from './pages/Home';
import PluginDetail from './pages/PluginDetail'; import PluginDetail from './pages/PluginDetail';
import LoginPage from './pages/auth/LoginPage'; import LoginPage from './pages/auth/LoginPage';
@ -124,9 +124,9 @@ const App = () => (
<AuthProvider> <AuthProvider>
<ScrollToTop /> <ScrollToTop />
<Routes> <Routes>
{/* All routes share MainLayout (navbar + footer) */} {/* All marketplace routes share MainLayout (original navbar + footer) */}
<Route path="/" element={<MainLayout />}> <Route element={<MainLayout />}>
<Route index element={<Home />} /> <Route path="/" element={<Home />} />
<Route path="plugin/:id" element={<PluginDetail />} /> <Route path="plugin/:id" element={<PluginDetail />} />
<Route path="plugin/:id-:slug" element={<PluginDetail />} /> <Route path="plugin/:id-:slug" element={<PluginDetail />} />
<Route path="profile/:username" element={<AuthorProfilePage />} /> <Route path="profile/:username" element={<AuthorProfilePage />} />
@ -141,16 +141,18 @@ const App = () => (
<Route path="verify-email" element={<VerifyEmailPage />} /> <Route path="verify-email" element={<VerifyEmailPage />} />
<Route path="confirm-email" element={<ConfirmEmailChangePage />} /> <Route path="confirm-email" element={<ConfirmEmailChangePage />} />
<Route path="check-email" element={<CheckEmailPage />} /> <Route path="check-email" element={<CheckEmailPage />} />
<Route path="dashboard" element={<ProtectedRoute><DashboardLayout /></ProtectedRoute>}>
<Route index element={<Navigate to="/dashboard/plugins" replace />} />
<Route path="audience" element={<DashboardAudience />} />
<Route path="plugins" element={<DashboardPlugins />} />
<Route path="add-plugin" element={<AddPlugin />} />
<Route path="manage-plugin/:id" element={<ManagePlugin />} />
</Route>
<Route path="staff" element={<StaffRoute><AdminPanel /></StaffRoute>} /> <Route path="staff" element={<StaffRoute><AdminPanel /></StaffRoute>} />
<Route path="settings" element={<ProtectedRoute><ProfilePage /></ProtectedRoute>} /> <Route path="settings" element={<ProtectedRoute><ProfilePage /></ProtectedRoute>} />
</Route> </Route>
{/* Developer Studio layout (Developer Studio navbar replaces original navbar when in dev menu) */}
<Route path="/dashboard" element={<ProtectedRoute><DashboardLayout /></ProtectedRoute>}>
<Route index element={<Navigate to="/dashboard/plugins" replace />} />
<Route path="audience" element={<DashboardAudience />} />
<Route path="plugins" element={<DashboardPlugins />} />
<Route path="add-plugin" element={<AddPlugin />} />
<Route path="manage-plugin/:id" element={<ManagePlugin />} />
</Route>
</Routes> </Routes>
</AuthProvider> </AuthProvider>
</Router> </Router>
@ -169,17 +171,86 @@ const MainLayout = () => {
import './pages/dashboard/Dashboard.css'; import './pages/dashboard/Dashboard.css';
const DeveloperStudioNavbar = ({ user }: any) => {
const [isMenuOpen, setIsMenuOpen] = useState(false);
const toggleMenu = () => setIsMenuOpen(!isMenuOpen);
return (
<header className="dashboard-app-header">
<div className="dashboard-app-header-inner">
{/* Brand */}
<Link to="/dashboard/plugins" className="dashboard-app-brand" onClick={() => setIsMenuOpen(false)}>
<img src="/icon.png" alt="Market Logo" className="dashboard-app-logo" />
<span className="dashboard-app-title">DEVELOPER <span>STUDIO</span></span>
</Link>
{/* Mobile menu toggle button */}
<button className="dashboard-mobile-toggle" onClick={toggleMenu} aria-label="Toggle navigation menu">
<svg width="22" height="22" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
{isMenuOpen ? (
<path d="M18 6L6 18M6 6l12 12" />
) : (
<path d="M3 12h18M3 6h18M3 18h18" />
)}
</svg>
</button>
{/* Navigation & Actions */}
<div className={`dashboard-app-nav-wrap ${isMenuOpen ? 'open' : ''}`}>
<nav className="dashboard-app-nav">
<NavLink
to="/dashboard/plugins"
className={({ isActive }) => `dashboard-app-nav-link ${isActive ? 'active' : ''}`}
onClick={() => setIsMenuOpen(false)}
>
<Package size={16} />
<span>Plugins</span>
</NavLink>
<NavLink
to="/dashboard/audience"
className={({ isActive }) => `dashboard-app-nav-link ${isActive ? 'active' : ''}`}
onClick={() => setIsMenuOpen(false)}
>
<Globe size={16} />
<span>Audience</span>
</NavLink>
<NavLink
to="/dashboard/add-plugin"
className={({ isActive }) => `dashboard-app-nav-link ${isActive ? 'active' : ''}`}
onClick={() => setIsMenuOpen(false)}
>
<PlusCircle size={16} />
<span>Publish</span>
</NavLink>
</nav>
<div className="dashboard-app-actions">
<Link to="/" className="dashboard-action-link store-link" onClick={() => setIsMenuOpen(false)} title="Return to Marketplace">
<Store size={15} />
<span>Marketplace</span>
</Link>
{user && (user.role === 'admin' || user.role === 'moderator') && (
<NavLink to="/staff" className="dashboard-action-link" onClick={() => setIsMenuOpen(false)}>
<span>Staff</span>
</NavLink>
)}
{user && (
<NavLink to="/settings" className="dashboard-user-link" onClick={() => setIsMenuOpen(false)}>
<span>{user.username}</span>
</NavLink>
)}
</div>
</div>
</div>
</header>
);
};
const DashboardLayout = () => { const DashboardLayout = () => {
const { user } = useAuth();
return ( return (
<div className="dashboard-container"> <div className="dashboard-container">
<header className="dashboard-app-header"> <DeveloperStudioNavbar user={user} />
<div className="dashboard-app-header-inner">
<Link to="/dashboard/plugins" className="dashboard-app-brand">
<img src="/icon.png" alt="Market Logo" className="dashboard-app-logo" />
<span className="dashboard-app-title">DEVELOPER <span>STUDIO</span></span>
</Link>
</div>
</header>
<div className="dashboard-content"> <div className="dashboard-content">
<Outlet /> <Outlet />
</div> </div>

View File

@ -6,6 +6,7 @@ import ReactMarkdown from 'react-markdown';
import remarkGfm from 'remark-gfm'; import remarkGfm from 'remark-gfm';
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import SEO from '../components/SEO'; import SEO from '../components/SEO';
import { Sparkles, History } from 'lucide-react';
const getYoutubeVideoId = (url: string) => { const getYoutubeVideoId = (url: string) => {
if (!url) return null; if (!url) return null;
@ -679,6 +680,48 @@ const PluginDetail = () => {
</div> </div>
)} )}
{Array.isArray(plugin.versions) && plugin.versions.length > 0 && (
<div className="plugin-recent-update">
<div className="plugin-recent-update-header">
<div className="plugin-recent-update-title-group">
<h3 className="plugin-recent-update-title">
<Sparkles size={16} color="var(--primary)" />
What's New
</h3>
<span className="plugin-recent-update-badge">
v{plugin.versions[0].version}
</span>
{plugin.versions[0].created_at && (
<span className="plugin-recent-update-date">
{formatDate(plugin.versions[0].created_at)}
</span>
)}
</div>
{plugin.versions.length > 1 && (
<button
type="button"
className="plugin-recent-update-history-btn"
onClick={() => setChangelogOpen(true)}
>
<History size={13} />
<span>Version History ({plugin.versions.length})</span>
</button>
)}
</div>
<div className="plugin-recent-update-body markdown-content">
{plugin.versions[0].release_notes ? (
<ReactMarkdown remarkPlugins={[remarkGfm]}>
{plugin.versions[0].release_notes}
</ReactMarkdown>
) : (
<p className="plugin-recent-update-empty">
Bug fixes and performance improvements.
</p>
)}
</div>
</div>
)}
{/* DESCRIPTION */} {/* DESCRIPTION */}
<div className="markdown-content"> <div className="markdown-content">
<ReactMarkdown remarkPlugins={[remarkGfm]}>{currentDescription}</ReactMarkdown> <ReactMarkdown remarkPlugins={[remarkGfm]}>{currentDescription}</ReactMarkdown>

View File

@ -7,7 +7,7 @@ import { getCodeList } from 'country-list';
import DeveloperOnboardingModal from '../components/DeveloperOnboardingModal'; import DeveloperOnboardingModal from '../components/DeveloperOnboardingModal';
import { getPluginUrl } from '../utils/url'; import { getPluginUrl } from '../utils/url';
import { import {
User, Mail, Globe, Lock, Shield, CreditCard, User, Mail, Lock, Shield, CreditCard,
BookOpen, AlertTriangle, LogOut, CheckCircle, BookOpen, AlertTriangle, LogOut, CheckCircle,
AlertCircle, Eye, EyeOff, ChevronRight, Bell, AlertCircle, Eye, EyeOff, ChevronRight, Bell,
Smartphone, Key, Trash2, Code, Sparkles, Building2 Smartphone, Key, Trash2, Code, Sparkles, Building2
@ -189,7 +189,7 @@ const ProfilePage = () => {
if (formData.email && formData.email !== user?.email) { if (formData.email && formData.email !== user?.email) {
try { try {
const res = await api.post('/user/change-email', { newEmail: formData.email }); await api.post('/user/change-email', { newEmail: formData.email });
updatedAny = true; updatedAny = true;
} catch (err: any) { } catch (err: any) {
showToast(err.response?.data?.error || 'Failed to update email.', 'error'); showToast(err.response?.data?.error || 'Failed to update email.', 'error');

View File

@ -13,13 +13,35 @@
--dash-shadow: 0 1px 3px rgba(0,0,0,0.08); /* New: for subtle shadows */ --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 { .dashboard-app-header {
background: var(--dash-surface); background: var(--dash-surface);
border-bottom: 1px solid var(--dash-border); border-bottom: 1px solid var(--dash-border);
padding: 0.85rem 2rem; padding: 0.75rem 2rem;
margin-bottom: 2rem; margin-bottom: 2rem;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04); 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 { .dashboard-app-header-inner {
@ -28,6 +50,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
gap: 1.5rem;
} }
.dashboard-app-brand { .dashboard-app-brand {
@ -39,6 +62,7 @@
font-weight: 800; font-weight: 800;
font-size: 1.1rem; font-size: 1.1rem;
letter-spacing: -0.3px; letter-spacing: -0.3px;
flex-shrink: 0;
} }
.dashboard-app-logo { .dashboard-app-logo {
@ -51,6 +75,242 @@
color: var(--dash-accent, #ff7518); 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 */ /* Override App.css within the dashboard */
.dashboard-content, .dashboard-nav { .dashboard-content, .dashboard-nav {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji"; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji";

View File

@ -4,7 +4,8 @@
.ap-root { .ap-root {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
height: calc(100vh - 133px); /* developer studio navbar ~58px */
height: calc(100vh - 58px);
background: var(--mp-bg); background: var(--mp-bg);
color: var(--mp-text); color: var(--mp-text);
font-family: var(--font-display); font-family: var(--font-display);
@ -338,6 +339,7 @@
.ap-success p { color: var(--mp-text-2); font-size: 0.9rem; margin: 0; } .ap-success p { color: var(--mp-text-2); font-size: 0.9rem; margin: 0; }
/* ── Dashboard padding reset ────────────────────────────────── */ /* ── Dashboard padding reset ────────────────────────────────── */
.dashboard-content:has(.ap-root) { padding: 0 !important; margin: 0 !important; overflow: hidden; } .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) .dashboard-nav { margin-bottom: 0 !important; } .dashboard-container:has(.ap-root) { display: flex; flex-direction: column; height: 100vh; overflow: hidden; }
.dashboard-container:has(.ap-root) .dashboard-content { padding: 0 !important; flex: 1; 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; }

View File

@ -38,8 +38,8 @@
.mp-root { .mp-root {
display: flex; display: flex;
/* navbar ~83px + dashboard-nav ~50px */ /* developer studio navbar ~58px */
height: calc(100vh - 133px); height: calc(100vh - 58px);
background: var(--mp-bg); background: var(--mp-bg);
color: var(--mp-text); color: var(--mp-text);
font-family: var(--font-display); font-family: var(--font-display);
@ -52,7 +52,7 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
min-height: calc(100vh - 133px); min-height: calc(100vh - 58px);
gap: 1rem; gap: 1rem;
background: var(--mp-bg); background: var(--mp-bg);
color: var(--mp-text-2); color: var(--mp-text-2);
@ -626,22 +626,27 @@
padding: 0 !important; padding: 0 !important;
margin: 0 !important; margin: 0 !important;
overflow: hidden; overflow: hidden;
} max-width: 100% !important;
width: 100% !important;
/* Also kill the nav bottom margin and content padding from Dashboard.css */
.dashboard-container:has(.mp-root) .dashboard-nav {
margin-bottom: 0 !important;
} }
.dashboard-container:has(.mp-root) { .dashboard-container:has(.mp-root) {
display: flex; display: flex;
flex-direction: column; 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 { .dashboard-container:has(.mp-root) .dashboard-content {
padding: 0 !important; padding: 0 !important;
flex: 1; flex: 1;
overflow: hidden; overflow: hidden;
max-width: 100% !important;
width: 100% !important;
} }
/* ── Scrollbar ──────────────────────────────────────────────── */ /* ── Scrollbar ──────────────────────────────────────────────── */