commit 45ae1670c62eb9d1c55b36a4c44d9ad167a1115b Author: liuhuibin <1650243281@qq.com> Date: Fri Jun 26 16:34:27 2026 +0800 first commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6026b06 --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +pnpm-lock.yaml + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..c0a6e5a --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar", "Vue.vscode-typescript-vue-plugin"] +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..ff7ae1d --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +## 预览图 + +![1](https://github.com/tanhh326/dashboard-demo/assets/82007768/b98892f7-51fe-4699-8d5f-09a4e3727616) diff --git a/doc/images/1.png b/doc/images/1.png new file mode 100644 index 0000000..7389579 Binary files /dev/null and b/doc/images/1.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..dde16aa --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite + Vue + TS + + +
+ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2b2dabd --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2274 @@ +{ + "name": "dashboard-demo", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "dashboard-demo", + "version": "0.0.0", + "dependencies": { + "@types/node": "^20.4.4", + "echarts": "^5.4.3", + "echarts-liquidfill": "^3.1.0", + "ol": "^7.4.0", + "prettier": "^3.0.0", + "vue": "^3.2.47" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.1.0", + "@vitejs/plugin-vue-jsx": "^1.3.3", + "less": "^4.1.3", + "typescript": "^4.9.3", + "vite": "^4.2.0", + "vue-tsc": "^1.2.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.29.7.tgz", + "integrity": "sha512-ngr+82Sh0xMz25TPCZi+nC2iTzjfCdWS2ONXTp/PtSCHCgaCNBpdMqgvJ2ccdLlClVZ7sisIgB914j/JFe+RZA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.29.7.tgz", + "integrity": "sha512-jK52h8LaLc7JarhQV2ofeFMts4H7vnOXnqZNA6fYglBTZewRBE51KWt3BUltW1P+KoPsYkHoJeXePuz4zo2LMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-syntax-typescript": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@mapbox/jsonlint-lines-primitives": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz", + "integrity": "sha512-rY0o9A5ECsTQRVhv7tL/OyDpGAoUB4tTvLiW1DSzQGq4bvTPhNw1VpSNjDJc5GFZ2XuyOtSWSVN05qOtcD71qQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/@mapbox/mapbox-gl-style-spec": { + "version": "13.28.0", + "resolved": "https://registry.npmmirror.com/@mapbox/mapbox-gl-style-spec/-/mapbox-gl-style-spec-13.28.0.tgz", + "integrity": "sha512-B8xM7Fp1nh5kejfIl4SWeY0gtIeewbuRencqO3cJDrCHZpaPg7uY+V8abuR+esMeuOjRl5cLhVTP40v+1ywxbg==", + "license": "ISC", + "dependencies": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/point-geometry": "^0.1.0", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.6", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + }, + "bin": { + "gl-style-composite": "bin/gl-style-composite.js", + "gl-style-format": "bin/gl-style-format.js", + "gl-style-migrate": "bin/gl-style-migrate.js", + "gl-style-validate": "bin/gl-style-validate.js" + } + }, + "node_modules/@mapbox/point-geometry": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz", + "integrity": "sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==", + "license": "ISC" + }, + "node_modules/@mapbox/unitbezier": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz", + "integrity": "sha512-HPnRdYO0WjFjRTSwO3frz1wKaU649OBFPX3Zo/2WZvuRi6zMiRGui8SnPQiQABgqCf8YikDe5t3HViTVw1WUzA==", + "license": "BSD-2-Clause" + }, + "node_modules/@petamoriken/float16": { + "version": "3.9.3", + "resolved": "https://registry.npmmirror.com/@petamoriken/float16/-/float16-3.9.3.tgz", + "integrity": "sha512-8awtpHXCx/bNpFt4mt2xdkgtgVvKqty8VbjHI/WWWQuEw+KLzFot3f4+LkQY9YmOtq7A5GdOnqoIC8Pdygjk2g==", + "license": "MIT" + }, + "node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@types/node": { + "version": "20.19.43", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.19.43.tgz", + "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", + "integrity": "sha512-kqf7SGFoG+80aZG6Pf+gsZIVvGSCKE98JbiWqcCV9cThtg91Jav0yvYFC9Zb+jKetNGF6ZKeoaxgZfND21fWKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "1.3.10", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-1.3.10.tgz", + "integrity": "sha512-Cf5zznh4yNMiEMBfTOztaDVDmK1XXfgxClzOSUVUc8WAmHzogrCUeM8B05ABzuGtg0D1amfng+mUmSIOFGP3Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.17.9", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.16.8", + "@rollup/pluginutils": "^4.2.0", + "@vue/babel-plugin-jsx": "^1.1.1", + "hash-sum": "^2.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.11.1.tgz", + "integrity": "sha512-dOcNn3i9GgZAcJt43wuaEykSluAuOkQgzni1cuxLxTV0nJKanQztp7FxyswdRILaKH+P2XZMPRp2S4MV/pElCw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "1.11.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.11.1.tgz", + "integrity": "sha512-hJnOnwZ4+WT5iupLRnuzbULZ42L7BWWPMmruzwtLhJfpDVoZLjNBxHDi2sY2bgZXCKlpU5XcsMFoYrsQmPhfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.11.1", + "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.11.1.tgz", + "integrity": "sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "1.11.1", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.5.0.tgz", + "integrity": "sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.5.0.tgz", + "integrity": "sha512-mneBhw1oOqCd2247O0Yw/mRwC9jIGACAJUlawkmMBiNmL4dGA2eMzuNZVNqOUfYTa6vqmND4CtOPzmEEEqLKFw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/plugin-syntax-jsx": "^7.27.1", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.0", + "@babel/types": "^7.28.2", + "@vue/babel-helper-vue-transform-on": "1.5.0", + "@vue/babel-plugin-resolve-type": "1.5.0", + "@vue/shared": "^3.5.18" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.5.0.tgz", + "integrity": "sha512-Wm/60o+53JwJODm4Knz47dxJnLDJ9FnKnGZJbUUf8nQRAtt6P+undLUAVU3Ha33LxOJe6IPoifRQ6F/0RrU31w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-plugin-utils": "^7.27.1", + "@babel/parser": "^7.28.0", + "@vue/compiler-sfc": "^3.5.18" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.38.tgz", + "integrity": "sha512-s99aGxWYig9ErHbct27KXEGhrBYlRI6c4MwAgXErOAbX9xiW37/uMa+XUDO69zLz83dng8UUZ70CTOJrLrYrEQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/shared": "3.5.38", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.38.tgz", + "integrity": "sha512-JTqp25l8aFfJYF7/KmsXZjAxJz7T+SjmTJLoXVjHtc2BrSgSiW2n9Aem/cWq1OPe68A8JL06B3eVdhlP0H4TVw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.38.tgz", + "integrity": "sha512-DuA2GiZawSEW442iw/9+Fkol8hTgb4Ke5KkhmSry65QA7YuyMbIdy8p0XZRMvNwJdgRz307W8g1CSzdvS4nuNg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.7", + "@vue/compiler-core": "3.5.38", + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.15", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.38.tgz", + "integrity": "sha512-7s+W5Gc42FGxZMcuwl8H5B29T8BJPMdBT7KHFE+BbAuZ/iTEdTtv7z2XiMjiaUUw4w3ZcCEdHs36RuYJ2VA7bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/language-core": { + "version": "1.8.27", + "resolved": "https://registry.npmmirror.com/@vue/language-core/-/language-core-1.8.27.tgz", + "integrity": "sha512-L8Kc27VdQserNaCUNiSFdDl9LWT24ly8Hpwf1ECy3aFb9m6bDhBGQYOujDm21N7EW3moKIOKEanQwe1q5BK+mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "~1.11.1", + "@volar/source-map": "~1.11.1", + "@vue/compiler-dom": "^3.3.0", + "@vue/shared": "^3.3.0", + "computeds": "^0.0.1", + "minimatch": "^9.0.3", + "muggle-string": "^0.3.1", + "path-browserify": "^1.0.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.38.tgz", + "integrity": "sha512-pG6LV/NDNRbKizcUjFFLAfjaL8mcv4DmR9avNcUw2gDHBzZneuS2TWCmp633ynzxz9YYKNeEPK2I8Wraqy2HUQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.38.tgz", + "integrity": "sha512-iyW8WVfF1CpCXxncZY5Ei6rSd6oZr5DgEom//fUjRBRl56AXPD+s9ATvukRt77ZFTuYlnVA1bxY+dJB94tWVYw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.38", + "@vue/shared": "3.5.38" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.38.tgz", + "integrity": "sha512-apX2wt9sdfDshS+a2xueFZLVpt0GkRJZSoPmrW/SA4yzXTznhfcMVW59gr7h4YQeY0vJhdJkk2rsIDwgfFgC5A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.38", + "@vue/runtime-core": "3.5.38", + "@vue/shared": "3.5.38", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.38.tgz", + "integrity": "sha512-vue8vbf2QlV4quHqzwmJy6dWfmRhP1J8l4wtZg60CL6VoKqcPY2oe7may3+1d9qfpedjK5PRLFqd5k3Isj9mUw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.38", + "@vue/shared": "3.5.38" + }, + "peerDependencies": { + "vue": "3.5.38" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.38.tgz", + "integrity": "sha512-FTW0AFZNaK5/mOqvGBwVfUlNLU38TiQn4+DQgIFUnrBBJQ1crMJ82yeGQLV5jyKFsO8yRukpbuP7x+nRbH6aug==", + "license": "MIT" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.10.38", + "resolved": "https://registry.npmmirror.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.38.tgz", + "integrity": "sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/brace-expansion": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/browserslist": { + "version": "4.28.4", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.28.4.tgz", + "integrity": "sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.10.38", + "caniuse-lite": "^1.0.30001799", + "electron-to-chromium": "^1.5.376", + "node-releases": "^2.0.48", + "update-browserslist-db": "^1.2.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001799", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001799.tgz", + "integrity": "sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/computeds": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/computeds/-/computeds-0.0.1.tgz", + "integrity": "sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/csscolorparser": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/csscolorparser/-/csscolorparser-1.0.3.tgz", + "integrity": "sha512-umPSgYwZkdFoUrH5hIq5kf0wPSXiro51nPw0j2K/c83KflkPSTBGMz6NJvMB+07VlL0y7VPo6QJcDjcgKTTm3w==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/earcut": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/earcut/-/earcut-2.2.4.tgz", + "integrity": "sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==", + "license": "ISC" + }, + "node_modules/echarts": { + "version": "5.6.0", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz", + "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.6.1" + } + }, + "node_modules/echarts-liquidfill": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/echarts-liquidfill/-/echarts-liquidfill-3.1.0.tgz", + "integrity": "sha512-5Dlqs/jTsdTUAsd+K5LPLLTgrbbNORUSBQyk8PSy1Mg2zgHDWm83FmvA4s0ooNepCJojFYRITTQ4GU1UUSKYLw==", + "license": "MIT", + "peerDependencies": { + "echarts": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.377", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.5.377.tgz", + "integrity": "sha512-cH1jZgJHoezfTnKfKwnScpHywTFVnJUNITDPREFdhNjiuD502+QFpG0Qk7G8jhsV/f+CEAFlIrzP1fT+IMb92g==", + "dev": true, + "license": "ISC" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/geotiff": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/geotiff/-/geotiff-2.1.3.tgz", + "integrity": "sha512-PT6uoF5a1+kbC3tHmZSUsLHBp2QJlHasxxxxPW47QIY1VBKpFB+FcDvX+MxER6UzgLQZ0xDzJ9s48B9JbOCTqA==", + "license": "MIT", + "dependencies": { + "@petamoriken/float16": "^3.4.7", + "lerc": "^3.0.0", + "pako": "^2.0.4", + "parse-headers": "^2.0.2", + "quick-lru": "^6.1.1", + "web-worker": "^1.2.0", + "xml-utils": "^1.0.2", + "zstddec": "^0.1.0" + }, + "engines": { + "node": ">=10.19" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC", + "optional": true + }, + "node_modules/hash-sum": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hash-sum/-/hash-sum-2.0.0.tgz", + "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg==", + "dev": true, + "license": "MIT" + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/lerc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/lerc/-/lerc-3.0.0.tgz", + "integrity": "sha512-Rm4J/WaHhRa93nCN2mwWDZFoRVF18G1f47C+kvQWyHGEZxFpTUi73p7lMVSAndyxGt6lJ2/CFbOcf9ra5p8aww==", + "license": "Apache-2.0" + }, + "node_modules/less": { + "version": "4.6.7", + "resolved": "https://registry.npmmirror.com/less/-/less-4.6.7.tgz", + "integrity": "sha512-o3UxHBPPVY1HtCXx15/z1NlknQiWyafRNbtLEv+6xFaDRI2g2xPKIH43do9dSwt8bGLTsjNSaifa48N3d6odsQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "copy-anything": "^3.0.5", + "parse-node-version": "^1.0.1" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^5.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/make-dir": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-5.1.0.tgz", + "integrity": "sha512-IfpFq6UM39dUNiphpA6uDezNx/AvWyhwfICWPR3t1VspkgkMZrL+Rk1RbN1bx+aeNYwOrqGJgEgV3yotk+ZUVw==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mapbox-to-css-font": { + "version": "2.4.5", + "resolved": "https://registry.npmmirror.com/mapbox-to-css-font/-/mapbox-to-css-font-2.4.5.tgz", + "integrity": "sha512-VJ6nB8emkO9VODI0Fk+TQ/0zKBTqmf/Pkt8Xv0kHstoc0iXRajA00DAid4Kc3K5xeFIOoiZrVxijEzj0GLVO2w==", + "license": "BSD-2-Clause" + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.15", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.15.tgz", + "integrity": "sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.5.0.tgz", + "integrity": "sha512-jaQyPKKk2YokHrEg+vFDYxXIHTCBgiZwSHOoVx/8V3GIBS8/VN6NdVRmg8q1ERtPkMvmOvebsgga4sAj5hls/w==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/node-releases": { + "version": "2.0.48", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.48.tgz", + "integrity": "sha512-1uz8041X6LoI6ZSdZacM9lVY28vuzDlSKitnpbSNK0RfKoIJkX29NBPVEFXhnuSuEOA9Ww0xnPJ+ILWbGAv8DA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/ol": { + "version": "7.5.2", + "resolved": "https://registry.npmmirror.com/ol/-/ol-7.5.2.tgz", + "integrity": "sha512-HJbb3CxXrksM6ct367LsP3N+uh+iBBMdP3DeGGipdV9YAYTP0vTJzqGnoqQ6C2IW4qf8krw9yuyQbc9fjOIaOQ==", + "license": "BSD-2-Clause", + "dependencies": { + "earcut": "^2.2.3", + "geotiff": "^2.0.7", + "ol-mapbox-style": "^10.1.0", + "pbf": "3.2.1", + "rbush": "^3.0.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/openlayers" + } + }, + "node_modules/ol-mapbox-style": { + "version": "10.7.0", + "resolved": "https://registry.npmmirror.com/ol-mapbox-style/-/ol-mapbox-style-10.7.0.tgz", + "integrity": "sha512-S/UdYBuOjrotcR95Iq9AejGYbifKeZE85D9VtH11ryJLQPTZXZSW1J5bIXcr4AlAH6tyjPPHTK34AdkwB32Myw==", + "license": "BSD-2-Clause", + "dependencies": { + "@mapbox/mapbox-gl-style-spec": "^13.23.1", + "mapbox-to-css-font": "^2.4.1", + "ol": "^7.3.0" + } + }, + "node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "(MIT AND Zlib)" + }, + "node_modules/parse-headers": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/parse-headers/-/parse-headers-2.0.6.tgz", + "integrity": "sha512-Tz11t3uKztEW5FEVZnj1ox8GKblWn+PvHY9TmJV5Mll2uHEwRdR/5Li1OlXoECjLYkApdhWy44ocONwXLiKO5A==", + "license": "MIT" + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pbf": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/pbf/-/pbf-3.2.1.tgz", + "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", + "license": "BSD-3-Clause", + "dependencies": { + "ieee754": "^1.1.12", + "resolve-protobuf-schema": "^2.1.0" + }, + "bin": { + "pbf": "bin/pbf" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.15", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.15.tgz", + "integrity": "sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.12", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prettier": { + "version": "3.8.4", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.8.4.tgz", + "integrity": "sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/protocol-buffers-schema": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/protocol-buffers-schema/-/protocol-buffers-schema-3.6.1.tgz", + "integrity": "sha512-VG2K63Igkiv9p76tk1lilczEK1cT+kCjKtkdhw1dQZV3k3IXJbd3o6Ho8b9zJZaHSnT2hKe4I+ObmX9w6m5SmQ==", + "license": "MIT" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/quick-lru": { + "version": "6.1.2", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-6.1.2.tgz", + "integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/quickselect": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/quickselect/-/quickselect-2.0.0.tgz", + "integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw==", + "license": "ISC" + }, + "node_modules/rbush": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/rbush/-/rbush-3.0.1.tgz", + "integrity": "sha512-XRaVO0YecOpEuIvbhbpTrZgoiI6xBlz6hnlr6EHhd+0x9ase6EmeN+hdwwUaJvLcsFFQ8iWVF1GAK1yB0BWi0w==", + "license": "MIT", + "dependencies": { + "quickselect": "^2.0.0" + } + }, + "node_modules/resolve-protobuf-schema": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", + "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", + "license": "MIT", + "dependencies": { + "protocol-buffers-schema": "^3.3.1" + } + }, + "node_modules/rollup": { + "version": "3.30.0", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.30.0.tgz", + "integrity": "sha512-kQvGasUgN+AlWGliFn2POSajRQEsULVYFGTvOZmK06d7vCD+YhZztt70kGk3qaeAXeWYL5eO7zx+rAubBc55eA==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/sax": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.6.0.tgz", + "integrity": "sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==", + "dev": true, + "license": "BlueOak-1.0.0", + "optional": true, + "engines": { + "node": ">=11.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "dependencies": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", + "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/vite": { + "version": "4.5.14", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.5.14.tgz", + "integrity": "sha512-+v57oAaoYNnO3hIu5Z/tJRZjq5aHM2zDve9YZ8HngVHbhk66RStobhb1sqPMIPEleV6cNKYK4eGrAbE9Ulbl2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.38", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.38.tgz", + "integrity": "sha512-vAMKHfImQlYSy0C+PBue4s3ERZ2xGKfgZg5GXAsLInq1dyh2H78ILVP5sK0KPFPVW4kv+OGCIvBEondcjpZp7A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.38", + "@vue/compiler-sfc": "3.5.38", + "@vue/runtime-dom": "3.5.38", + "@vue/server-renderer": "3.5.38", + "@vue/shared": "3.5.38" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.16", + "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz", + "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.27", + "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.8.27.tgz", + "integrity": "sha512-WesKCAZCRAbmmhuGl3+VrdWItEvfoFIPXOvUJkjULi+x+6G/Dy69yO3TBRJDr9eUlmsNAwVmxsNZxvHKzbkKdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "~1.11.1", + "@vue/language-core": "1.8.27", + "semver": "^7.5.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/vue-tsc/node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/web-worker": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/web-worker/-/web-worker-1.5.0.tgz", + "integrity": "sha512-RiMReJrTAiA+mBjGONMnjVDP2u3p9R1vkcGz6gDIrOMT3oGuYwX2WRMYI9ipkphSuE5XKEhydbhNEJh4NY9mlw==", + "license": "Apache-2.0" + }, + "node_modules/xml-utils": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/xml-utils/-/xml-utils-1.10.2.tgz", + "integrity": "sha512-RqM+2o1RYs6T8+3DzDSoTRAUfrvaejbVHcp3+thnAtDKo8LskR+HomLajEy5UjTz24rpka7AxVBRR3g2wTUkJA==", + "license": "CC0-1.0" + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/zrender": { + "version": "5.6.1", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz", + "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zstddec": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/zstddec/-/zstddec-0.1.0.tgz", + "integrity": "sha512-w2NTI8+3l3eeltKAdK8QpiLo/flRAr2p8AGeakfMZOXBxOg9HIu4LVDxBi81sYgVhFhdJjv1OrB5ssI8uFPoLg==", + "license": "MIT AND BSD-3-Clause" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..e76a40b --- /dev/null +++ b/package.json @@ -0,0 +1,28 @@ +{ + "name": "dashboard-demo", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc && vite build", + "preview": "vite preview", + "format": "prettier --write ." + }, + "dependencies": { + "@types/node": "^20.4.4", + "echarts": "^5.4.3", + "echarts-liquidfill": "^3.1.0", + "ol": "^7.4.0", + "prettier": "^3.0.0", + "vue": "^3.2.47" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.1.0", + "less": "^4.1.3", + "typescript": "^4.9.3", + "vite": "^4.2.0", + "vue-tsc": "^1.2.0", + "@vitejs/plugin-vue-jsx": "^1.3.3" + } +} diff --git a/prettierrc.json b/prettierrc.json new file mode 100644 index 0000000..cc014f8 --- /dev/null +++ b/prettierrc.json @@ -0,0 +1,10 @@ +{ + "semi": true, + "singleQuote": true, + "quoteProps": "as-needed", + "bracketSpacing": true, + "arrowParens": "always", + "trailingComma": "all", + "tabWidth": 2, + "jsxBracketSameLine": true +} diff --git a/public/vite.svg b/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..2d709f2 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/assets/map-material.jpg b/src/assets/map-material.jpg new file mode 100644 index 0000000..8766805 Binary files /dev/null and b/src/assets/map-material.jpg differ diff --git a/src/components/chart/index.vue b/src/components/chart/index.vue new file mode 100644 index 0000000..c0c44cc --- /dev/null +++ b/src/components/chart/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/config/echarts.config.ts b/src/config/echarts.config.ts new file mode 100644 index 0000000..e29d65a --- /dev/null +++ b/src/config/echarts.config.ts @@ -0,0 +1,104 @@ +const color = [ + { + type: "linear", + x: 0, + y: 0, + x2: 1, + y2: 1, + colorStops: [ + { offset: 0, color: "#94c7fd" }, + { offset: 0.5, color: "#3b99fb" }, + { offset: 1, color: "#004ca0" }, + ], + }, + { + type: "linear", + x: 0, + y: 0, + x2: 1, + y2: 1, + colorStops: [ + { offset: 0, color: "#b070c0" }, + { offset: 0.5, color: "#b070c0" }, + { offset: 1, color: "#5d235d" }, + ], + }, + { + type: "linear", + x: 0, + y: 0, + x2: 1, + y2: 1, + colorStops: [ + { offset: 0, color: "#7eedd6" }, + { offset: 0.5, color: "#3be8bb" }, + { offset: 1, color: "#00b38a" }, + ], + }, + { + type: "linear", + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { offset: 0, color: "#fff1f0" }, + { offset: 0.5, color: "#ff9494" }, + { offset: 1, color: "#ff4d4f" }, + ], + }, + { + type: "linear", + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { offset: 0, color: "#fffbe6" }, + { offset: 0.5, color: "#ffe58f" }, + { offset: 1, color: "#ffbb96" }, + ], + }, + { + type: "linear", + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { offset: 0, color: "#ff3333" }, + { offset: 0.5, color: "#ff0000" }, + { offset: 1, color: "#cc0000" }, + ], + }, + { + type: "linear", + x: 0, + y: 0, + x2: 0, + y2: 1, + colorStops: [ + { offset: 0, color: "#ffe6f0" }, + { offset: 0.5, color: "#ffb3d9" }, + { offset: 1, color: "#ff85c0" }, + ], + }, +]; + +export default { + color, + textStyle: { + fontSize: 12, + color: "#fff", + }, + legend: { + textStyle: { + color: "#fff", + }, + }, + tooltip: { + textStyle: { + align: "left", + }, + }, +}; diff --git a/src/hooks/useLayerStack.ts b/src/hooks/useLayerStack.ts new file mode 100644 index 0000000..f9cd816 --- /dev/null +++ b/src/hooks/useLayerStack.ts @@ -0,0 +1,36 @@ +import { Map } from "ol"; +import VectorSource from "ol/source/Vector"; +import { GeoJSON } from "ol/format"; +import VectorLayer from "ol/layer/Vector"; +import { Fill, Stroke, Style } from "ol/style"; +import { FeatureLike } from "ol/Feature"; +import { MultiPolygon } from "ol/geom"; + +export default function (mapInstance: Map) { + const vectorSource = new VectorSource({ + url: "https://geo.datav.aliyun.com/areas_v3/bound/330000.json", + format: new GeoJSON(), + }); + + for (let i = 1; i <= 3; i++) { + const layer = new VectorLayer({ + zIndex: -1, + source: vectorSource, + style: (feature: FeatureLike) => { + const geometry = (feature.getGeometry() as MultiPolygon).clone(); + geometry.translate(0, -0.04 * i); + return new Style({ + fill: new Fill({ + color: "rgba(176, 166, 132,0.6)", + }), + stroke: new Stroke({ + color: "rgba(176, 166, 132,0.6)", + width: 1, + }), + geometry, + }); + }, + }); + mapInstance.addLayer(layer); + } +} diff --git a/src/hooks/useMap.ts b/src/hooks/useMap.ts new file mode 100644 index 0000000..5ab40dc --- /dev/null +++ b/src/hooks/useMap.ts @@ -0,0 +1,111 @@ +import { Map, View } from "ol"; +import { onMounted } from "vue"; +import { GeoJSON } from "ol/format"; +import VectorSource from "ol/source/Vector"; +import VectorLayer from "ol/layer/Vector"; +import { Fill, Stroke, Style, Text } from "ol/style"; +import { getBottomLeft, getCenter, getHeight, getWidth } from "ol/extent"; +import materialJpg from "@/assets/map-material.jpg"; +import { toContext } from "ol/render"; +import { MultiPolygon } from "ol/geom"; +import { defaults } from "ol/interaction"; + +export default function useMap(target: string) { + const mapInstance = new Map({ + view: new View({ + projection: "EPSG:4326", + zoom: 12, + center: [0, 0], + }), + controls: [], + interactions: defaults({ + dragPan: false, + mouseWheelZoom: false, + }), + }); + + const vectorSource = new VectorSource({ + url: "https://geo.datav.aliyun.com/areas_v3/bound/330000_full.json", + format: new GeoJSON(), + }); + + const customStyle = new Style({ + renderer: function (pixelCoordinates, state) { + const context = state.context; + const multiPolygon = state.geometry.clone() as MultiPolygon; + // @ts-ignore + multiPolygon.setCoordinates(pixelCoordinates); + const extent = multiPolygon.getExtent(); + const width = getWidth(extent); + const height = getHeight(extent); + const flag = state.feature.get("material"); + if (!flag || height < 1 || width < 1) { + return; + } + context.save(); + const renderContext = toContext(context, { + pixelRatio: 1, + }); + renderContext.setFillStrokeStyle( + new Fill(), + new Stroke({ + color: "rgba(255,255,255,0.8)", + width: 3, + }), + ); + renderContext.drawMultiPolygon(multiPolygon); + context.clip(); + const bottomLeft = getBottomLeft(extent); + const left = bottomLeft[0]; + const bottom = bottomLeft[1]; + context.drawImage(flag, left, bottom, width, height); + context.restore(); + }, + }); + + const layer = new VectorLayer({ + source: vectorSource, + style: (feature) => { + return [ + customStyle, + new Style({ + text: new Text({ + text: feature.get("name"), + fill: new Fill({ + color: "#fff", + }), + scale: 1.5, + }), + zIndex: 1, + }), + ]; + }, + }); + + vectorSource.on("addfeature", function (event) { + const feature = event.feature; + const img = new Image(); + img.src = materialJpg; + img.onload = function () { + feature?.set("material", img); + }; + }); + + vectorSource.on("featuresloadend", (event) => { + const view = mapInstance.getView(); + const extent = event.target.getExtent(); + view.fit(extent, { padding: [0, 30, 0, 0] }); + + view.setCenter(getCenter(extent)); + }); + + mapInstance.addLayer(layer); + + onMounted(() => { + mapInstance.setTarget(target); + }); + + return { + mapInstance, + }; +} diff --git a/src/main.ts b/src/main.ts new file mode 100644 index 0000000..6e24e59 --- /dev/null +++ b/src/main.ts @@ -0,0 +1,14 @@ +import { createApp } from "vue"; +import "./style.less"; +import App from "./App.vue"; +import Chart from "./components/chart/index.vue"; +import * as echarts from "echarts"; +import echartsConfig from "./config/echarts.config"; + +echarts.registerTheme("t-theme", echartsConfig); + +const app = createApp(App); + +app.component("TChart", Chart); + +app.mount("#app"); diff --git a/src/style.less b/src/style.less new file mode 100644 index 0000000..85ea68a --- /dev/null +++ b/src/style.less @@ -0,0 +1,45 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-text-size-adjust: 100%; +} + +#app { + width: 100vw; + height: 100vh; + overflow: hidden; +} + +body { + margin: 0; + overflow: hidden; +} + +.dashboard { + width: 100%; + height: 100%; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + + a:hover { + color: #747bff; + } + + button { + background-color: #f9f9f9; + } +} diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..a10921f --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1,19 @@ +function generateNumbers(min: number, max: number, count: number): number[]; +function generateNumbers(min: number, max: number): number; +function generateNumbers( + min: number, + max: number, + count?: number, +): number | number[] { + if (!count) { + return Math.floor(Math.random() * (max - min + 1)) + min; + } + const numbers = []; + for (let i = 0; i < count; i++) { + const randomNum = Math.floor(Math.random() * (max - min + 1)) + min; + numbers.push(randomNum); + } + return numbers; +} + +export { generateNumbers }; diff --git a/src/views/dashboard1/assets/01.png b/src/views/dashboard1/assets/01.png new file mode 100644 index 0000000..e657b81 Binary files /dev/null and b/src/views/dashboard1/assets/01.png differ diff --git a/src/views/dashboard1/assets/01.webp b/src/views/dashboard1/assets/01.webp new file mode 100644 index 0000000..d4b081c Binary files /dev/null and b/src/views/dashboard1/assets/01.webp differ diff --git a/src/views/dashboard1/assets/上升粒子1.png b/src/views/dashboard1/assets/上升粒子1.png new file mode 100644 index 0000000..1b384a4 Binary files /dev/null and b/src/views/dashboard1/assets/上升粒子1.png differ diff --git a/src/views/dashboard1/assets/上升粒子1.webp b/src/views/dashboard1/assets/上升粒子1.webp new file mode 100644 index 0000000..09495e2 Binary files /dev/null and b/src/views/dashboard1/assets/上升粒子1.webp differ diff --git a/src/views/dashboard1/assets/上升粒子2.png b/src/views/dashboard1/assets/上升粒子2.png new file mode 100644 index 0000000..f36fa14 Binary files /dev/null and b/src/views/dashboard1/assets/上升粒子2.png differ diff --git a/src/views/dashboard1/assets/上升粒子2.webp b/src/views/dashboard1/assets/上升粒子2.webp new file mode 100644 index 0000000..9190c5c Binary files /dev/null and b/src/views/dashboard1/assets/上升粒子2.webp differ diff --git a/src/views/dashboard1/assets/卡片背景.png b/src/views/dashboard1/assets/卡片背景.png new file mode 100644 index 0000000..f8a2d46 Binary files /dev/null and b/src/views/dashboard1/assets/卡片背景.png differ diff --git a/src/views/dashboard1/assets/头部动画.png b/src/views/dashboard1/assets/头部动画.png new file mode 100644 index 0000000..1f6f3d5 Binary files /dev/null and b/src/views/dashboard1/assets/头部动画.png differ diff --git a/src/views/dashboard1/assets/头部动画.webp b/src/views/dashboard1/assets/头部动画.webp new file mode 100644 index 0000000..fe822ce Binary files /dev/null and b/src/views/dashboard1/assets/头部动画.webp differ diff --git a/src/views/dashboard1/assets/头部动画_右侧点.png b/src/views/dashboard1/assets/头部动画_右侧点.png new file mode 100644 index 0000000..2aeb3aa Binary files /dev/null and b/src/views/dashboard1/assets/头部动画_右侧点.png differ diff --git a/src/views/dashboard1/assets/头部动画_右侧点.webp b/src/views/dashboard1/assets/头部动画_右侧点.webp new file mode 100644 index 0000000..869b5ec Binary files /dev/null and b/src/views/dashboard1/assets/头部动画_右侧点.webp differ diff --git a/src/views/dashboard1/assets/头部动画_左侧点.png b/src/views/dashboard1/assets/头部动画_左侧点.png new file mode 100644 index 0000000..2b4674d Binary files /dev/null and b/src/views/dashboard1/assets/头部动画_左侧点.png differ diff --git a/src/views/dashboard1/assets/头部动画_左侧点.webp b/src/views/dashboard1/assets/头部动画_左侧点.webp new file mode 100644 index 0000000..6f3d75d Binary files /dev/null and b/src/views/dashboard1/assets/头部动画_左侧点.webp differ diff --git a/src/views/dashboard1/assets/头部吊坠.png b/src/views/dashboard1/assets/头部吊坠.png new file mode 100644 index 0000000..09bdaed Binary files /dev/null and b/src/views/dashboard1/assets/头部吊坠.png differ diff --git a/src/views/dashboard1/assets/底座_圆形_静态图片.png b/src/views/dashboard1/assets/底座_圆形_静态图片.png new file mode 100644 index 0000000..1bcb000 Binary files /dev/null and b/src/views/dashboard1/assets/底座_圆形_静态图片.png differ diff --git a/src/views/dashboard1/assets/底座_静态图片.png b/src/views/dashboard1/assets/底座_静态图片.png new file mode 100644 index 0000000..91580cf Binary files /dev/null and b/src/views/dashboard1/assets/底座_静态图片.png differ diff --git a/src/views/dashboard1/assets/底部动画.png b/src/views/dashboard1/assets/底部动画.png new file mode 100644 index 0000000..6f9abef Binary files /dev/null and b/src/views/dashboard1/assets/底部动画.png differ diff --git a/src/views/dashboard1/assets/底部动画.webp b/src/views/dashboard1/assets/底部动画.webp new file mode 100644 index 0000000..1db5d45 Binary files /dev/null and b/src/views/dashboard1/assets/底部动画.webp differ diff --git a/src/views/dashboard1/assets/循环背景动画.mp4 b/src/views/dashboard1/assets/循环背景动画.mp4 new file mode 100644 index 0000000..fbd358d Binary files /dev/null and b/src/views/dashboard1/assets/循环背景动画.mp4 differ diff --git a/src/views/dashboard1/assets/按钮未选中.png b/src/views/dashboard1/assets/按钮未选中.png new file mode 100644 index 0000000..c1eef70 Binary files /dev/null and b/src/views/dashboard1/assets/按钮未选中.png differ diff --git a/src/views/dashboard1/assets/按钮未选中1.png b/src/views/dashboard1/assets/按钮未选中1.png new file mode 100644 index 0000000..5f06de9 Binary files /dev/null and b/src/views/dashboard1/assets/按钮未选中1.png differ diff --git a/src/views/dashboard1/assets/按钮选中.png b/src/views/dashboard1/assets/按钮选中.png new file mode 100644 index 0000000..2c71aef Binary files /dev/null and b/src/views/dashboard1/assets/按钮选中.png differ diff --git a/src/views/dashboard1/assets/按钮选中1.png b/src/views/dashboard1/assets/按钮选中1.png new file mode 100644 index 0000000..e46e806 Binary files /dev/null and b/src/views/dashboard1/assets/按钮选中1.png differ diff --git a/src/views/dashboard1/assets/按钮选中2.png b/src/views/dashboard1/assets/按钮选中2.png new file mode 100644 index 0000000..7b8d851 Binary files /dev/null and b/src/views/dashboard1/assets/按钮选中2.png differ diff --git a/src/views/dashboard1/assets/按钮选中3.png b/src/views/dashboard1/assets/按钮选中3.png new file mode 100644 index 0000000..df38429 Binary files /dev/null and b/src/views/dashboard1/assets/按钮选中3.png differ diff --git a/src/views/dashboard1/assets/整体边框_静态图片.png b/src/views/dashboard1/assets/整体边框_静态图片.png new file mode 100644 index 0000000..7772bbb Binary files /dev/null and b/src/views/dashboard1/assets/整体边框_静态图片.png differ diff --git a/src/views/dashboard1/assets/标题1_静态背景.png b/src/views/dashboard1/assets/标题1_静态背景.png new file mode 100644 index 0000000..0804c71 Binary files /dev/null and b/src/views/dashboard1/assets/标题1_静态背景.png differ diff --git a/src/views/dashboard1/components/btn/index.module.less b/src/views/dashboard1/components/btn/index.module.less new file mode 100644 index 0000000..a9555df --- /dev/null +++ b/src/views/dashboard1/components/btn/index.module.less @@ -0,0 +1,61 @@ +.btn { + width: 130px; + height: 35px; + + &:hover { + cursor: pointer; + } + + &.normal { + background-image: url("../../assets/按钮未选中.png"), url("../../assets/按钮未选中1.png"); + background-repeat: no-repeat, no-repeat; + background-position: 4px 0, 0 4px; + text-align: center; + line-height: 35px; + + .text { + background-image: -webkit-linear-gradient(top, #fff, #fff, #69a2d8, #69a2d8, #69a2d8); + } + + &.right { + .text { + transform: rotateY(-180deg); + } + + transform: rotateY(180deg); + } + } + + &.active { + background-image: url("../../assets/按钮选中.png"), + url("../../assets/按钮选中2.png"), + url("../../assets/按钮选中3.png"), + url("../../assets/按钮选中1.png"); + background-repeat: no-repeat, no-repeat, no-repeat, no-repeat; + background-size: 100%, 100%, 100% 100%, 100% 100%; + background-position: 0 2.5px, -2px 0, center, top; + text-align: center; + line-height: 35px; + + .text { + background-image: -webkit-linear-gradient(top, rgb(157, 195, 234), #fff, rgb(96, 162, 225)); + } + + &.left { + .text { + transform: rotateY(-180deg); + } + + transform: rotateY(180deg); + } + } + + .text { + font-weight: 600; + text-align: center; + user-select: none; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + } +} + diff --git a/src/views/dashboard1/components/btn/index.tsx b/src/views/dashboard1/components/btn/index.tsx new file mode 100644 index 0000000..547716d --- /dev/null +++ b/src/views/dashboard1/components/btn/index.tsx @@ -0,0 +1,29 @@ +import { defineComponent } from "vue"; +import style from "./index.module.less"; + +export default defineComponent({ + name: "switchPageBtn", + props: { + direction: { + type: String as () => "left" | "right", + required: true, + }, + text: { + required: true, + }, + active: Boolean, + }, + setup(props) { + return () => ( +
+
{props.text}
+
+ ); + }, +}); diff --git a/src/views/dashboard1/hooks/useLeftChart1.ts b/src/views/dashboard1/hooks/useLeftChart1.ts new file mode 100644 index 0000000..7b16dfe --- /dev/null +++ b/src/views/dashboard1/hooks/useLeftChart1.ts @@ -0,0 +1,51 @@ +import { onBeforeUnmount, ref } from "vue"; +import { EChartsOption } from "echarts"; +import { generateNumbers } from "@/utils"; + +export default function () { + const option = ref({}); + + function refresh() { + option.value = { + xAxis: { + type: "category", + data: ["周一", "周二", "周三", "周四", "周五", "周六", "周日"], + }, + yAxis: { + type: "value", + }, + grid: { + left: "12%", + }, + series: [ + { + data: generateNumbers(1, 300, 7), + type: "line", + }, + { + data: generateNumbers(1, 300, 7), + type: "line", + }, + { + data: generateNumbers(1, 300, 7), + type: "line", + }, + ], + }; + } + + refresh(); + + const timer = setInterval(() => { + refresh(); + }, 3000); + + onBeforeUnmount(() => { + clearInterval(timer); + }); + + return { + option, + refresh, + }; +} diff --git a/src/views/dashboard1/hooks/useLeftChart2.ts b/src/views/dashboard1/hooks/useLeftChart2.ts new file mode 100644 index 0000000..64ea09e --- /dev/null +++ b/src/views/dashboard1/hooks/useLeftChart2.ts @@ -0,0 +1,66 @@ +import { onBeforeUnmount, ref } from "vue"; +import { EChartsOption } from "echarts"; +import { generateNumbers } from "@/utils"; + +export default function () { + const option = ref({}); + + function refresh() { + option.value = { + tooltip: { + trigger: "item", + }, + legend: { + top: "5%", + left: "center", + }, + series: [ + { + name: "Access From", + type: "pie", + radius: ["40%", "70%"], + avoidLabelOverlap: false, + itemStyle: { + borderColor: "#fff", + }, + label: { + show: false, + position: "center", + }, + emphasis: { + label: { + show: true, + fontSize: 30, + fontWeight: "bold", + }, + }, + labelLine: { + show: false, + }, + data: [ + { value: generateNumbers(10, 100), name: "产品一" }, + { value: generateNumbers(10, 100), name: "产品二" }, + { value: generateNumbers(10, 100), name: "产品三" }, + { value: generateNumbers(10, 100), name: "产品四" }, + { value: generateNumbers(10, 100), name: "产品五" }, + ], + }, + ], + }; + } + + refresh(); + + const timer = setInterval(() => { + refresh(); + }, 3000); + + onBeforeUnmount(() => { + clearInterval(timer); + }); + + return { + option, + refresh, + }; +} diff --git a/src/views/dashboard1/hooks/useLeftChart3.ts b/src/views/dashboard1/hooks/useLeftChart3.ts new file mode 100644 index 0000000..f40010d --- /dev/null +++ b/src/views/dashboard1/hooks/useLeftChart3.ts @@ -0,0 +1,74 @@ +import { onBeforeUnmount, ref } from "vue"; +import { EChartsOption } from "echarts"; +import { generateNumbers } from "@/utils"; + +export default function () { + const option = ref({}); + + function refresh() { + option.value = { + tooltip: { + trigger: "item", + formatter: "{a}
{b} : {c}%", + }, + series: [ + { + name: "Funnel", + type: "funnel", + left: "center", + width: "100%", + min: 0, + max: 1000, + minSize: "0%", + maxSize: "100%", + sort: "descending", + gap: 2, + label: { + show: true, + position: "inside", + }, + labelLine: { + length: 10, + lineStyle: { + width: 1, + type: "solid", + }, + }, + itemStyle: { + borderColor: "#fff", + borderWidth: 1, + }, + emphasis: { + label: { + fontSize: 20, + }, + }, + data: [ + { value: generateNumbers(500, 1000), name: "访问量" }, + { value: generateNumbers(500, 1000), name: "注册量" }, + { value: generateNumbers(500, 1000), name: "浏览量" }, + { value: generateNumbers(200, 500), name: "加入购物车" }, + { value: generateNumbers(100, 800), name: "购买" }, + { value: generateNumbers(1, 20), name: "退货" }, + { value: generateNumbers(1, 20), name: "取消订单" }, + ], + }, + ], + }; + } + + refresh(); + + const timer = setInterval(() => { + refresh(); + }, 3000); + + onBeforeUnmount(() => { + clearInterval(timer); + }); + + return { + option, + refresh, + }; +} diff --git a/src/views/dashboard1/hooks/useRightChart1.ts b/src/views/dashboard1/hooks/useRightChart1.ts new file mode 100644 index 0000000..e567ad6 --- /dev/null +++ b/src/views/dashboard1/hooks/useRightChart1.ts @@ -0,0 +1,49 @@ +import { onBeforeUnmount, ref } from "vue"; +import { EChartsOption } from "echarts"; +import { generateNumbers } from "@/utils"; + +export default function () { + const option = ref({}); + + function refresh() { + option.value = { + radar: { + indicator: [ + { name: "用户满意度", max: 200 }, + { name: "价格", max: 200 }, + { name: "品质", max: 200 }, + { name: "客户支持", max: 200 }, + { name: "可持续性", max: 200 }, + { name: "效果", max: 200 }, + ], + radius: 100, + }, + series: [ + { + type: "radar", + data: [ + { + value: generateNumbers(1, 200, 6), + areaStyle: {}, + }, + ], + }, + ], + }; + } + + refresh(); + + const timer = setInterval(() => { + refresh(); + }, 3000); + + onBeforeUnmount(() => { + clearInterval(timer); + }); + + return { + option, + refresh, + }; +} diff --git a/src/views/dashboard1/hooks/useRightChart2.ts b/src/views/dashboard1/hooks/useRightChart2.ts new file mode 100644 index 0000000..fc5f05a --- /dev/null +++ b/src/views/dashboard1/hooks/useRightChart2.ts @@ -0,0 +1,97 @@ +import { onBeforeUnmount, ref } from "vue"; +import { EChartsOption } from "echarts"; +import { generateNumbers } from "@/utils"; + +export default function () { + const option = ref({}); + + function refresh() { + option.value = { + tooltip: { + trigger: "axis", + axisPointer: { + type: "shadow", + }, + }, + legend: { + top: "5%", + itemStyle: { + borderColor: "#fff", + borderWidth: 2, + }, + }, + grid: { + left: "10%", + bottom: "8%", + containLabel: true, + }, + xAxis: [ + { + type: "value", + }, + ], + yAxis: [ + { + type: "category", + axisTick: { + show: false, + }, + data: ["一月", "二月", "三月", "四月", "五月", "六月", "七月"], + }, + ], + series: [ + { + name: "预定", + type: "bar", + label: { + show: true, + position: "inside", + }, + emphasis: { + focus: "series", + }, + data: generateNumbers(1, 200, 7), + }, + { + name: "购买", + type: "bar", + stack: "Total", + label: { + show: true, + }, + emphasis: { + focus: "series", + }, + data: generateNumbers(1, 300, 7), + }, + { + name: "退货", + type: "bar", + stack: "Total", + label: { + show: true, + }, + emphasis: { + focus: "series", + }, + data: generateNumbers(-50, -10, 7), + }, + ], + }; + } + + refresh(); + + const timer = setInterval(() => { + refresh(); + }, 3000); + + onBeforeUnmount(() => { + clearInterval(timer); + }); + + return { + option, + refresh, + }; +} diff --git a/src/views/dashboard1/hooks/useRightChart3.ts b/src/views/dashboard1/hooks/useRightChart3.ts new file mode 100644 index 0000000..5767df0 --- /dev/null +++ b/src/views/dashboard1/hooks/useRightChart3.ts @@ -0,0 +1,59 @@ +import { onBeforeUnmount, ref } from "vue"; +import { EChartsOption } from "echarts"; +import { generateNumbers } from "@/utils"; + +export default function () { + const option = ref({}); + + function refresh() { + option.value = { + xAxis: {}, + yAxis: {}, + series: [ + { + symbolSize: 20, + data: [ + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + [8.07, 6.95], + [13.0, 7.58], + [14.0, 7.66], + [13.4, 6.81], + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + [11.5, 7.2], + [3.03, 4.23], + [1.05, 3.33], + [4.05, 4.96], + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + generateNumbers(1, 10, 2), + [5.02, 5.68], + ], + type: "scatter", + }, + ], + }; + } + + refresh(); + + const timer = setInterval(() => { + refresh(); + }, 3000); + + onBeforeUnmount(() => { + clearInterval(timer); + }); + + return { + option, + refresh, + }; +} diff --git a/src/views/dashboard1/index.less b/src/views/dashboard1/index.less new file mode 100644 index 0000000..85debb0 --- /dev/null +++ b/src/views/dashboard1/index.less @@ -0,0 +1,2532 @@ +.dashboard { + width: 1920px; + height: 1080px; + position: relative; + background-image: url("./assets/头部动画.webp"), url("./assets/头部动画.png"), + url("./assets/整体边框_静态图片.png"), url("./assets/底部动画.webp"), + url("./assets/底部动画.png"), url("./assets/头部动画_左侧点.webp"), + url("./assets/头部动画_左侧点.png"), url("./assets/头部动画_右侧点.webp"), + url("./assets/头部动画_右侧点.png"); + background-position: top, + top, + center, + bottom, + bottom, + left top, + left top, + right top, + right top; + background-repeat: no-repeat, no-repeat, no-repeat, no-repeat, no-repeat, + no-repeat, no-repeat; + background-size: 100%, + 100%, + 100% 100%, + 100%, + 100%, + auto, + auto, + auto, + auto; + + &:before { + content: "管廊巡检机器人综合管理平台"; + color: #fff; + letter-spacing: 12px; + font-size: 36px; + line-height: 70px; + width: 100%; + font-weight: bold; + position: absolute; + text-align: center; + } +} + +.background { + position: relative; + z-index: -1; + width: 100%; + height: 100%; + object-fit: cover; +} + +.main { + position: absolute; + width: 100%; + height: 100%; + top: 0; + + .content-stage { + width: 100%; + height: 100%; + } + + .page-shell { + height: 100%; + padding: 7.8% 34px 7%; + box-sizing: border-box; + } + + .page-title-block { + margin: 0 0 22px 0; + } + + .page-eyebrow { + color: rgba(114, 211, 246, 0.72); + font-size: 12px; + letter-spacing: 2px; + } + + .page-title { + margin-top: 8px; + color: #eefcff; + font-size: 30px; + font-weight: 700; + letter-spacing: 1px; + } + + .page-grid { + display: grid; + gap: 18px; + height: calc(100% - 74px); + } + + .page-grid.two-columns { + grid-template-columns: 1.2fr 0.8fr; + } + + .page-grid.three-columns { + grid-template-columns: 1fr 1fr 0.92fr; + } + + .management-layout { + grid-template-columns: 1fr; + height: 100%; + padding: 0 26px; + box-sizing: border-box; + } + + .management-page { + padding-top: 8.5%; + padding-left: 42px; + padding-right: 42px; + } + + .alarm-page, + .plan-page, + .report-page { + padding-left: 42px; + padding-right: 42px; + } + + .page-card { + min-height: 0; + padding: 22px 24px; + background: + linear-gradient(180deg, rgba(8, 29, 60, 0.78) 0%, rgba(5, 18, 39, 0.62) 100%); + border: 1px solid rgba(86, 198, 255, 0.16); + box-shadow: inset 0 0 24px rgba(46, 144, 224, 0.08); + backdrop-filter: blur(4px); + } + + .page-card-title { + margin-bottom: 18px; + color: #f2fbff; + font-size: 18px; + font-weight: 700; + letter-spacing: 0.8px; + } + + .management-table-card { + position: relative; + display: flex; + flex-direction: column; + padding: 24px 28px 22px; + background: + linear-gradient(180deg, rgba(10, 38, 74, 0.88) 0%, rgba(5, 18, 39, 0.8) 100%); + border: 1px solid rgba(93, 208, 255, 0.2); + box-shadow: + inset 0 0 32px rgba(42, 142, 221, 0.08), + 0 0 0 1px rgba(17, 75, 122, 0.35), + 0 18px 42px rgba(3, 12, 24, 0.3); + overflow: hidden; + } + + .management-table-card::before { + content: ""; + position: absolute; + inset: 10px; + border: 1px solid rgba(116, 221, 255, 0.1); + pointer-events: none; + } + + .management-table-card::after { + content: ""; + position: absolute; + inset: 0; + background: + linear-gradient(90deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) left 14px top 14px / 44px 2px no-repeat, + linear-gradient(180deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) left 14px top 14px / 2px 44px no-repeat, + linear-gradient(90deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) right 14px top 14px / 44px 2px no-repeat, + linear-gradient(180deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) right 14px top 14px / 2px 44px no-repeat, + linear-gradient(90deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) left 14px bottom 14px / 44px 2px no-repeat, + linear-gradient(180deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) left 14px bottom 14px / 2px 44px no-repeat, + linear-gradient(90deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) right 14px bottom 14px / 44px 2px no-repeat, + linear-gradient(180deg, rgba(108, 224, 255, 0.85), rgba(108, 224, 255, 0.85)) right 14px bottom 14px / 2px 44px no-repeat; + opacity: 0.8; + pointer-events: none; + } + + .management-toolbar { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 18px; + } + + .toolbar-left { + display: flex; + align-items: center; + gap: 12px; + flex-wrap: wrap; + } + + .toolbar-right { + color: rgba(174, 226, 247, 0.78); + font-size: 13px; + white-space: nowrap; + } + + .page-action-btn, + .toolbar-input, + .toolbar-select, + .crud-field input, + .crud-field select { + height: 38px; + border: 1px solid rgba(85, 198, 255, 0.18); + background: rgba(8, 31, 62, 0.72); + color: #eefcff; + font-size: 13px; + box-sizing: border-box; + } + + .page-action-btn { + min-width: 110px; + padding: 0 18px; + cursor: pointer; + transition: all 0.2s ease; + } + + .page-action-btn.primary { + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.92) 0%, + rgba(35, 158, 215, 0.9) 100% + ); + border-color: rgba(102, 235, 255, 0.42); + } + + .page-action-btn.ghost { + background: rgba(8, 31, 62, 0.6); + } + + .toolbar-input, + .toolbar-select, + .crud-field input, + .crud-field select { + padding: 0 12px; + outline: none; + } + + .toolbar-input { + width: 320px; + } + + .toolbar-select { + min-width: 140px; + } + + .table-shell { + flex: 1; + min-height: 0; + overflow: auto; + border: 1px solid rgba(77, 188, 248, 0.12); + background: rgba(5, 22, 46, 0.46); + } + + .device-table { + width: 100%; + border-collapse: collapse; + min-width: 1280px; + } + + .device-table th, + .device-table td { + padding: 14px 16px; + text-align: left; + border-bottom: 1px solid rgba(77, 188, 248, 0.08); + color: #dff7ff; + font-size: 13px; + white-space: nowrap; + } + + .device-table th { + position: sticky; + top: 0; + z-index: 1; + background: rgba(10, 42, 78, 0.95); + color: #f1fcff; + font-weight: 700; + } + + .device-table tbody tr:nth-child(2n) { + background: rgba(9, 29, 56, 0.38); + } + + .table-status { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 62px; + height: 24px; + padding: 0 10px; + border-radius: 999px; + font-size: 11px; + font-weight: 700; + border: 1px solid transparent; + } + + .alarm-status-pending { + color: #ffe6aa; + border-color: rgba(255, 201, 92, 0.24); + background: rgba(169, 118, 29, 0.2); + } + + .alarm-status-handling { + color: #ffd8b8; + border-color: rgba(255, 146, 99, 0.24); + background: rgba(162, 73, 30, 0.2); + } + + .alarm-status-finished { + color: #9cf7dc; + border-color: rgba(110, 255, 197, 0.2); + background: rgba(29, 138, 102, 0.18); + } + + .alarm-status-false { + color: #d2dcff; + border-color: rgba(126, 151, 255, 0.18); + background: rgba(53, 71, 149, 0.2); + } + + .evidence-chip { + display: inline-flex; + align-items: center; + max-width: 180px; + height: 28px; + padding: 0 10px; + border: 1px solid rgba(87, 198, 255, 0.14); + background: rgba(8, 31, 62, 0.58); + color: rgba(210, 243, 255, 0.82); + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + box-sizing: border-box; + } + + .evidence-chip.photo::before, + .evidence-chip.video::before { + margin-right: 8px; + color: #8deaff; + font-size: 11px; + font-weight: 700; + } + + .evidence-chip.photo::before { + content: "图"; + } + + .evidence-chip.video::before { + content: "视"; + } + + .table-actions { + display: flex; + align-items: center; + gap: 8px; + } + + .table-actions button, + .pagination-btn, + .dialog-close { + cursor: pointer; + } + + .table-actions button { + height: 30px; + padding: 0 10px; + border: 1px solid rgba(87, 198, 255, 0.2); + background: rgba(8, 31, 62, 0.72); + color: #eafcff; + font-size: 12px; + } + + .table-actions .danger { + border-color: rgba(255, 126, 112, 0.2); + color: #ffd0cc; + background: rgba(126, 31, 20, 0.22); + } + + .table-empty { + text-align: center !important; + color: rgba(164, 218, 243, 0.72) !important; + padding: 40px 16px !important; + } + + .pagination-bar { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 10px; + margin-top: 16px; + } + + .pagination-btn { + min-width: 38px; + height: 34px; + padding: 0 12px; + border: 1px solid rgba(87, 198, 255, 0.18); + background: rgba(8, 31, 62, 0.72); + color: #dff8ff; + font-size: 12px; + } + + .pagination-btn.active { + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.92) 0%, + rgba(35, 158, 215, 0.9) 100% + ); + border-color: rgba(102, 235, 255, 0.42); + } + + .pagination-btn:disabled { + opacity: 0.4; + cursor: not-allowed; + } + + .crud-dialog-mask { + position: fixed; + inset: 0; + background: rgba(3, 12, 24, 0.68); + display: flex; + align-items: center; + justify-content: center; + z-index: 60; + } + + .crud-dialog { + width: 720px; + max-width: calc(100vw - 80px); + padding: 24px; + background: linear-gradient( + 180deg, + rgba(7, 27, 61, 0.96) 0%, + rgba(4, 17, 38, 0.98) 100% + ); + border: 1px solid rgba(92, 202, 255, 0.2); + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.35); + } + + .crud-dialog-header, + .crud-dialog-footer { + display: flex; + align-items: center; + justify-content: space-between; + } + + .crud-dialog-title { + color: #f1fcff; + font-size: 20px; + font-weight: 700; + } + + .dialog-close { + width: 36px; + height: 36px; + border: 1px solid rgba(87, 198, 255, 0.18); + background: rgba(8, 31, 62, 0.72); + color: #eefcff; + font-size: 20px; + line-height: 1; + } + + .crud-form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 16px; + margin: 24px 0 16px; + } + + .crud-field { + display: flex; + flex-direction: column; + gap: 8px; + color: rgba(173, 224, 246, 0.78); + font-size: 13px; + } + + .crud-form-error { + margin-bottom: 16px; + color: #ffd0cc; + font-size: 13px; + } + + .crud-dialog-footer { + justify-content: flex-end; + gap: 12px; + } + + .alarm-link-btn { + min-width: 72px; + height: 30px; + padding: 0 12px; + border: 1px solid rgba(87, 198, 255, 0.2); + background: rgba(8, 31, 62, 0.72); + color: #8deaff; + font-size: 12px; + font-weight: 700; + cursor: pointer; + } + + .patrol-alarm-dialog { + width: 760px; + } + + .patrol-dialog-meta { + margin: 14px 0 12px; + color: rgba(171, 223, 246, 0.78); + font-size: 13px; + } + + .patrol-dialog-table-shell { + max-height: 320px; + } + + .robot-list, + .module-list, + .plan-list, + .alarm-table, + .summary-board { + display: flex; + flex-direction: column; + gap: 12px; + } + + .robot-row, + .plan-item, + .alarm-row, + .summary-line { + padding: 14px 16px; + background: rgba(8, 34, 68, 0.7); + border: 1px solid rgba(77, 188, 248, 0.12); + } + + .robot-row { + display: flex; + align-items: center; + justify-content: space-between; + } + + .robot-name, + .plan-name { + color: #f2fcff; + font-size: 15px; + font-weight: 700; + } + + .robot-sub, + .plan-meta { + margin-top: 4px; + color: rgba(172, 224, 246, 0.72); + font-size: 12px; + } + + .robot-right { + text-align: right; + } + + .robot-state { + display: inline-flex; + align-items: center; + justify-content: center; + min-width: 58px; + height: 24px; + padding: 0 10px; + border-radius: 999px; + color: #eafcff; + background: rgba(39, 142, 230, 0.24); + border: 1px solid rgba(97, 214, 255, 0.26); + font-size: 11px; + font-weight: 700; + } + + .module-item { + padding: 14px 16px; + background: rgba(8, 34, 68, 0.7); + border: 1px solid rgba(77, 188, 248, 0.12); + } + + .module-head { + display: flex; + justify-content: space-between; + color: #f2fbff; + font-size: 14px; + font-weight: 600; + } + + .module-bar { + height: 8px; + margin: 12px 0 10px; + background: rgba(16, 52, 94, 0.8); + overflow: hidden; + } + + .module-fill { + display: block; + height: 100%; + background: linear-gradient(90deg, #32b5ff 0%, #79f4ff 100%); + } + + .module-foot, + .plan-time { + color: rgba(168, 221, 245, 0.72); + font-size: 12px; + } + + .video-layout { + grid-template-columns: 1.2fr 0.8fr; + } + + .video-center-shell { + padding-top: 7.4%; + padding-left: 42px; + padding-right: 42px; + } + + .video-center-layout { + height: 100%; + display: grid; + grid-template-columns: 320px minmax(0, 1fr); + gap: 18px; + } + + .video-tree-card, + .video-wall-card { + min-height: 0; + } + + .video-tree-card { + display: flex; + flex-direction: column; + overflow: hidden; + } + + .tree-panel { + flex: 1; + min-height: 0; + overflow: auto; + display: flex; + flex-direction: column; + gap: 12px; + padding-right: 4px; + } + + .tree-panel-project { + padding: 12px 14px; + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.32) 0%, + rgba(35, 158, 215, 0.12) 100% + ); + border: 1px solid rgba(102, 235, 255, 0.22); + box-shadow: inset 0 0 18px rgba(52, 177, 255, 0.08); + } + + .tree-panel-project-name { + color: #eefcff; + font-size: 14px; + font-weight: 700; + } + + .tree-panel-project-meta { + margin-top: 6px; + color: rgba(166, 219, 245, 0.72); + font-size: 12px; + } + + .tree-project { + padding: 12px; + background: rgba(8, 34, 68, 0.62); + border: 1px solid rgba(77, 188, 248, 0.12); + } + + .tree-project-btn, + .tree-device-btn { + width: 100%; + cursor: pointer; + text-align: left; + box-sizing: border-box; + } + + .tree-project-btn { + height: 40px; + padding: 0 14px; + border: 1px solid rgba(87, 198, 255, 0.16); + background: rgba(8, 31, 62, 0.72); + color: #eefcff; + font-size: 14px; + font-weight: 700; + transition: all 0.2s ease; + } + + .tree-project-btn.active { + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.92) 0%, + rgba(35, 158, 215, 0.9) 100% + ); + border-color: rgba(102, 235, 255, 0.42); + } + + .tree-device-list { + margin-top: 10px; + display: flex; + flex-direction: column; + gap: 8px; + padding-left: 10px; + } + + .tree-device-btn { + padding: 10px 12px; + border: 1px solid rgba(77, 188, 248, 0.1); + background: rgba(6, 24, 48, 0.68); + color: rgba(216, 245, 255, 0.8); + transition: all 0.2s ease; + } + + .tree-device-btn.active { + border-color: rgba(102, 235, 255, 0.34); + background: rgba(20, 76, 133, 0.36); + box-shadow: inset 0 0 0 1px rgba(102, 235, 255, 0.08); + } + + .tree-device-name { + display: block; + font-size: 13px; + font-weight: 700; + } + + .tree-device-id { + display: block; + margin-top: 4px; + color: rgba(162, 217, 243, 0.68); + font-size: 11px; + } + + .video-wall-card { + display: flex; + flex-direction: column; + } + + .video-wall-header { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + margin-bottom: 16px; + } + + .video-wall-meta { + color: rgba(166, 219, 245, 0.78); + font-size: 12px; + } + + .grid-switch { + display: flex; + align-items: center; + gap: 8px; + } + + .grid-switch-btn, + .playback-btn, + .playback-filter input { + height: 34px; + border: 1px solid rgba(87, 198, 255, 0.18); + background: rgba(8, 31, 62, 0.72); + color: #eafcff; + font-size: 12px; + box-sizing: border-box; + } + + .grid-switch-btn, + .playback-btn { + padding: 0 14px; + cursor: pointer; + } + + .grid-switch-btn.active { + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.92) 0%, + rgba(35, 158, 215, 0.9) 100% + ); + border-color: rgba(102, 235, 255, 0.42); + } + + .video-grid-board { + flex: 1; + min-height: 0; + display: grid; + gap: 12px; + } + + .video-grid-board.grid-1 { + grid-template-columns: 1fr; + } + + .video-grid-board.grid-4 { + grid-template-columns: repeat(2, 1fr); + } + + .video-grid-board.grid-9 { + grid-template-columns: repeat(3, 1fr); + } + + .video-grid-cell { + position: relative; + overflow: hidden; + min-height: 170px; + border: 1px solid rgba(82, 191, 255, 0.16); + background: radial-gradient(circle at 50% 50%, rgba(34, 116, 190, 0.16), rgba(4, 16, 33, 0.96)); + } + + .video-grid-cell video { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + opacity: 0.76; + } + + .video-cell-top, + .video-cell-bottom { + position: absolute; + left: 12px; + right: 12px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + } + + .video-cell-top { + top: 12px; + } + + .video-cell-bottom { + bottom: 12px; + align-items: flex-end; + } + + .cell-badge { + padding: 3px 8px; + background: #8dedff; + color: #07131d; + font-size: 10px; + font-weight: 700; + } + + .cell-type, + .cell-meta { + color: rgba(210, 245, 255, 0.82); + font-size: 11px; + } + + .cell-name { + color: #f2fbff; + font-size: 13px; + font-weight: 700; + } + + .video-empty { + width: 100%; + height: 100%; + display: flex; + align-items: center; + justify-content: center; + color: rgba(162, 217, 243, 0.58); + font-size: 13px; + letter-spacing: 1px; + } + + .playback-panel { + margin-top: 16px; + padding: 14px 16px; + background: rgba(8, 34, 68, 0.62); + border: 1px solid rgba(77, 188, 248, 0.12); + } + + .playback-header, + .playback-controls, + .playback-filter { + display: flex; + align-items: center; + } + + .playback-header { + justify-content: space-between; + gap: 16px; + } + + .playback-title { + color: #f2fbff; + font-size: 15px; + font-weight: 700; + } + + .playback-filter { + gap: 8px; + } + + .playback-filter input { + padding: 0 10px; + } + + .playback-controls { + gap: 10px; + margin-top: 14px; + } + + .playback-track { + position: relative; + flex: 1; + min-width: 0; + height: 34px; + display: flex; + align-items: center; + } + + .playback-track-line { + position: absolute; + left: 0; + right: 0; + height: 6px; + background: rgba(14, 52, 94, 0.82); + } + + .playback-track-line span { + display: block; + height: 100%; + background: linear-gradient(90deg, #3bbdff 0%, #89f5ff 100%); + } + + .playback-range { + position: relative; + width: 100%; + margin: 0; + opacity: 0; + cursor: pointer; + } + + .playback-time { + color: rgba(201, 240, 255, 0.82); + font-size: 12px; + white-space: nowrap; + } + + .report-dashboard-page { + padding-left: 42px; + padding-right: 42px; + } + + .report-dashboard { + height: 100%; + min-height: 0; + } + + .report-main-grid { + display: grid; + grid-template-columns: 1fr 1fr; + grid-template-rows: repeat(2, minmax(0, 1fr)); + gap: 18px; + min-height: 100%; + } + + .report-panel { + min-height: 0; + display: flex; + flex-direction: column; + } + + .report-panel-header { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + margin-bottom: 10px; + } + + .report-panel-header .page-card-title { + margin-bottom: 0; + } + + .report-filter-select { + min-width: 124px; + height: 34px; + padding: 0 12px; + border: 1px solid rgba(87, 198, 255, 0.18); + background: rgba(8, 31, 62, 0.72); + color: #eafcff; + font-size: 12px; + box-sizing: border-box; + outline: none; + } + + .report-filter-tabs { + display: flex; + align-items: center; + gap: 8px; + } + + .report-filter-tab { + height: 34px; + padding: 0 12px; + border: 1px solid rgba(87, 198, 255, 0.18); + background: rgba(8, 31, 62, 0.72); + color: #dff8ff; + font-size: 12px; + cursor: pointer; + } + + .report-filter-tab.active { + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.92) 0%, + rgba(35, 158, 215, 0.9) 100% + ); + border-color: rgba(102, 235, 255, 0.42); + color: #eefcff; + } + + .trend-chart { + flex: 1; + min-height: 0; + height: 260px; + } + + .trend-legend { + display: flex; + gap: 18px; + color: rgba(171, 223, 246, 0.8); + font-size: 12px; + } + + .trend-legend span { + display: inline-flex; + align-items: center; + gap: 8px; + } + + .legend-dot { + width: 10px; + height: 10px; + display: inline-block; + } + + .legend-dot.total { + background: #59cfff; + } + + .legend-dot.closed { + background: #46d8a7; + } + + .report-bar-list { + display: flex; + flex-direction: column; + gap: 14px; + margin-top: 4px; + } + + .report-bar-row { + display: flex; + flex-direction: column; + gap: 8px; + } + + .bar-row-head { + display: flex; + justify-content: space-between; + gap: 12px; + color: #eafcff; + font-size: 13px; + } + + .report-bar-track { + height: 10px; + background: rgba(14, 52, 94, 0.82); + overflow: hidden; + } + + .report-bar-fill { + display: block; + height: 100%; + } + + .report-bar-fill.cyan { + background: linear-gradient(90deg, #3bbdff 0%, #89f5ff 100%); + } + + .report-bar-fill.blue { + background: linear-gradient(90deg, #3378ff 0%, #61d4ff 100%); + } + + .type-radar-layout { + flex: 1; + min-height: 0; + display: grid; + grid-template-columns: minmax(0, 1fr) 170px; + gap: 12px; + align-items: center; + } + + .type-radar-chart { + min-height: 260px; + height: 100%; + } + + .type-radar-legend { + display: flex; + flex-direction: column; + gap: 12px; + } + + .type-legend-item { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + padding: 10px 12px; + background: rgba(8, 34, 68, 0.56); + border: 1px solid rgba(77, 188, 248, 0.1); + } + + .type-legend-name { + color: #eafcff; + font-size: 13px; + } + + .type-legend-value { + color: rgba(181, 230, 249, 0.82); + font-size: 12px; + } + + .status-pie-layout { + flex: 1; + min-height: 0; + display: grid; + grid-template-columns: minmax(0, 1fr) 190px; + gap: 14px; + align-items: center; + } + + .status-pie-chart { + min-height: 260px; + height: 100%; + } + + .status-pie-legend { + display: flex; + flex-direction: column; + gap: 12px; + } + + .status-legend-item { + display: grid; + grid-template-columns: 10px minmax(0, 1fr) auto auto; + align-items: center; + gap: 10px; + padding: 10px 12px; + background: rgba(8, 34, 68, 0.56); + border: 1px solid rgba(77, 188, 248, 0.1); + } + + .status-legend-dot { + width: 10px; + height: 10px; + border-radius: 50%; + } + + .status-legend-dot.pending { + background: #ffd66e; + } + + .status-legend-dot.handling { + background: #ff8b78; + } + + .status-legend-dot.finished { + background: #62e0a8; + } + + .status-legend-dot.false { + background: #8ea7ff; + } + + .status-legend-name { + color: #eafcff; + font-size: 13px; + } + + .status-legend-value, + .status-legend-percent { + color: rgba(181, 230, 249, 0.82); + font-size: 12px; + } + + + .video-hero { + position: relative; + height: calc(100% - 42px); + min-height: 420px; + overflow: hidden; + border: 1px solid rgba(82, 191, 255, 0.16); + } + + .video-hero video, + .feed-item video { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + } + + .hero-badge { + position: absolute; + left: 18px; + top: 16px; + padding: 4px 10px; + color: #08131f; + background: #8dedff; + font-size: 11px; + font-weight: 700; + } + + .feed-wall { + display: grid; + grid-template-columns: 1fr; + gap: 12px; + height: calc(100% - 42px); + } + + .feed-item { + position: relative; + overflow: hidden; + min-height: 120px; + border: 1px solid rgba(82, 191, 255, 0.16); + } + + .feed-label { + position: absolute; + left: 12px; + bottom: 12px; + color: #f2fbff; + font-size: 12px; + font-weight: 600; + } + + .alarm-table { + gap: 10px; + } + + .alarm-row { + display: grid; + grid-template-columns: 100px 120px 60px 1fr 90px; + gap: 12px; + align-items: center; + color: #dff8ff; + font-size: 13px; + } + + .stage-board, + .group-board, + .report-metrics { + display: grid; + gap: 14px; + } + + .stage-pill, + .group-block, + .metric-box { + padding: 18px 16px; + background: rgba(8, 34, 68, 0.7); + border: 1px solid rgba(77, 188, 248, 0.12); + color: #eefcff; + } + + .group-board, + .report-metrics { + grid-template-columns: repeat(2, 1fr); + } + + .metric-label { + color: rgba(164, 218, 243, 0.72); + font-size: 12px; + } + + .metric-value { + margin-top: 10px; + color: #f5fcff; + font-size: 26px; + font-weight: 700; + } + + .btn-group { + position: absolute; + top: 5%; + display: flex; + justify-content: center; + left: 50%; + gap: 100%; + transform: translateX(-50%); + + .left { + display: flex; + justify-content: space-between; + gap: 30px; + } + + .right { + display: flex; + justify-content: space-between; + gap: 30px; + } + } + + .center { + height: 100%; + display: flex; + + .middle { + width: 50%; + height: 100%; + + .nav-map-panel { + margin: calc(8.5% + 40px) auto 0; + width: 92%; + height: 74%; + display: flex; + flex-direction: column; + padding: 18px 22px 16px; + background: linear-gradient( + 180deg, + rgba(7, 23, 48, 0.76) 0%, + rgba(4, 16, 34, 0.58) 100% + ); + border: 1px solid rgba(95, 204, 255, 0.18); + box-shadow: inset 0 0 24px rgba(45, 144, 224, 0.08); + } + + .nav-map-header { + display: flex; + justify-content: space-between; + align-items: flex-start; + margin-bottom: 14px; + } + + .map-label { + color: rgba(118, 212, 248, 0.72); + font-size: 12px; + letter-spacing: 1.2px; + } + + .map-title { + margin-top: 6px; + color: #eefcff; + font-size: 22px; + font-weight: 700; + letter-spacing: 0.6px; + } + + .nav-map-stage { + position: relative; + flex: 1; + overflow: hidden; + background: + radial-gradient(circle at 50% 50%, rgba(32, 112, 183, 0.12), transparent 45%), + linear-gradient(180deg, rgba(5, 17, 35, 0.94) 0%, rgba(3, 12, 27, 0.96) 100%); + border: 1px solid rgba(82, 191, 255, 0.16); + } + + .nav-map-stage::before { + content: ""; + position: absolute; + inset: 0; + background: + linear-gradient(rgba(255, 255, 255, 0.02) 1px, transparent 1px), + linear-gradient(90deg, rgba(255, 255, 255, 0.02) 1px, transparent 1px); + background-size: 48px 48px; + opacity: 0.5; + pointer-events: none; + } + + .nav-map-svg { + width: 100%; + height: 100%; + } + + .grid-layer line { + stroke: rgba(90, 192, 255, 0.08); + stroke-width: 1; + } + + .cloud-layer circle { + fill: rgba(140, 230, 255, 0.74); + opacity: 0.88; + filter: drop-shadow(0 0 4px rgba(82, 198, 255, 0.28)); + } + + .route-glow { + fill: none; + stroke: rgba(88, 219, 255, 0.18); + stroke-width: 18; + stroke-linecap: round; + stroke-linejoin: round; + } + + .route-line { + fill: none; + stroke: #67e3ff; + stroke-width: 5; + stroke-linecap: round; + stroke-linejoin: round; + stroke-dasharray: 12 12; + animation: routeFlow 12s linear infinite; + filter: drop-shadow(0 0 10px rgba(70, 212, 255, 0.32)); + } + + .checkpoint circle { + fill: rgba(6, 22, 51, 0.95); + stroke: #7ae5ff; + stroke-width: 2; + } + + .checkpoint text { + fill: rgba(218, 247, 255, 0.9); + font-size: 12px; + font-weight: 600; + } + + .robot-shadow { + fill: rgba(81, 220, 255, 0.18); + } + + .robot-body { + fill: #f5fbff; + stroke: #4ae3ff; + stroke-width: 3; + filter: drop-shadow(0 0 14px rgba(89, 215, 255, 0.36)); + } + + .robot-head { + fill: #49e2ff; + filter: drop-shadow(0 0 12px rgba(73, 226, 255, 0.3)); + } + + .nav-map-overlay { + position: absolute; + color: rgba(183, 234, 255, 0.82); + font-size: 11px; + letter-spacing: 0.7px; + } + + .nav-map-overlay.top-left { + left: 14px; + top: 12px; + } + + .nav-map-overlay.top-right { + right: 14px; + top: 12px; + } + + .nav-map-overlay.bottom-left { + left: 14px; + bottom: 12px; + } + + .nav-map-overlay.bottom-right { + right: 14px; + bottom: 12px; + } + + .nav-map-footer { + margin-top: 12px; + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + gap: 10px; + } + + .footer-item { + padding: 10px 12px; + background: rgba(8, 31, 62, 0.68); + border: 1px solid rgba(77, 190, 255, 0.14); + } + + .footer-label { + display: block; + margin-bottom: 4px; + color: rgba(128, 209, 244, 0.74); + font-size: 11px; + } + + .footer-value { + color: #eefcff; + font-size: 13px; + font-weight: 700; + } + } + + [class^="card-"] { + width: 100%; + position: relative; + background-image: url("./assets/01.webp"), url("./assets/01.png"), + url("./assets/标题1_静态背景.png"), url("./assets/卡片背景.png"); + background-repeat: no-repeat; + background-position: top, + top, + top, + 20px 40px; + background-size: 100%; + + .title { + font-weight: bold; + background-image: -webkit-linear-gradient(top, + rgb(157, 195, 234), + #fff, + rgb(96, 162, 225)); + user-select: none; + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + line-height: 30px; + margin-left: 80px; + color: #fff; + font-size: 18px; + } + } + + .device-card { + .device-panel { + margin: 4px 24px 0; + padding: 12px 14px 16px; + height: calc(100% - 56px); + display: flex; + flex-direction: column; + gap: 12px; + background: linear-gradient( + 180deg, + rgba(7, 27, 61, 0.76) 0%, + rgba(3, 18, 41, 0.56) 100% + ); + border: 1px solid rgba(80, 197, 255, 0.18); + box-shadow: inset 0 0 20px rgba(65, 179, 255, 0.08); + } + + .project-name { + height: 34px; + display: flex; + align-items: center; + padding: 0 12px; + border: 1px solid rgba(102, 235, 255, 0.28); + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.4) 0%, + rgba(35, 158, 215, 0.16) 100% + ); + color: #e8fbff; + font-size: 13px; + letter-spacing: 1px; + box-shadow: inset 0 0 18px rgba(52, 177, 255, 0.12); + } + + .device-list { + flex: 1; + display: flex; + flex-direction: column; + gap: 8px; + overflow: auto; + padding-right: 4px; + } + + .device-list::-webkit-scrollbar { + width: 4px; + } + + .device-list::-webkit-scrollbar-thumb { + background: rgba(83, 194, 255, 0.35); + border-radius: 999px; + } + + .device-item { + padding: 10px 12px; + background: linear-gradient( + 90deg, + rgba(7, 28, 61, 0.92) 0%, + rgba(9, 49, 95, 0.55) 100% + ); + border-left: 3px solid rgba(78, 205, 255, 0.8); + box-shadow: inset 0 0 0 1px rgba(67, 177, 233, 0.08); + } + + .device-main { + display: flex; + align-items: center; + justify-content: space-between; + gap: 8px; + margin-bottom: 6px; + } + + .device-name { + color: #f3fcff; + font-size: 14px; + font-weight: 600; + letter-spacing: 0.3px; + } + + .device-status { + padding: 2px 8px; + border-radius: 999px; + font-size: 11px; + line-height: 18px; + border: 1px solid transparent; + } + + .status-idle { + color: #94ffdd; + border-color: rgba(102, 255, 205, 0.32); + background: rgba(36, 143, 108, 0.18); + } + + .status-offline { + color: #ffc4a6; + border-color: rgba(255, 151, 102, 0.28); + background: rgba(165, 69, 28, 0.18); + } + + .status-charging { + color: #ffe08f; + border-color: rgba(255, 203, 87, 0.28); + background: rgba(160, 113, 28, 0.18); + } + + .device-meta { + display: flex; + justify-content: space-between; + gap: 8px; + color: rgba(166, 219, 245, 0.8); + font-size: 11px; + } + } + + .flow-card { + .flow-panel { + margin: 4px 24px 0; + height: calc(100% - 56px); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 8px 6px 12px; + } + + .flow-ring { + position: relative; + width: 100%; + height: 100%; + } + + .flow-ring-svg { + width: 100%; + height: 100%; + } + + .flow-ring-outer { + fill: none; + stroke: rgba(95, 214, 255, 0.38); + stroke-width: 1.5; + stroke-dasharray: 6 8; + } + + .flow-ring-inner { + fill: none; + stroke: rgba(89, 188, 255, 0.16); + stroke-width: 14; + filter: drop-shadow(0 0 10px rgba(36, 144, 232, 0.12)); + } + + .flow-arc-title { + fill: #effcff; + font-size: 13px; + font-weight: 700; + letter-spacing: 0.5px; + } + + .flow-arc-detail { + fill: rgba(181, 230, 249, 0.82); + font-size: 10px; + letter-spacing: 0.2px; + } + + .flow-step { + opacity: 0.38; + animation: flowStepPulse 8s infinite; + } + + .step-1 { + animation-delay: 0s; + } + + .step-2 { + animation-delay: 2s; + } + + .step-3 { + animation-delay: 4s; + } + + .step-4 { + animation-delay: 6s; + } + + .flow-core { + position: absolute; + left: 50%; + top: 50%; + width: 104px; + height: 104px; + transform: translate(-50%, -50%); + border-radius: 50%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + text-align: center; + background: radial-gradient( + circle, + rgba(31, 130, 212, 0.42) 0%, + rgba(7, 31, 72, 0.96) 68%, + rgba(4, 19, 49, 0.98) 100% + ); + border: 1px solid rgba(111, 223, 255, 0.36); + box-shadow: 0 0 36px rgba(31, 130, 212, 0.18); + } + + .flow-core-label { + color: #f5fcff; + font-size: 15px; + font-weight: 700; + } + } + + .alert-card, + .video-card, + .control-card { + > .title, + > .card-header { + position: relative; + z-index: 1; + } + } + + .card-header { + margin: 0 24px 0 0; + min-height: 32px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + + .title { + margin-left: 80px; + flex: 0 0 auto; + } + } + + .alert-card { + .alert-panel { + margin: 8px 24px 0; + display: flex; + flex-direction: column; + gap: 10px; + } + + .alert-tabs { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 8px; + margin-top: 6px; + } + + .alert-tab { + height: 32px; + border: 1px solid rgba(87, 198, 255, 0.2); + background: rgba(8, 31, 62, 0.72); + color: rgba(192, 235, 250, 0.78); + font-size: 12px; + cursor: pointer; + transition: all 0.2s ease; + + &.active { + color: #eefcff; + border-color: rgba(102, 235, 255, 0.7); + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.88) 0%, + rgba(35, 158, 215, 0.88) 100% + ); + box-shadow: 0 0 12px rgba(52, 177, 255, 0.24); + } + } + + .alert-item { + padding: 12px 14px; + background: linear-gradient( + 90deg, + rgba(8, 31, 68, 0.92) 0%, + rgba(10, 49, 92, 0.58) 100% + ); + border-left: 3px solid rgba(92, 196, 255, 0.76); + box-shadow: inset 0 0 0 1px rgba(65, 174, 243, 0.08); + } + + .alert-main { + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + margin-bottom: 8px; + } + + .alert-title { + color: #f0fbff; + font-size: 15px; + font-weight: 700; + } + + .alert-level { + min-width: 46px; + padding: 3px 8px; + border-radius: 999px; + text-align: center; + font-size: 11px; + font-weight: 700; + } + + .level-高 { + color: #ffd0cc; + background: rgba(176, 49, 30, 0.22); + border: 1px solid rgba(255, 126, 112, 0.28); + } + + .level-中 { + color: #ffe6aa; + background: rgba(169, 118, 29, 0.2); + border: 1px solid rgba(255, 201, 92, 0.24); + } + + .level-低 { + color: #9cf7dc; + background: rgba(29, 138, 102, 0.18); + border: 1px solid rgba(110, 255, 197, 0.2); + } + + .alert-meta { + display: flex; + justify-content: space-between; + gap: 10px; + color: rgba(171, 223, 246, 0.8); + font-size: 11px; + } + + .alert-empty { + padding: 22px 12px; + text-align: center; + color: rgba(161, 215, 241, 0.68); + font-size: 12px; + background: rgba(8, 27, 60, 0.58); + border: 1px dashed rgba(77, 187, 248, 0.14); + } + } + + .video-card { + .video-panel { + margin: 12px 24px 0; + height: calc(100% - 56px); + display: flex; + flex-direction: column; + } + + .camera-switch { + display: flex; + justify-content: flex-end; + gap: 8px; + align-items: center; + } + + .header-switch { + flex: 1; + } + + .camera-btn { + min-width: 84px; + height: 30px; + padding: 0 12px; + border: 1px solid rgba(87, 198, 255, 0.2); + background: rgba(8, 31, 62, 0.72); + color: rgba(192, 235, 250, 0.78); + font-size: 11px; + letter-spacing: 0.4px; + cursor: pointer; + transition: all 0.2s ease; + + &.active { + color: #eefcff; + border-color: rgba(102, 235, 255, 0.7); + background: linear-gradient( + 90deg, + rgba(24, 102, 180, 0.88) 0%, + rgba(35, 158, 215, 0.88) 100% + ); + box-shadow: 0 0 12px rgba(52, 177, 255, 0.24); + } + } + + .video-screen { + position: relative; + height: 158px; + overflow: hidden; + background: + linear-gradient(rgba(12, 31, 56, 0.16), rgba(12, 31, 56, 0.16)), + radial-gradient(circle at 50% 35%, rgba(74, 174, 235, 0.32), transparent 42%), + linear-gradient(135deg, rgba(6, 20, 44, 0.98) 0%, rgba(8, 40, 78, 0.92) 100%); + border: 1px solid rgba(87, 198, 255, 0.22); + box-shadow: inset 0 0 0 1px rgba(62, 177, 248, 0.08); + } + + .monitor-video { + width: 100%; + height: 100%; + object-fit: cover; + display: block; + opacity: 0.72; + filter: saturate(0.85) contrast(1.05); + + &.infrared { + filter: sepia(1) hue-rotate(-28deg) saturate(2.4) contrast(1.2) + brightness(0.92); + } + } + + .scan-line { + position: absolute; + inset: 0; + background: linear-gradient( + 180deg, + transparent 0%, + rgba(104, 228, 255, 0.18) 48%, + transparent 52%, + transparent 100% + ); + animation: screenScan 3.2s linear infinite; + } + + .video-overlay { + position: absolute; + color: rgba(214, 247, 255, 0.86); + font-size: 11px; + letter-spacing: 0.4px; + } + + .top-left { + top: 10px; + left: 12px; + color: #9cf8ff; + } + + .top-right { + top: 10px; + right: 12px; + } + + .bottom-left { + left: 12px; + bottom: 10px; + } + + .bottom-right { + right: 12px; + bottom: 10px; + } + + } + + .control-card { + .control-panel { + margin: 12px 24px 0; + display: flex; + flex-direction: column; + gap: 14px; + } + + .control-status { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + } + + .status-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 10px 12px; + background: linear-gradient( + 180deg, + rgba(10, 36, 72, 0.78) 0%, + rgba(7, 23, 48, 0.66) 100% + ); + border: 1px solid rgba(78, 194, 255, 0.16); + box-shadow: inset 0 0 14px rgba(62, 177, 248, 0.06); + } + + .status-label { + color: rgba(148, 210, 239, 0.74); + font-size: 11px; + } + + .status-value { + color: #e7fbff; + font-size: 12px; + font-weight: 700; + text-align: right; + } + + .control-main { + display: flex; + flex-direction: column; + gap: 14px; + min-height: 0; + } + + .control-top-row { + display: grid; + grid-template-columns: minmax(0, calc(50% - 10px)) minmax(0, calc(50% + 10px)); + gap: 14px; + align-items: stretch; + } + + .vehicle-section { + display: flex; + flex-direction: column; + align-items: center; + justify-content: flex-start; + } + + .control-top-row > .vehicle-section, + .control-top-row > .gimbal-section { + padding: 14px 14px 12px; + background: linear-gradient( + 180deg, + rgba(8, 31, 62, 0.78) 0%, + rgba(5, 20, 42, 0.88) 100% + ); + border: 1px solid rgba(87, 198, 255, 0.16); + box-shadow: inset 0 0 20px rgba(62, 177, 248, 0.06); + } + + .control-block-title { + align-self: flex-start; + text-align: left; + margin-bottom: 4px; + color: #eef8ff; + font-size: 12px; + } + + .vehicle-pad { + width: 208px; + height: 208px; + margin: -5px auto -22px; + position: relative; + left: -22px; + transform: scale(0.88); + transform-origin: center top; + display: grid; + grid-template-columns: 1fr 72px 1fr; + grid-template-rows: 1fr 72px 1fr; + grid-template-areas: + ". up ." + "left core right" + ". down ."; + align-items: center; + justify-items: center; + } + + .vehicle-pad::before { + content: ""; + position: absolute; + inset: 20px; + border-radius: 50%; + border: 1px solid rgba(92, 202, 255, 0.18); + box-shadow: inset 0 0 24px rgba(34, 112, 184, 0.12); + pointer-events: none; + } + + .drive-btn { + width: 72px; + height: 72px; + border: 1px solid rgba(151, 177, 197, 0.24); + background: linear-gradient( + 180deg, + rgba(87, 104, 118, 0.92) 0%, + rgba(35, 44, 55, 0.98) 100% + ); + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 6px; + color: #eef8ff; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), + inset 0 -1px 0 rgba(0, 0, 0, 0.24), + 0 0 14px rgba(0, 0, 0, 0.16); + cursor: pointer; + transition: transform 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease; + } + + .drive-btn:hover { + transform: translateY(-1px); + border-color: rgba(122, 226, 255, 0.42); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.16), + inset 0 -1px 0 rgba(0, 0, 0, 0.28), + 0 0 16px rgba(60, 176, 243, 0.16); + } + + .drive-up { + grid-area: up; + border-radius: 16px 16px 28px 28px; + } + + .drive-left { + grid-area: left; + border-radius: 16px 28px 28px 16px; + } + + .drive-right { + grid-area: right; + border-radius: 28px 16px 16px 28px; + } + + .drive-down { + grid-area: down; + border-radius: 28px 28px 16px 16px; + } + + .drive-arrow { + color: #8deaff; + font-size: 15px; + line-height: 1; + text-shadow: 0 0 10px rgba(84, 214, 255, 0.28); + } + + .drive-label { + font-size: 11px; + font-weight: 700; + letter-spacing: 0.6px; + line-height: 1; + } + + .drive-core { + grid-area: core; + width: 72px; + height: 72px; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + background: radial-gradient( + circle, + rgba(35, 130, 209, 0.42) 0%, + rgba(10, 45, 88, 0.92) 56%, + rgba(5, 24, 51, 0.98) 100% + ); + border: 1px solid rgba(97, 214, 255, 0.3); + box-shadow: inset 0 0 16px rgba(111, 224, 255, 0.14), + 0 0 18px rgba(34, 126, 206, 0.16); + } + + .core-mark { + color: #f5fbff; + font-size: 11px; + font-weight: 700; + letter-spacing: 0.8px; + } + + .mode-toggle-btn { + flex: 0 0 auto; + display: flex; + align-items: center; + justify-content: center; + gap: 6px; + min-width: 132px; + height: 36px; + padding: 4px 6px; + border-radius: 999px; + border: 1px solid rgba(91, 208, 255, 0.24); + background: linear-gradient( + 90deg, + rgba(16, 74, 132, 0.94) 0%, + rgba(8, 38, 78, 0.98) 58%, + rgba(7, 26, 52, 0.98) 100% + ); + color: #eefcff; + cursor: pointer; + box-shadow: inset 0 0 0 1px rgba(57, 180, 246, 0.08), + 0 0 18px rgba(29, 133, 222, 0.12); + transition: all 0.2s ease; + + &:hover { + border-color: rgba(102, 235, 255, 0.72); + box-shadow: inset 0 0 0 1px rgba(57, 180, 246, 0.12), + 0 0 22px rgba(52, 177, 255, 0.22); + } + } + + .mode-toggle-chip { + min-width: 54px; + height: 26px; + padding: 0 10px; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + color: rgba(171, 223, 246, 0.72); + font-size: 12px; + font-weight: 700; + line-height: 1; + letter-spacing: 0.4px; + white-space: nowrap; + transition: all 0.2s ease; + + &.active { + color: #f4fcff; + background: linear-gradient( + 180deg, + rgba(93, 218, 255, 0.28) 0%, + rgba(39, 142, 230, 0.34) 100% + ); + box-shadow: inset 0 0 0 1px rgba(122, 228, 255, 0.28), + 0 0 12px rgba(77, 190, 255, 0.18); + } + } + + .control-section { + padding: 10px 10px 12px; + background: linear-gradient( + 180deg, + rgba(28, 40, 53, 0.92) 0%, + rgba(14, 22, 31, 0.96) 100% + ); + border: 1px solid rgba(129, 158, 178, 0.22); + box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.03), + 0 0 16px rgba(0, 0, 0, 0.18); + display: flex; + flex-direction: column; + } + + .gimbal-section { + justify-content: flex-start; + } + + .control-top-row > .gimbal-section .section-title { + text-align: left; + } + + .lift-section { + background: linear-gradient( + 180deg, + rgba(8, 31, 62, 0.78) 0%, + rgba(5, 20, 42, 0.88) 100% + ); + border: 1px solid rgba(87, 198, 255, 0.16); + box-shadow: inset 0 0 20px rgba(62, 177, 248, 0.06); + } + + .lift-section .section-title { + align-self: flex-start; + text-align: left; + } + + .section-title { + margin-bottom: 8px; + color: #d9e7f1; + font-size: 11px; + font-weight: 700; + letter-spacing: 1px; + text-align: center; + } + + .industrial-btn { + min-width: 48px; + height: 34px; + border: 1px solid rgba(167, 183, 194, 0.26); + background: linear-gradient( + 180deg, + rgba(99, 117, 132, 0.9) 0%, + rgba(45, 57, 68, 0.96) 100% + ); + color: #f0f6fa; + font-size: 12px; + font-weight: 700; + cursor: pointer; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.12), + inset 0 -1px 0 rgba(0, 0, 0, 0.22); + } + + .gimbal-wheel { + margin: -5px auto -22px; + left: -22px; + transform: scale(0.88); + } + + .lift-control-panel { + display: flex; + flex-direction: column; + gap: 12px; + padding-top: 2px; + } + + .lift-input-group { + display: flex; + flex-direction: column; + gap: 8px; + } + + .lift-input-label { + color: rgba(173, 223, 246, 0.82); + font-size: 11px; + letter-spacing: 0.8px; + } + + .lift-input-shell { + height: 42px; + padding: 0 12px; + display: flex; + align-items: center; + gap: 10px; + background: linear-gradient( + 180deg, + rgba(10, 36, 72, 0.9) 0%, + rgba(7, 23, 48, 0.82) 100% + ); + border: 1px solid rgba(91, 208, 255, 0.22); + box-shadow: inset 0 0 14px rgba(62, 177, 248, 0.08); + } + + .lift-input { + flex: 1 1 auto; + min-width: 0; + border: 0; + outline: 0; + background: transparent; + color: #eefcff; + font-size: 16px; + font-weight: 700; + } + + .lift-unit { + color: rgba(160, 216, 239, 0.76); + font-size: 11px; + font-weight: 700; + letter-spacing: 0.8px; + } + + .lift-submit-btn { + height: 38px; + border: 1px solid rgba(91, 208, 255, 0.26); + background: linear-gradient( + 90deg, + rgba(16, 74, 132, 0.96) 0%, + rgba(8, 38, 78, 0.98) 56%, + rgba(7, 26, 52, 0.98) 100% + ); + color: #eefcff; + font-size: 12px; + font-weight: 700; + letter-spacing: 0.8px; + cursor: pointer; + box-shadow: inset 0 0 0 1px rgba(57, 180, 246, 0.08), + 0 0 18px rgba(29, 133, 222, 0.12); + transition: border-color 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease; + + &:hover { + transform: translateY(-1px); + border-color: rgba(102, 235, 255, 0.72); + box-shadow: inset 0 0 0 1px rgba(57, 180, 246, 0.12), + 0 0 22px rgba(52, 177, 255, 0.22); + } + } + + .lift-status-panel { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 10px; + } + + .lift-status-item { + display: flex; + flex-direction: column; + gap: 6px; + padding: 10px 12px; + background: linear-gradient( + 180deg, + rgba(10, 36, 72, 0.78) 0%, + rgba(7, 23, 48, 0.66) 100% + ); + border: 1px solid rgba(78, 194, 255, 0.16); + box-shadow: inset 0 0 14px rgba(62, 177, 248, 0.06); + } + + .lift-status-label { + color: rgba(148, 210, 239, 0.74); + font-size: 11px; + } + + .lift-status-value { + color: #e7fbff; + font-size: 14px; + font-weight: 700; + } + + } + + .left { + padding-left: 30px; + } + + .right { + padding-right: 30px; + display: flex; + flex-direction: column; + gap: 16px; + padding-top: 11%; + padding-bottom: 6%; + box-sizing: border-box; + + .card-1 { + top: 0; + height: 222px; + flex: none; + margin-top: -100px; + } + + .card-2 { + top: 0; + flex: 1; + min-height: 0; + } + } + + .left, + .right { + width: 25%; + height: 100%; + } + + @keyframes screenScan { + 0% { + transform: translateY(-100%); + } + 100% { + transform: translateY(100%); + } + } + + @keyframes routeFlow { + 0% { + stroke-dashoffset: 0; + } + 100% { + stroke-dashoffset: -96; + } + } + + @keyframes flowStepPulse { + 0%, + 18% { + opacity: 0.38; + } + 24%, + 44% { + opacity: 1; + } + 50%, + 100% { + opacity: 0.38; + } + } + + @keyframes joystickFloat { + 0%, + 100% { + transform: translate(-50%, -50%); + } + 20% { + transform: translate(-50%, -60%); + } + 40% { + transform: translate(-44%, -52%); + } + 60% { + transform: translate(-50%, -46%); + } + 80% { + transform: translate(-56%, -52%); + } + } + + .left { + display: flex; + flex-direction: column; + gap: 20px; + padding-top: 11%; + padding-bottom: 8%; + box-sizing: border-box; + + .card-1 { + top: 0; + height: 400px; + flex: none; + margin-top: -100px; + } + + .card-2 { + top: 0; + height: 500px; + flex: none; + } + } + } + +} diff --git a/src/views/dashboard1/index.vue b/src/views/dashboard1/index.vue new file mode 100644 index 0000000..406b30a --- /dev/null +++ b/src/views/dashboard1/index.vue @@ -0,0 +1,89 @@ + + + + + diff --git a/src/views/dashboard1/pages/AlarmManagementPage.vue b/src/views/dashboard1/pages/AlarmManagementPage.vue new file mode 100644 index 0000000..bc95d6a --- /dev/null +++ b/src/views/dashboard1/pages/AlarmManagementPage.vue @@ -0,0 +1,214 @@ + + + diff --git a/src/views/dashboard1/pages/DataReportPage.vue b/src/views/dashboard1/pages/DataReportPage.vue new file mode 100644 index 0000000..c2fe236 --- /dev/null +++ b/src/views/dashboard1/pages/DataReportPage.vue @@ -0,0 +1,492 @@ + + + diff --git a/src/views/dashboard1/pages/EquipmentManagementPage.vue b/src/views/dashboard1/pages/EquipmentManagementPage.vue new file mode 100644 index 0000000..e82d7e0 --- /dev/null +++ b/src/views/dashboard1/pages/EquipmentManagementPage.vue @@ -0,0 +1,2299 @@ + + + + + diff --git a/src/views/dashboard1/pages/IntegratedCenterPage.vue b/src/views/dashboard1/pages/IntegratedCenterPage.vue new file mode 100644 index 0000000..697d0cb --- /dev/null +++ b/src/views/dashboard1/pages/IntegratedCenterPage.vue @@ -0,0 +1,484 @@ + + + diff --git a/src/views/dashboard1/pages/PatrolPlanPage.vue b/src/views/dashboard1/pages/PatrolPlanPage.vue new file mode 100644 index 0000000..ba7f0c4 --- /dev/null +++ b/src/views/dashboard1/pages/PatrolPlanPage.vue @@ -0,0 +1,161 @@ + + + diff --git a/src/views/dashboard1/pages/VideoCenterPage.vue b/src/views/dashboard1/pages/VideoCenterPage.vue new file mode 100644 index 0000000..a77c62d --- /dev/null +++ b/src/views/dashboard1/pages/VideoCenterPage.vue @@ -0,0 +1,211 @@ + + + diff --git a/src/views/dashboard2/assets/card/10.png b/src/views/dashboard2/assets/card/10.png new file mode 100644 index 0000000..26399fd Binary files /dev/null and b/src/views/dashboard2/assets/card/10.png differ diff --git a/src/views/dashboard2/assets/card/10.webp b/src/views/dashboard2/assets/card/10.webp new file mode 100644 index 0000000..4cb0c91 Binary files /dev/null and b/src/views/dashboard2/assets/card/10.webp differ diff --git a/src/views/dashboard2/assets/card/10_点.png b/src/views/dashboard2/assets/card/10_点.png new file mode 100644 index 0000000..7e3c919 Binary files /dev/null and b/src/views/dashboard2/assets/card/10_点.png differ diff --git a/src/views/dashboard2/assets/card/10_点.webp b/src/views/dashboard2/assets/card/10_点.webp new file mode 100644 index 0000000..26aa7c4 Binary files /dev/null and b/src/views/dashboard2/assets/card/10_点.webp differ diff --git a/src/views/dashboard2/assets/card/标题10_静态背景.png b/src/views/dashboard2/assets/card/标题10_静态背景.png new file mode 100644 index 0000000..e425eb8 Binary files /dev/null and b/src/views/dashboard2/assets/card/标题10_静态背景.png differ diff --git a/src/views/dashboard2/assets/center.png b/src/views/dashboard2/assets/center.png new file mode 100644 index 0000000..2d3daec Binary files /dev/null and b/src/views/dashboard2/assets/center.png differ diff --git a/src/views/dashboard2/assets/右侧_动画.png b/src/views/dashboard2/assets/右侧_动画.png new file mode 100644 index 0000000..469f1d0 Binary files /dev/null and b/src/views/dashboard2/assets/右侧_动画.png differ diff --git a/src/views/dashboard2/assets/右侧_动画.webp b/src/views/dashboard2/assets/右侧_动画.webp new file mode 100644 index 0000000..5f0a681 Binary files /dev/null and b/src/views/dashboard2/assets/右侧_动画.webp differ diff --git a/src/views/dashboard2/assets/头部动画.png b/src/views/dashboard2/assets/头部动画.png new file mode 100644 index 0000000..e4da33a Binary files /dev/null and b/src/views/dashboard2/assets/头部动画.png differ diff --git a/src/views/dashboard2/assets/头部动画.webp b/src/views/dashboard2/assets/头部动画.webp new file mode 100644 index 0000000..9f495a2 Binary files /dev/null and b/src/views/dashboard2/assets/头部动画.webp differ diff --git a/src/views/dashboard2/assets/头部动画2.png b/src/views/dashboard2/assets/头部动画2.png new file mode 100644 index 0000000..f77a134 Binary files /dev/null and b/src/views/dashboard2/assets/头部动画2.png differ diff --git a/src/views/dashboard2/assets/头部动画2.webp b/src/views/dashboard2/assets/头部动画2.webp new file mode 100644 index 0000000..dea3fe4 Binary files /dev/null and b/src/views/dashboard2/assets/头部动画2.webp differ diff --git a/src/views/dashboard2/assets/头部动画_上升粒子-.png b/src/views/dashboard2/assets/头部动画_上升粒子-.png new file mode 100644 index 0000000..27bbc31 Binary files /dev/null and b/src/views/dashboard2/assets/头部动画_上升粒子-.png differ diff --git a/src/views/dashboard2/assets/头部动画_上升粒子.webp b/src/views/dashboard2/assets/头部动画_上升粒子.webp new file mode 100644 index 0000000..afa31e1 Binary files /dev/null and b/src/views/dashboard2/assets/头部动画_上升粒子.webp differ diff --git a/src/views/dashboard2/assets/左边_动画.png b/src/views/dashboard2/assets/左边_动画.png new file mode 100644 index 0000000..349a4d7 Binary files /dev/null and b/src/views/dashboard2/assets/左边_动画.png differ diff --git a/src/views/dashboard2/assets/左边_动画.webp b/src/views/dashboard2/assets/左边_动画.webp new file mode 100644 index 0000000..f459673 Binary files /dev/null and b/src/views/dashboard2/assets/左边_动画.webp differ diff --git a/src/views/dashboard2/assets/左边_闪动点.png b/src/views/dashboard2/assets/左边_闪动点.png new file mode 100644 index 0000000..8fd740f Binary files /dev/null and b/src/views/dashboard2/assets/左边_闪动点.png differ diff --git a/src/views/dashboard2/assets/左边_闪动点.webp b/src/views/dashboard2/assets/左边_闪动点.webp new file mode 100644 index 0000000..4353f57 Binary files /dev/null and b/src/views/dashboard2/assets/左边_闪动点.webp differ diff --git a/src/views/dashboard2/assets/左边_闪动点2.png b/src/views/dashboard2/assets/左边_闪动点2.png new file mode 100644 index 0000000..f198e13 Binary files /dev/null and b/src/views/dashboard2/assets/左边_闪动点2.png differ diff --git a/src/views/dashboard2/assets/左边_闪动点2.webp b/src/views/dashboard2/assets/左边_闪动点2.webp new file mode 100644 index 0000000..aa383c8 Binary files /dev/null and b/src/views/dashboard2/assets/左边_闪动点2.webp differ diff --git a/src/views/dashboard2/assets/底部_动画.png b/src/views/dashboard2/assets/底部_动画.png new file mode 100644 index 0000000..1228a11 Binary files /dev/null and b/src/views/dashboard2/assets/底部_动画.png differ diff --git a/src/views/dashboard2/assets/底部_动画.webp b/src/views/dashboard2/assets/底部_动画.webp new file mode 100644 index 0000000..b303b56 Binary files /dev/null and b/src/views/dashboard2/assets/底部_动画.webp differ diff --git a/src/views/dashboard2/assets/整体边框_静态图片.png b/src/views/dashboard2/assets/整体边框_静态图片.png new file mode 100644 index 0000000..0c8ebf4 Binary files /dev/null and b/src/views/dashboard2/assets/整体边框_静态图片.png differ diff --git a/src/views/dashboard2/assets/背景_静态图片.jpg b/src/views/dashboard2/assets/背景_静态图片.jpg new file mode 100644 index 0000000..d68f83a Binary files /dev/null and b/src/views/dashboard2/assets/背景_静态图片.jpg differ diff --git a/src/views/dashboard2/index.less b/src/views/dashboard2/index.less new file mode 100644 index 0000000..0ff6c62 --- /dev/null +++ b/src/views/dashboard2/index.less @@ -0,0 +1,65 @@ +.dashboard { + width: 2560px; + height: 1080px; + position: relative; + + background-image: url("./assets/整体边框_静态图片.png"), + url("./assets/底部_动画.png"), + url("./assets/底部_动画.webp"), + url("./assets/左边_动画.png"), + url("./assets/左边_动画.webp"), + url("./assets/右侧_动画.png"), + url("./assets/右侧_动画.webp"), + url("./assets/头部动画.png"), + url("./assets/头部动画.webp"), + url("./assets/头部动画2.png"), + url("./assets/头部动画2.webp"), + url("./assets/头部动画_上升粒子-.png"), + url("./assets/头部动画_上升粒子.webp"), + url("./assets/背景_静态图片.jpg"); + + background-repeat: no-repeat; + background-size: auto; + background-position: center, + bottom, bottom, left, + left, right, right, + top, top, top, + top, top, top; + + .header { + position: absolute; + display: flex; + } + + .main { + width: 100%; + height: 100%; + + & > div { + height: 100%; + display: inline-flex; + } + + & > .left { + width: 20%; + display: flex; + flex-direction: column; + + & > :nth-child(1) { + flex-basis: 20%; + } + } + + & > .center { + width: 60%; + background-image: url("./assets/center.png"); + background-size: auto; + background-repeat: no-repeat; + background-position: center; + } + + & > .right { + width: 20%; + } + } +} diff --git a/src/views/dashboard2/index.vue b/src/views/dashboard2/index.vue new file mode 100644 index 0000000..3fe1ff1 --- /dev/null +++ b/src/views/dashboard2/index.vue @@ -0,0 +1,35 @@ + + + + + diff --git a/src/views/dashboard3/assets/bg/Mask group(1).png b/src/views/dashboard3/assets/bg/Mask group(1).png new file mode 100644 index 0000000..6036cfb Binary files /dev/null and b/src/views/dashboard3/assets/bg/Mask group(1).png differ diff --git a/src/views/dashboard3/assets/bg/Mask group.png b/src/views/dashboard3/assets/bg/Mask group.png new file mode 100644 index 0000000..de81a4d Binary files /dev/null and b/src/views/dashboard3/assets/bg/Mask group.png differ diff --git a/src/views/dashboard3/assets/bg/Mask group@2x(1).png b/src/views/dashboard3/assets/bg/Mask group@2x(1).png new file mode 100644 index 0000000..bbe64f1 Binary files /dev/null and b/src/views/dashboard3/assets/bg/Mask group@2x(1).png differ diff --git a/src/views/dashboard3/assets/bg/Mask group@2x.png b/src/views/dashboard3/assets/bg/Mask group@2x.png new file mode 100644 index 0000000..310e87d Binary files /dev/null and b/src/views/dashboard3/assets/bg/Mask group@2x.png differ diff --git a/src/views/dashboard3/assets/bg/Mask group@3x(1).png b/src/views/dashboard3/assets/bg/Mask group@3x(1).png new file mode 100644 index 0000000..2c6da6b Binary files /dev/null and b/src/views/dashboard3/assets/bg/Mask group@3x(1).png differ diff --git a/src/views/dashboard3/assets/bg/Mask group@3x.png b/src/views/dashboard3/assets/bg/Mask group@3x.png new file mode 100644 index 0000000..af706b1 Binary files /dev/null and b/src/views/dashboard3/assets/bg/Mask group@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 18.png b/src/views/dashboard3/assets/icon/Group 18.png new file mode 100644 index 0000000..906284f Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 18.png differ diff --git a/src/views/dashboard3/assets/icon/Group 18@2x.png b/src/views/dashboard3/assets/icon/Group 18@2x.png new file mode 100644 index 0000000..36c68bf Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 18@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 18@3x.png b/src/views/dashboard3/assets/icon/Group 18@3x.png new file mode 100644 index 0000000..91a36d6 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 18@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 19.png b/src/views/dashboard3/assets/icon/Group 19.png new file mode 100644 index 0000000..82d5875 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 19.png differ diff --git a/src/views/dashboard3/assets/icon/Group 19@2x.png b/src/views/dashboard3/assets/icon/Group 19@2x.png new file mode 100644 index 0000000..28eebb9 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 19@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 19@3x.png b/src/views/dashboard3/assets/icon/Group 19@3x.png new file mode 100644 index 0000000..133771f Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 19@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 20.png b/src/views/dashboard3/assets/icon/Group 20.png new file mode 100644 index 0000000..b5df20c Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 20.png differ diff --git a/src/views/dashboard3/assets/icon/Group 20@2x.png b/src/views/dashboard3/assets/icon/Group 20@2x.png new file mode 100644 index 0000000..a429594 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 20@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 20@3x.png b/src/views/dashboard3/assets/icon/Group 20@3x.png new file mode 100644 index 0000000..8ed3219 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 20@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 21.png b/src/views/dashboard3/assets/icon/Group 21.png new file mode 100644 index 0000000..490bf89 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 21.png differ diff --git a/src/views/dashboard3/assets/icon/Group 21@2x.png b/src/views/dashboard3/assets/icon/Group 21@2x.png new file mode 100644 index 0000000..9393265 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 21@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 21@3x.png b/src/views/dashboard3/assets/icon/Group 21@3x.png new file mode 100644 index 0000000..b31a9fe Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 21@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 29.png b/src/views/dashboard3/assets/icon/Group 29.png new file mode 100644 index 0000000..8b113ac Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 29.png differ diff --git a/src/views/dashboard3/assets/icon/Group 29@2x.png b/src/views/dashboard3/assets/icon/Group 29@2x.png new file mode 100644 index 0000000..aafb0d5 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 29@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 29@3x.png b/src/views/dashboard3/assets/icon/Group 29@3x.png new file mode 100644 index 0000000..4835513 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 29@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 36.png b/src/views/dashboard3/assets/icon/Group 36.png new file mode 100644 index 0000000..c30452a Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 36.png differ diff --git a/src/views/dashboard3/assets/icon/Group 36@2x.png b/src/views/dashboard3/assets/icon/Group 36@2x.png new file mode 100644 index 0000000..b1869da Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 36@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 36@3x.png b/src/views/dashboard3/assets/icon/Group 36@3x.png new file mode 100644 index 0000000..5d516c3 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 36@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 37.png b/src/views/dashboard3/assets/icon/Group 37.png new file mode 100644 index 0000000..2d23c7c Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 37.png differ diff --git a/src/views/dashboard3/assets/icon/Group 37@2x.png b/src/views/dashboard3/assets/icon/Group 37@2x.png new file mode 100644 index 0000000..ac01750 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 37@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 37@3x.png b/src/views/dashboard3/assets/icon/Group 37@3x.png new file mode 100644 index 0000000..89bddbd Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 37@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 38.png b/src/views/dashboard3/assets/icon/Group 38.png new file mode 100644 index 0000000..fd62ba6 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 38.png differ diff --git a/src/views/dashboard3/assets/icon/Group 38@2x.png b/src/views/dashboard3/assets/icon/Group 38@2x.png new file mode 100644 index 0000000..25df30a Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 38@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 38@3x.png b/src/views/dashboard3/assets/icon/Group 38@3x.png new file mode 100644 index 0000000..2da4852 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 38@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 39.png b/src/views/dashboard3/assets/icon/Group 39.png new file mode 100644 index 0000000..dc36067 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 39.png differ diff --git a/src/views/dashboard3/assets/icon/Group 39@2x.png b/src/views/dashboard3/assets/icon/Group 39@2x.png new file mode 100644 index 0000000..caa9278 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 39@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 39@3x.png b/src/views/dashboard3/assets/icon/Group 39@3x.png new file mode 100644 index 0000000..40c0165 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 39@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 40.png b/src/views/dashboard3/assets/icon/Group 40.png new file mode 100644 index 0000000..7860dda Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 40.png differ diff --git a/src/views/dashboard3/assets/icon/Group 40@2x.png b/src/views/dashboard3/assets/icon/Group 40@2x.png new file mode 100644 index 0000000..c0ec9eb Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 40@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Group 40@3x.png b/src/views/dashboard3/assets/icon/Group 40@3x.png new file mode 100644 index 0000000..31f30b9 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Group 40@3x.png differ diff --git a/src/views/dashboard3/assets/icon/Vector.png b/src/views/dashboard3/assets/icon/Vector.png new file mode 100644 index 0000000..c3e09e7 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Vector.png differ diff --git a/src/views/dashboard3/assets/icon/Vector2.png b/src/views/dashboard3/assets/icon/Vector2.png new file mode 100644 index 0000000..a6de4f2 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Vector2.png differ diff --git a/src/views/dashboard3/assets/icon/Vector@2x.png b/src/views/dashboard3/assets/icon/Vector@2x.png new file mode 100644 index 0000000..ee65218 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Vector@2x.png differ diff --git a/src/views/dashboard3/assets/icon/Vector@3x.png b/src/views/dashboard3/assets/icon/Vector@3x.png new file mode 100644 index 0000000..c82bf34 Binary files /dev/null and b/src/views/dashboard3/assets/icon/Vector@3x.png differ diff --git a/src/views/dashboard3/assets/vue.svg b/src/views/dashboard3/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/views/dashboard3/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/views/dashboard3/components/chart/index.less b/src/views/dashboard3/components/chart/index.less new file mode 100644 index 0000000..2534017 --- /dev/null +++ b/src/views/dashboard3/components/chart/index.less @@ -0,0 +1,36 @@ +.chart { + width: 200px; + height: 200px; + border-radius: 50%; + background-color: #6C71F0; + font-size: 18px; + color: #fff; + position: relative; + + .scale__ul { + list-style: none; + + .scale__li { + position: absolute; + left: 50%; + top: 50%; + transform-origin: left top; + width: 16px; + height: 10px; + border-radius: 2px; + background-color: rgba(149, 152, 241, .8); + + &--active { + background-color: #68CE67; + } + + &--long { + width: 22px; + } + } + } + + .name { + transform: translateY(150px); + } +} diff --git a/src/views/dashboard3/components/chart/index.tsx b/src/views/dashboard3/components/chart/index.tsx new file mode 100644 index 0000000..965401e --- /dev/null +++ b/src/views/dashboard3/components/chart/index.tsx @@ -0,0 +1,26 @@ +import {defineComponent} from "vue"; +import "./index.less" + +const longIndex = [0, 6, 12]; +export default defineComponent({ + name: "Chart", + props: {}, + setup(props) { + return () => ( +
+
    + { + Array.from({length: 13}).map((_, index) => { + const long = longIndex.includes(index); + return
  • 5}]} + style={{transform: `rotate(-${15 * index}deg) translate(${long ? 59 : 65}px,-50%)`}} + key={index}>
  • + }) + } +
+
xx
+
+ ); + }, +}); diff --git a/src/views/dashboard3/index.less b/src/views/dashboard3/index.less new file mode 100644 index 0000000..f3eb110 --- /dev/null +++ b/src/views/dashboard3/index.less @@ -0,0 +1,244 @@ +.panel { + width: 1920px; + height: 1080px; + position: relative; + background-color: rgba(198, 198, 227, 0.3); + + .panel__title { + color: rgba(44, 46, 102, 1); + font-size: 56px; + position: absolute; + left: 57px; + top: 53px; + width: 605px; + height: 78px; + } + + .bg__circle { + position: absolute; + width: 1341px; + height: 100%; + background-image: url("./assets/bg/Mask group.png"); + background-repeat: no-repeat; + left: 579px; + } + + .bg__arrow { + position: absolute; + width: 1293px; + height: 100%; + background-image: url("./assets/bg/Mask group(1).png"); + background-repeat: no-repeat; + left: 0; + } + + .box-group { + position: absolute; + top: 170px; + display: flex; + flex-direction: column; + gap: 37px; + left: 56px; + + & > .box { + width: 409px; + height: 149px; + background-color: #6C71F0; + border-radius: 20px; + display: flex; + color: #fff; + font-size: 20px; + text-align: left; + + & > div { + height: auto; + } + + & > .left, .right { + flex: 1; + margin-top: 21px; + display: flex; + flex-direction: column; + gap: 13px; + text-indent: 21px; + + & > div { + height: 28px; + } + } + + .right { + .score { + display: flex; + gap: 8px; + padding-left: 21px; + align-items: center; + + & > div { + width: 20px; + height: 20px; + } + + & > div:nth-child(-n + 5) { + background-image: url("./assets/icon/Vector.png"); + background-position: center; + background-size: 100% 100%; + + &.active { + background-image: url("./assets/icon/Vector2.png"); + } + } + + & > div:last-of-type { + padding-left: 7px; + text-indent: 0; + width: 12px; + height: 28px; + } + } + } + + .middle { + margin: 15px 0; + width: 1px; + background-color: #FFFFFF; + border-radius: 20px; + } + } + } + + .chart-group { + position: absolute; + right: 54px; + top: 176px; + display: flex; + gap: 46px; + text-align: center; + font-weight: 600; + + & .chart { + width: 200px; + height: 200px; + + &__low { + background-image: url("./assets/icon/Group 40.png"); + } + + &__middle { + background-image: url("./assets/icon/Group 38.png"); + } + + &__high { + background-image: url("./assets/icon/Group 39.png"); + } + + & .desc { + color: rgba(255, 255, 255, 1); + font-size: 18px; + transform: translateY(150px); + height: 25px; + line-height: 21px; + } + } + + & .value { + color: rgba(44, 46, 102, 1); + font-size: 32px; + margin-top: 14px; + } + } + + .icon-group { + + &__small { + display: flex; + flex-direction: column; + gap: 100px; + position: absolute; + left: 518px; + top: 227px; + + & > div { + display: flex; + gap: 64px; + + & > i { + width: 80px; + height: 80px; + + &:nth-of-type(1) { + background-image: url("./assets/icon/Group 29.png"); + } + + &:nth-of-type(2) { + background-image: url("./assets/icon/Group 36.png"); + } + + &:nth-of-type(3) { + background-image: url("./assets/icon/Group 37.png"); + } + } + } + } + + &__large { + display: flex; + gap: 62px; + position: absolute; + right: 45px; + top: 579px; + + & > i { + width: 110px; + height: 110px; + + &:nth-of-type(1) { + background-image: url("./assets/icon/Group 21.png"); + } + + &:nth-of-type(2) { + background-image: url("./assets/icon/Group 20.png"); + } + + &:nth-of-type(3) { + background-image: url("./assets/icon/Group 19.png"); + } + + &:nth-of-type(4) { + background-image: url("./assets/icon/Group 18.png"); + } + } + } + + } + + .flow-svg { + height: 100%; + width: 100%; + + & text { + font-size: 16px; + fill: rgba(44, 46, 102, 1); + } + + & polyline { + stroke: #ccc; + stroke-width: 2px; + fill: none; + } + + & circle { + fill: rgba(63, 188, 107, 1); + filter: drop-shadow(0px 0px 3px rgba(63, 188, 107, 0.5)); + } + + .rotate-text, .merge-text { + & text { + fill: rgba(44, 46, 102, 1); + font-size: 20px; + font-weight: 500; + line-height: 23px; + } + } + } +} diff --git a/src/views/dashboard3/index.vue b/src/views/dashboard3/index.vue new file mode 100644 index 0000000..d3da2dc --- /dev/null +++ b/src/views/dashboard3/index.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts new file mode 100644 index 0000000..c6d9bef --- /dev/null +++ b/src/vite-env.d.ts @@ -0,0 +1,8 @@ +/// +/// + +declare module "*.vue" { + import { DefineComponent } from "vue"; + const component: DefineComponent<{}, {}, any>; + export default component; +} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..72732dc --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "target": "ESNext", + "useDefineForClassFields": true, + "module": "ESNext", + "moduleResolution": "Node", + "strict": true, + "jsx": "preserve", + "resolveJsonModule": true, + "isolatedModules": true, + "esModuleInterop": true, + "lib": ["ESNext", "DOM"], + "skipLibCheck": true, + "noEmit": true, + "baseUrl": "./", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/vite.config.ts b/vite.config.ts new file mode 100644 index 0000000..b9e2f02 --- /dev/null +++ b/vite.config.ts @@ -0,0 +1,15 @@ +import {defineConfig} from "vite"; +import vue from "@vitejs/plugin-vue"; +import vueJsx from "@vitejs/plugin-vue-jsx"; +import path from "path"; + +// https://vitejs.dev/config/ +export default defineConfig({ + base: "./", + plugins: [vue(), vueJsx()], + resolve: { + alias: { + "@": path.resolve(__dirname, "./src"), + }, + }, +});