commit d661fb475221eaff17a01a66d26ab2bc2d401273 Author: paituo <330435863@qq.com> Date: Fri Jul 25 23:03:30 2025 +0800 首次提交 diff --git a/.env b/.env new file mode 100644 index 0000000..e69de29 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +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/README.md b/README.md new file mode 100644 index 0000000..1511959 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9ba85e5 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3648 @@ +{ + "name": "ca-lock-client", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ca-lock-client", + "version": "0.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "async-mutex": "^0.5.0", + "asynckit": "^0.4.0", + "axios": "^1.6.8", + "child_process": "^1.0.2", + "combined-stream": "^1.0.8", + "dayjs": "^1.11.13", + "dayjs-plugin-utc": "^0.1.2", + "delayed-stream": "^1.0.0", + "dotenv": "^16.4.5", + "electron-log": "^5.2.0", + "electron-store": "^10.0.0", + "element-plus": "^2.10.4", + "execa": "^8.0.1", + "express": "^4.20.0", + "fs": "^0.0.1-security", + "fs-extra": "^11.2.0", + "iconv-lite": "^0.6.3", + "ini": "^5.0.0", + "keytar": "^7.9.0", + "mitt": "^3.0.1", + "node-shutdown": "^1.0.9", + "pinia": "^2.1.7", + "proxy-from-env": "^1.1.0", + "qs": "^6.12.1", + "vue": "^3.4.24", + "vue-router": "^4.4.2", + "vue3-ast-decompiler": "^1.0.4", + "vuex": "^4.0.2", + "ws": "^8.18.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.0", + "vite": "^7.0.4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.2", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.25.8.tgz", + "integrity": "sha512-urAvrUedIqEiFR3FYSLTWQgLu5tb+m0qZw0NBEasUeo6wuqatkMDaRT+1uABiGXEu5vqgPd7FGE1BhsAIy9QVA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.25.8.tgz", + "integrity": "sha512-RONsAvGCz5oWyePVnLdZY/HHwA++nxYWIX1atInlaW6SEkwq6XkP3+cb825EUcRs5Vss/lGh/2YxAb5xqc07Uw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.25.8.tgz", + "integrity": "sha512-OD3p7LYzWpLhZEyATcTSJ67qB5D+20vbtr6vHlHWSQYhKtzUYrETuWThmzFpZtFsBIxRvhO07+UgVA9m0i/O1w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.25.8.tgz", + "integrity": "sha512-yJAVPklM5+4+9dTeKwHOaA+LQkmrKFX96BM0A/2zQrbS6ENCmxc4OVoBs5dPkCCak2roAD+jKCdnmOqKszPkjA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.25.8.tgz", + "integrity": "sha512-Jw0mxgIaYX6R8ODrdkLLPwBqHTtYHJSmzzd+QeytSugzQ0Vg4c5rDky5VgkoowbZQahCbsv1rT1KW72MPIkevw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.25.8.tgz", + "integrity": "sha512-Vh2gLxxHnuoQ+GjPNvDSDRpoBCUzY4Pu0kBqMBDlK4fuWbKgGtmDIeEC081xi26PPjn+1tct+Bh8FjyLlw1Zlg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.8.tgz", + "integrity": "sha512-YPJ7hDQ9DnNe5vxOm6jaie9QsTwcKedPvizTVlqWG9GBSq+BuyWEDazlGaDTC5NGU4QJd666V0yqCBL2oWKPfA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.25.8.tgz", + "integrity": "sha512-MmaEXxQRdXNFsRN/KcIimLnSJrk2r5H8v+WVafRWz5xdSVmWLoITZQXcgehI2ZE6gioE6HirAEToM/RvFBeuhw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.25.8.tgz", + "integrity": "sha512-FuzEP9BixzZohl1kLf76KEVOsxtIBFwCaLupVuk4eFVnOZfU+Wsn+x5Ryam7nILV2pkq2TqQM9EZPsOBuMC+kg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.25.8.tgz", + "integrity": "sha512-WIgg00ARWv/uYLU7lsuDK00d/hHSfES5BzdWAdAig1ioV5kaFNrtK8EqGcUBJhYqotlUByUKz5Qo6u8tt7iD/w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.25.8.tgz", + "integrity": "sha512-A1D9YzRX1i+1AJZuFFUMP1E9fMaYY+GnSQil9Tlw05utlE86EKTUA7RjwHDkEitmLYiFsRd9HwKBPEftNdBfjg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.25.8.tgz", + "integrity": "sha512-O7k1J/dwHkY1RMVvglFHl1HzutGEFFZ3kNiDMSOyUrB7WcoHGf96Sh+64nTRT26l3GMbCW01Ekh/ThKM5iI7hQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.25.8.tgz", + "integrity": "sha512-uv+dqfRazte3BzfMp8PAQXmdGHQt2oC/y2ovwpTteqrMx2lwaksiFZ/bdkXJC19ttTvNXBuWH53zy/aTj1FgGw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.25.8.tgz", + "integrity": "sha512-GyG0KcMi1GBavP5JgAkkstMGyMholMDybAf8wF5A70CALlDM2p/f7YFE7H92eDeH/VBtFJA5MT4nRPDGg4JuzQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.25.8.tgz", + "integrity": "sha512-rAqDYFv3yzMrq7GIcen3XP7TUEG/4LK86LUPMIz6RT8A6pRIDn0sDcvjudVZBiiTcZCY9y2SgYX2lgK3AF+1eg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.25.8.tgz", + "integrity": "sha512-Xutvh6VjlbcHpsIIbwY8GVRbwoviWT19tFhgdA7DlenLGC/mbc3lBoVb7jxj9Z+eyGqvcnSyIltYUrkKzWqSvg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.25.8.tgz", + "integrity": "sha512-ASFQhgY4ElXh3nDcOMTkQero4b1lgubskNlhIfJrsH5OKZXDpUAKBlNS0Kx81jwOBp+HCeZqmoJuihTv57/jvQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.8.tgz", + "integrity": "sha512-d1KfruIeohqAi6SA+gENMuObDbEjn22olAR7egqnkCD9DGBG0wsEARotkLgXDu6c4ncgWTZJtN5vcgxzWRMzcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.25.8.tgz", + "integrity": "sha512-nVDCkrvx2ua+XQNyfrujIG38+YGyuy2Ru9kKVNyh5jAys6n+l44tTtToqHjino2My8VAY6Lw9H7RI73XFi66Cg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.8.tgz", + "integrity": "sha512-j8HgrDuSJFAujkivSMSfPQSAa5Fxbvk4rgNAS5i3K+r8s1X0p1uOO2Hl2xNsGFppOeHOLAVgYwDVlmxhq5h+SQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.25.8.tgz", + "integrity": "sha512-1h8MUAwa0VhNCDp6Af0HToI2TJFAn1uqT9Al6DJVzdIBAd21m/G0Yfc77KDM3uF3T/YaOgQq3qTJHPbTOInaIQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.8.tgz", + "integrity": "sha512-r2nVa5SIK9tSWd0kJd9HCffnDHKchTGikb//9c7HX+r+wHYCpQrSgxhlY6KWV1nFo1l4KFbsMlHk+L6fekLsUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.25.8.tgz", + "integrity": "sha512-zUlaP2S12YhQ2UzUfcCuMDHQFJyKABkAjvO5YSndMiIkMimPmxA+BYSBikWgsRpvyxuRnow4nS5NPnf9fpv41w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.25.8.tgz", + "integrity": "sha512-YEGFFWESlPva8hGL+zvj2z/SaK+pH0SwOM0Nc/d+rVnW7GSTFlLBGzZkuSU9kFIGIo8q9X3ucpZhu8PDN5A2sQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.25.8.tgz", + "integrity": "sha512-hiGgGC6KZ5LZz58OL/+qVVoZiuZlUYlYHNAmczOm7bs2oE1XriPFi5ZHHrS8ACpV5EjySrnoCKmcbQMN+ojnHg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.25.8.tgz", + "integrity": "sha512-cn3Yr7+OaaZq1c+2pe+8yxC8E144SReCQjN6/2ynubzYjvyqZjTXfQJpAcQpsdJq3My7XADANiYGHoFC69pLQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.7.2.tgz", + "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.2", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.4", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.7", + "resolved": "https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz", + "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.19", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.19.tgz", + "integrity": "sha512-3FL3mnMbPu0muGOCaKAhhFEYmqv9eTfPSJRJmANrCwtgK8VuxpsZDGK+m0LYAGoyO8+0j5uRe4PeyPDK1yA/hA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.45.1.tgz", + "integrity": "sha512-NEySIFvMY0ZQO+utJkgoMiCAjMrGvnbDLHvcmlA33UXJpYBCvlBEbMMtV837uCkS+plG2umfhn0T5mMAxGrlRA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.45.1.tgz", + "integrity": "sha512-ujQ+sMXJkg4LRJaYreaVx7Z/VMgBBd89wGS4qMrdtfUFZ+TSY5Rs9asgjitLwzeIbhwdEhyj29zhst3L1lKsRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.45.1.tgz", + "integrity": "sha512-FSncqHvqTm3lC6Y13xncsdOYfxGSLnP+73k815EfNmpewPs+EyM49haPS105Rh4aF5mJKywk9X0ogzLXZzN9lA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.45.1.tgz", + "integrity": "sha512-2/vVn/husP5XI7Fsf/RlhDaQJ7x9zjvC81anIVbr4b/f0xtSmXQTFcGIQ/B1cXIYM6h2nAhJkdMHTnD7OtQ9Og==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.45.1.tgz", + "integrity": "sha512-4g1kaDxQItZsrkVTdYQ0bxu4ZIQ32cotoQbmsAnW1jAE4XCMbcBPDirX5fyUzdhVCKgPcrwWuucI8yrVRBw2+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.45.1.tgz", + "integrity": "sha512-L/6JsfiL74i3uK1Ti2ZFSNsp5NMiM4/kbbGEcOCps99aZx3g8SJMO1/9Y0n/qKlWZfn6sScf98lEOUe2mBvW9A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.45.1.tgz", + "integrity": "sha512-RkdOTu2jK7brlu+ZwjMIZfdV2sSYHK2qR08FUWcIoqJC2eywHbXr0L8T/pONFwkGukQqERDheaGTeedG+rra6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.45.1.tgz", + "integrity": "sha512-3kJ8pgfBt6CIIr1o+HQA7OZ9mp/zDk3ctekGl9qn/pRBgrRgfwiffaUmqioUGN9hv0OHv2gxmvdKOkARCtRb8Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.45.1.tgz", + "integrity": "sha512-k3dOKCfIVixWjG7OXTCOmDfJj3vbdhN0QYEqB+OuGArOChek22hn7Uy5A/gTDNAcCy5v2YcXRJ/Qcnm4/ma1xw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.45.1.tgz", + "integrity": "sha512-PmI1vxQetnM58ZmDFl9/Uk2lpBBby6B6rF4muJc65uZbxCs0EA7hhKCk2PKlmZKuyVSHAyIw3+/SiuMLxKxWog==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.45.1.tgz", + "integrity": "sha512-9UmI0VzGmNJ28ibHW2GpE2nF0PBQqsyiS4kcJ5vK+wuwGnV5RlqdczVocDSUfGX/Na7/XINRVoUgJyFIgipoRg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.45.1.tgz", + "integrity": "sha512-7nR2KY8oEOUTD3pBAxIBBbZr0U7U+R9HDTPNy+5nVVHDXI4ikYniH1oxQz9VoB5PbBU1CZuDGHkLJkd3zLMWsg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.45.1.tgz", + "integrity": "sha512-nlcl3jgUultKROfZijKjRQLUu9Ma0PeNv/VFHkZiKbXTBQXhpytS8CIj5/NfBeECZtY2FJQubm6ltIxm/ftxpw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.45.1.tgz", + "integrity": "sha512-HJV65KLS51rW0VY6rvZkiieiBnurSzpzore1bMKAhunQiECPuxsROvyeaot/tcK3A3aGnI+qTHqisrpSgQrpgA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.45.1.tgz", + "integrity": "sha512-NITBOCv3Qqc6hhwFt7jLV78VEO/il4YcBzoMGGNxznLgRQf43VQDae0aAzKiBeEPIxnDrACiMgbqjuihx08OOw==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.45.1.tgz", + "integrity": "sha512-+E/lYl6qu1zqgPEnTrs4WysQtvc/Sh4fC2nByfFExqgYrqkKWp1tWIbe+ELhixnenSpBbLXNi6vbEEJ8M7fiHw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.45.1.tgz", + "integrity": "sha512-a6WIAp89p3kpNoYStITT9RbTbTnqarU7D8N8F2CV+4Cl9fwCOZraLVuVFvlpsW0SbIiYtEnhCZBPLoNdRkjQFw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.45.1.tgz", + "integrity": "sha512-T5Bi/NS3fQiJeYdGvRpTAP5P02kqSOpqiopwhj0uaXB6nzs5JVi2XMJb18JUSKhCOX8+UE1UKQufyD6Or48dJg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.45.1.tgz", + "integrity": "sha512-lxV2Pako3ujjuUe9jiU3/s7KSrDfH6IgTSQOnDWr9aJ92YsFd7EurmClK0ly/t8dzMkDtd04g60WX6yl0sGfdw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.45.1.tgz", + "integrity": "sha512-M/fKi4sasCdM8i0aWJjCSFm2qEnYRR8AMLG2kxp6wD13+tMGA4Z1tVAuHkNRjud5SW2EM3naLuK35w9twvf6aA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-H3MHACvFUEiujabxhaI/ImO6gUrd8oOurg7LQtS7mbwIXA/cUqWrvBsaeJ23aZEPk1TAYkurjfMbSELfoCXlGA==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.0.tgz", + "integrity": "sha512-iAliE72WsdhjzTOp2DtvKThq1VBC4REhwRcaA+zPAAph6I+OQhUXv+Xu2KS7ElxYtb7Zc/3R30Hwv1DxEo7NXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.19" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.18.tgz", + "integrity": "sha512-3slwjQrrV1TO8MoXgy3aynDQ7lslj5UqDxuHnrzHtpON5CBinhWjJETciPngpin/T3OuW3tXUf86tEurusnztw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/shared": "3.5.18", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.18.tgz", + "integrity": "sha512-RMbU6NTU70++B1JyVJbNbeFkK+A+Q7y9XKE2EM4NLGm2WFR8x9MbAtWxPPLdm0wUkuZv9trpwfSlL6tjdIa1+A==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.18.tgz", + "integrity": "sha512-5aBjvGqsWs+MoxswZPoTB9nSDb3dhd1x30xrrltKujlCxo48j8HGDNj3QPhF4VIS0VQDUrA1xUfp2hEa+FNyXA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.0", + "@vue/compiler-core": "3.5.18", + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.17", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.18.tgz", + "integrity": "sha512-xM16Ak7rSWHkM3m22NlmcdIM+K4BMyFARAfV9hYFl+SFuRzrZ3uGMNW05kA5pmeMa0X9X963Kgou7ufdbpOP9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/reactivity": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.18.tgz", + "integrity": "sha512-x0vPO5Imw+3sChLM5Y+B6G1zPjwdOri9e8V21NnTnlEvkxatHEH5B5KEAJcjuzQ7BsjGrKtfzuQ5eQwXh8HXBg==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.18.tgz", + "integrity": "sha512-DUpHa1HpeOQEt6+3nheUfqVXRog2kivkXHUhoqJiKR33SO4x+a5uNOMkV487WPerQkL0vUuRvq/7JhRgLW3S+w==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/shared": "3.5.18" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.18.tgz", + "integrity": "sha512-YwDj71iV05j4RnzZnZtGaXwPoUWeRsqinblgVJwR8XTXYZ9D5PbahHQgsbmzUvCWNF6x7siQ89HgnX5eWkr3mw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.18", + "@vue/runtime-core": "3.5.18", + "@vue/shared": "3.5.18", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.18.tgz", + "integrity": "sha512-PvIHLUoWgSbDG7zLHqSqaCoZvHi6NNmfVFOqO+OnwvqMz/tqQr3FuGWS8ufluNddk7ZLBJYMrjcw1c6XzR12mA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "vue": "3.5.18" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.18.tgz", + "integrity": "sha512-cZy8Dq+uuIXbxCZpuLd2GJdeSO/lIzIspC2WtkqIpje5QyFbvLaI5wZtdUjLHjGZrlVX6GilejatWwVYYRc8tA==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "license": "MIT", + "dependencies": { + "vue-demi": "*" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/ajv-formats/-/ajv-formats-3.0.1.tgz", + "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, + "node_modules/async-mutex": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/async-mutex/-/async-mutex-0.5.0.tgz", + "integrity": "sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/atomically": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/atomically/-/atomically-2.0.3.tgz", + "integrity": "sha512-kU6FmrwZ3Lx7/7y3hPS5QnbJfaohcIul5fGqf7ok+4KklIEk9tJ0C2IQPdacSbVUWv6zVHXEBWoWd6NrVMT7Cw==", + "dependencies": { + "stubborn-fs": "^1.2.5", + "when-exit": "^2.1.1" + } + }, + "node_modules/axios": { + "version": "1.11.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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": "MIT" + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "license": "MIT" + }, + "node_modules/body-parser": { + "version": "1.20.3", + "resolved": "https://registry.npmmirror.com/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.13.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/body-parser/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "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": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/child_process": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/child_process/-/child_process-1.0.2.tgz", + "integrity": "sha512-Wmza/JzL0SiWz7kl6MhIKT5ceIlnFPJX+lwUGj7Clhy5MMldsSoJR0+uvRzOS5Kv45Mq7t1PoE8TsOA9bzvb6g==", + "license": "ISC" + }, + "node_modules/chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "license": "ISC" + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/conf": { + "version": "14.0.0", + "resolved": "https://registry.npmmirror.com/conf/-/conf-14.0.0.tgz", + "integrity": "sha512-L6BuueHTRuJHQvQVc6YXYZRtN5vJUtOdCTLn0tRYYV5azfbAFcPghB5zEE40mVrV6w7slMTqUfkDomutIK14fw==", + "license": "MIT", + "dependencies": { + "ajv": "^8.17.1", + "ajv-formats": "^3.0.1", + "atomically": "^2.0.3", + "debounce-fn": "^6.0.0", + "dot-prop": "^9.0.0", + "env-paths": "^3.0.0", + "json-schema-typed": "^8.0.1", + "semver": "^7.7.2", + "uint8array-extras": "^1.4.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/connected-domain": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/connected-domain/-/connected-domain-1.0.0.tgz", + "integrity": "sha512-lHlohUiJxlpunvDag2Y0pO20bnvarMjnrdciZeuJUqRwrf/5JHNhdpiPIr5GQ8IkqrFj5TDMQwcCjblGo1oeuA==", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmmirror.com/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.13", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz", + "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", + "license": "MIT" + }, + "node_modules/dayjs-plugin-utc": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/dayjs-plugin-utc/-/dayjs-plugin-utc-0.1.2.tgz", + "integrity": "sha512-ExERH5o3oo6jFOdkvMP3gytTCQ9Ksi5PtylclJWghr7k7m3o2U5QrwtdiJkOxLOH4ghr0EKhpqGefzGz1VvVJg==", + "license": "MIT" + }, + "node_modules/debounce-fn": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/debounce-fn/-/debounce-fn-6.0.0.tgz", + "integrity": "sha512-rBMW+F2TXryBwB54Q0d8drNEI+TfoS9JpNTAoVpukbWEhjXQq4rySFYLaqXMFXwdv61Zb2OHtj5bviSoimqxRQ==", + "license": "MIT", + "dependencies": { + "mimic-function": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-libc": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.4.tgz", + "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/dot-prop": { + "version": "9.0.0", + "resolved": "https://registry.npmmirror.com/dot-prop/-/dot-prop-9.0.0.tgz", + "integrity": "sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==", + "license": "MIT", + "dependencies": { + "type-fest": "^4.18.2" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmmirror.com/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" + }, + "node_modules/electron-log": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/electron-log/-/electron-log-5.4.1.tgz", + "integrity": "sha512-QvisA18Z++8E3Th0zmhUelys9dEv7aIeXJlbFw3UrxCc8H9qSRW0j8/ooTef/EtHui8tVmbKSL+EIQzP9GoRLg==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/electron-store": { + "version": "10.1.0", + "resolved": "https://registry.npmmirror.com/electron-store/-/electron-store-10.1.0.tgz", + "integrity": "sha512-oL8bRy7pVCLpwhmXy05Rh/L6O93+k9t6dqSw0+MckIc3OmCTZm6Mp04Q4f/J0rtu84Ky6ywkR8ivtGOmrq+16w==", + "license": "MIT", + "dependencies": { + "conf": "^14.0.0", + "type-fest": "^4.41.0" + }, + "engines": { + "node": ">=20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/element-plus": { + "version": "2.10.4", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.10.4.tgz", + "integrity": "sha512-UD4elWHrCnp1xlPhbXmVcaKFLCRaRAY6WWRwemGfGW3ceIjXm9fSYc9RNH3AiOEA6Ds1p9ZvhCs76CR9J8Vd+A==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.13", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.5", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.5.tgz", + "integrity": "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/env-paths/-/env-paths-3.0.0.tgz", + "integrity": "sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.8", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.25.8.tgz", + "integrity": "sha512-vVC0USHGtMi8+R4Kz8rt6JhEWLxsv9Rnu/lGYbPR8u47B+DCBksq9JarW0zOO7bs37hyOK1l2/oqtbciutL5+Q==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.8", + "@esbuild/android-arm": "0.25.8", + "@esbuild/android-arm64": "0.25.8", + "@esbuild/android-x64": "0.25.8", + "@esbuild/darwin-arm64": "0.25.8", + "@esbuild/darwin-x64": "0.25.8", + "@esbuild/freebsd-arm64": "0.25.8", + "@esbuild/freebsd-x64": "0.25.8", + "@esbuild/linux-arm": "0.25.8", + "@esbuild/linux-arm64": "0.25.8", + "@esbuild/linux-ia32": "0.25.8", + "@esbuild/linux-loong64": "0.25.8", + "@esbuild/linux-mips64el": "0.25.8", + "@esbuild/linux-ppc64": "0.25.8", + "@esbuild/linux-riscv64": "0.25.8", + "@esbuild/linux-s390x": "0.25.8", + "@esbuild/linux-x64": "0.25.8", + "@esbuild/netbsd-arm64": "0.25.8", + "@esbuild/netbsd-x64": "0.25.8", + "@esbuild/openbsd-arm64": "0.25.8", + "@esbuild/openbsd-x64": "0.25.8", + "@esbuild/openharmony-arm64": "0.25.8", + "@esbuild/sunos-x64": "0.25.8", + "@esbuild/win32-arm64": "0.25.8", + "@esbuild/win32-ia32": "0.25.8", + "@esbuild/win32-x64": "0.25.8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", + "license": "MIT" + }, + "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/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", + "license": "(MIT OR WTFPL)", + "engines": { + "node": ">=6" + } + }, + "node_modules/express": { + "version": "4.21.2", + "resolved": "https://registry.npmmirror.com/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.3", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.7.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.3.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.3", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.12", + "proxy-addr": "~2.0.7", + "qs": "6.13.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.19.0", + "serve-static": "1.16.2", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/express/node_modules/qs": { + "version": "6.13.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.6" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmmirror.com/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs": { + "version": "0.0.1-security", + "resolved": "https://registry.npmmirror.com/fs/-/fs-0.0.1-security.tgz", + "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==", + "license": "ISC" + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", + "license": "MIT" + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "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/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "license": "ISC" + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "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==", + "license": "MIT", + "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/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/ini": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/ini/-/ini-5.0.0.tgz", + "integrity": "sha512-+N0ngpO3e7cRUWOJAS7qw0IZIVc6XPrW4MlFBdD066F2L4k1L6ker3hLqSq7iXxU5tgS4WGkIUElWn5vogAEnw==", + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/json-schema-typed": { + "version": "8.0.1", + "resolved": "https://registry.npmmirror.com/json-schema-typed/-/json-schema-typed-8.0.1.tgz", + "integrity": "sha512-XQmWYj2Sm4kn4WeTYvmpKEbyPsL7nBsb647c7pMe6l02/yx2+Jfc4dT6UZkEXnIUb5LhD55r2HPsJ1milQ4rDg==", + "license": "BSD-2-Clause" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keytar": { + "version": "7.9.0", + "resolved": "https://registry.npmmirror.com/keytar/-/keytar-7.9.0.tgz", + "integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==", + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "node-addon-api": "^4.3.0", + "prebuild-install": "^7.0.1" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "license": "MIT" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-function": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/mimic-function/-/mimic-function-5.0.1.tgz", + "integrity": "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, + "node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "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/napi-build-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/napi-build-utils/-/napi-build-utils-2.0.0.tgz", + "integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==", + "license": "MIT" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/node-abi": { + "version": "3.75.0", + "resolved": "https://registry.npmmirror.com/node-abi/-/node-abi-3.75.0.tgz", + "integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/node-addon-api": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-4.3.0.tgz", + "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", + "license": "MIT" + }, + "node_modules/node-shutdown": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/node-shutdown/-/node-shutdown-1.0.9.tgz", + "integrity": "sha512-VtF2t7dL3xPx39jqTAt8keST5FhhoNB3Ni+XgYwGztTmdhvkIAfv3iurV2q1/SbMh7xFxBCs3AG0stGXVLbHJA==", + "license": "Apache 2.0", + "dependencies": { + "bluebird": "^3.5.0", + "ps-node": "^0.1.6" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/object-inspect": { + "version": "1.13.4", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-to-regexp": { + "version": "0.1.12", + "resolved": "https://registry.npmmirror.com/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" + }, + "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": "4.0.3", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.3.1.tgz", + "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prebuild-install": { + "version": "7.1.3", + "resolved": "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.3.tgz", + "integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==", + "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^2.0.0", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "bin": { + "prebuild-install": "bin.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/ps-node": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/ps-node/-/ps-node-0.1.6.tgz", + "integrity": "sha512-w7QJhUTbu70hpDso0YXDRNKCPNuchV8UTUZsAv0m7Qj5g85oHOJfr9drA1EjvK4nQK/bG8P97W4L6PJ3IQLoOA==", + "license": "MIT", + "dependencies": { + "table-parser": "^0.1.3" + } + }, + "node_modules/pump": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.3.tgz", + "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/qs": { + "version": "6.14.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "license": "ISC" + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.45.1", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.45.1.tgz", + "integrity": "sha512-4iya7Jb76fVpQyLoiVpzUrsjQ12r3dM7fIVz+4NwoYvZOShknRmiv+iu9CClZml5ZLGb0XMcYLutK6w9tgxHDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.45.1", + "@rollup/rollup-android-arm64": "4.45.1", + "@rollup/rollup-darwin-arm64": "4.45.1", + "@rollup/rollup-darwin-x64": "4.45.1", + "@rollup/rollup-freebsd-arm64": "4.45.1", + "@rollup/rollup-freebsd-x64": "4.45.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.45.1", + "@rollup/rollup-linux-arm-musleabihf": "4.45.1", + "@rollup/rollup-linux-arm64-gnu": "4.45.1", + "@rollup/rollup-linux-arm64-musl": "4.45.1", + "@rollup/rollup-linux-loongarch64-gnu": "4.45.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-gnu": "4.45.1", + "@rollup/rollup-linux-riscv64-musl": "4.45.1", + "@rollup/rollup-linux-s390x-gnu": "4.45.1", + "@rollup/rollup-linux-x64-gnu": "4.45.1", + "@rollup/rollup-linux-x64-musl": "4.45.1", + "@rollup/rollup-win32-arm64-msvc": "4.45.1", + "@rollup/rollup-win32-ia32-msvc": "4.45.1", + "@rollup/rollup-win32-x64-msvc": "4.45.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "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": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.19.0", + "resolved": "https://registry.npmmirror.com/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/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==", + "license": "MIT" + }, + "node_modules/serve-static": { + "version": "1.16.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", + "dependencies": { + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.19.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/simple-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/simple-concat/-/simple-concat-1.0.1.tgz", + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", + "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": "MIT" + }, + "node_modules/simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "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": "MIT", + "dependencies": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.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/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stubborn-fs": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/stubborn-fs/-/stubborn-fs-1.2.5.tgz", + "integrity": "sha512-H2N9c26eXjzL/S/K+i/RHHcFanE74dptvvjM8iwzwbVcWY/zjBbgRqF3K0DY4+OD+uTTASTBvDoxPDaPN02D7g==" + }, + "node_modules/table-parser": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/table-parser/-/table-parser-0.1.3.tgz", + "integrity": "sha512-LCYeuvqqoPII3lzzYaXKbC3Forb+d2u4bNwhk/9FlivuGRxPE28YEWAYcujeSlLLDlMfvy29+WPybFJZFiKMYg==", + "license": "MIT", + "dependencies": { + "connected-domain": "^1.0.0" + } + }, + "node_modules/tar-fs": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.3.tgz", + "integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==", + "license": "MIT", + "dependencies": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "node_modules/tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-fest": { + "version": "4.41.0", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-4.41.0.tgz", + "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmmirror.com/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/uint8array-extras": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/uint8array-extras/-/uint8array-extras-1.4.0.tgz", + "integrity": "sha512-ZPtzy0hu4cZjv3z5NW9gfKnNLjoz4y6uv4HlelAjDK7sY/xOkKZv9xK/WQpcsBB3jEybChz9DPC2U/+cusjJVQ==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "license": "MIT" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/vite/-/vite-7.0.6.tgz", + "integrity": "sha512-MHFiOENNBd+Bd9uvc8GEsIzdkn1JxMmEeYX35tI3fv0sJBUTfW5tQsoaOwuY4KhBI09A3dUJ/DXf2yxPVPUceg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.6", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.40.0", + "tinyglobby": "^0.2.14" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.18", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.18.tgz", + "integrity": "sha512-7W4Y4ZbMiQ3SEo+m9lnoNpV9xG7QVMLa+/0RFwwiAVkeYoyGXqWE85jabU4pllJNUzqfLShJ5YLptewhCWUgNA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.18", + "@vue/compiler-sfc": "3.5.18", + "@vue/runtime-dom": "3.5.18", + "@vue/server-renderer": "3.5.18", + "@vue/shared": "3.5.18" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.5.1", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.5.1.tgz", + "integrity": "sha512-ogAF3P97NPm8fJsE4by9dwSYtDwXIY1nFY9T6DyQnGHd1E2Da94w9JIolpe42LJGIl0DwOHBi8TcRPlPGwbTtw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue3-ast-decompiler": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/vue3-ast-decompiler/-/vue3-ast-decompiler-1.0.4.tgz", + "integrity": "sha512-NPGdgNOVIrKuu/CARX8K3WG7woMuykzZtBhCepGcRgfCO+WYoozUJ3hZNBS1IcyHUT9YPdEY5ed7v/jwzZRXpA==", + "engines": { + "node": ">= 16" + }, + "peerDependencies": { + "@vue/compiler-core": "^3.3.4" + } + }, + "node_modules/vuex": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/vuex/-/vuex-4.1.0.tgz", + "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/when-exit": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/when-exit/-/when-exit-2.1.4.tgz", + "integrity": "sha512-4rnvd3A1t16PWzrBUcSDZqcAmsUIy4minDXT/CZ8F2mVDgd65i4Aalimgz1aQkRGU0iH5eT5+6Rx2TK8o443Pg==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.18.3", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1ed6f0b --- /dev/null +++ b/package.json @@ -0,0 +1,48 @@ +{ + "name": "ca-lock-client", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.1", + "async-mutex": "^0.5.0", + "asynckit": "^0.4.0", + "axios": "^1.6.8", + "child_process": "^1.0.2", + "combined-stream": "^1.0.8", + "dayjs": "^1.11.13", + "dayjs-plugin-utc": "^0.1.2", + "delayed-stream": "^1.0.0", + "dotenv": "^16.4.5", + "electron-log": "^5.2.0", + "electron-store": "^10.0.0", + "element-plus": "^2.10.4", + "execa": "^8.0.1", + "express": "^4.20.0", + "fs": "^0.0.1-security", + "fs-extra": "^11.2.0", + "iconv-lite": "^0.6.3", + "ini": "^5.0.0", + "keytar": "^7.9.0", + "mitt": "^3.0.1", + "node-shutdown": "^1.0.9", + "pinia": "^2.1.7", + "proxy-from-env": "^1.1.0", + "qs": "^6.12.1", + "vue": "^3.4.24", + "vue-router": "^4.4.2", + "vuex": "^4.0.2", + "vue3-ast-decompiler": "^1.0.4", + "ws": "^8.18.0", + "xlsx": "^0.18.5" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.0", + "vite": "^7.0.4" + } +} 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..2cf2ed0 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,268 @@ + + + + + \ No newline at end of file diff --git a/src/api/auth.js b/src/api/auth.js new file mode 100644 index 0000000..64b4f8a --- /dev/null +++ b/src/api/auth.js @@ -0,0 +1,117 @@ +import request from '@/utils/request' + +// 账号密码登录 +export function login(data) { + return request({ + url: '/dxsz_client_api/auth/login', + method: 'post', + data + }) +} + +// 手机验证码登录 +export function phoneLogin(data) { + return request({ + url: '/dxsz_client_api/auth/phone_login', + method: 'post', + data + }) +} + +export function logout(data) { + return request({ + url: '/dxsz_client_api/auth/logout', + method: 'post', + data + }) +} + +// 获取验证码 +export function getVerificationCode(data) { + return request({ + url: '/dxsz_client_api/common/verification_code', + method: 'post', + data + }) +} + +// 获取企业列表 +export function getCompanyList() { + return request({ + url: '/dxsz_client_api/company/list', + method: 'get' + }) +} + +// 企业登录 +export function loginCompany() { + return request({ + url: '/dxsz_client_api/company/login', + method: 'post' + }) +} + +// 获取企业信息 +export function getCompanyInfo() { + return request({ + url: '/dxsz_client_api/company/info', + method: 'get' + }) +} + +// 微信小程序登录相关 +export function createWeChatQRCode() { + return request({ + url: '/dxsz_client_api/wechat_mini_program/create_qrcode', + method: 'get' + }) +} + +export function checkWeChatScanStatus() { + return request({ + url: '/dxsz_client_api/wechat_mini_program/check_scan_status', + method: 'get' + }) +} + +// 设备连接审批相关 +export function getDeviceApprovalList(params) { + return request({ + url: '/dxsz_client_api/connect_ca_relation_device_list_v2', + method: 'get', + params + }) +} + +export function revokeDeviceApproval(data) { + return request({ + url: '/dxsz_client_api/revoke', + method: 'post', + data + }) +} + +export function getDeviceUseTimeList(params) { + return request({ + url: '/dxsz_client_api/device_use_time_list', + method: 'get', + params + }) +} + +// 错误上报 +export function reportErrorByDeviceId(data) { + return request({ + url: '/dxsz_client_api/report_error_busid_by_id', + method: 'post', + data + }) +} + +export function reportErrorByUserId(data) { + return request({ + url: '/dxsz_client_api/report_error_busid_by_uid', + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/api/company.js b/src/api/company.js new file mode 100644 index 0000000..9561b45 --- /dev/null +++ b/src/api/company.js @@ -0,0 +1,120 @@ +// 公司管理相关API接口 - 专为SelectCompany组件设计 +import request from '@/utils/request' + +const API_BASE = '/dxsz_client_api' + +/** + * 获取用户公司列表 + * 用于SelectCompany组件显示用户可切换的企业列表 + * @returns {Promise} 返回公司列表数据 + */ +export const getUserCompanyList = () => { + return request({ + url: `${API_BASE}/user/company_list`, + method: 'get' + }) +} + +/** + * 获取公司列表(管理员用) + * 用于获取所有公司列表 + * @param {Object} params 查询参数 + * @returns {Promise} 返回公司列表数据 + */ +export const getCompanyList = (params = {}) => { + return request({ + url: `${API_BASE}/company/list`, + method: 'get', + params + }) +} + +/** + * 公司登录 + * 用于切换公司时的登录操作 + * @param {Object} data 登录参数 {company_id, user_id} + * @returns {Promise} 返回登录结果 + */ +export const companyLogin = (data) => { + return request({ + url: `${API_BASE}/auth/company_login`, + method: 'post', + data + }) +} + +/** + * 获取公司详细信息 + * 用于获取当前选中公司的详细信息 + * @returns {Promise} 返回公司详细信息 + */ +export const getCompanyDetail = () => { + return request({ + url: `${API_BASE}/company/info`, + method: 'get' + }) +} + +/** + * 获取公司用户信息 + * 用于获取公司下的用户信息 + * @returns {Promise} 返回公司用户信息 + */ +export const getCompanyUserInfo = () => { + return request({ + url: `${API_BASE}/company_user/info`, + method: 'get' + }) +} + +/** + * 切换公司 + * 完整的切换公司流程,包括断开设备、重新登录等操作 + * @param {Object} params 切换参数 {company_id, user_id} + * @returns {Promise} 返回切换结果 + */ +export const switchCompany = async (params) => { + try { + // 1. 执行公司登录 + const loginResult = await companyLogin(params) + + // 2. 获取新公司信息 + const companyInfo = await getCompanyDetail() + + return { + success: true, + data: { + loginResult, + companyInfo + } + } + } catch (error) { + return { + success: false, + error + } + } +} + +/** + * 检查公司状态 + * 用于检查公司是否有效 + * @param {number} companyId 公司ID + * @returns {Promise} 返回检查结果 + */ +export const checkCompanyStatus = (companyId) => { + return request({ + url: `${API_BASE}/company/check_status/${companyId}`, + method: 'get' + }) +} + +export default { + getUserCompanyList, + getCompanyList, + companyLogin, + getCompanyDetail, + getCompanyUserInfo, + switchCompany, + checkCompanyStatus +} \ No newline at end of file diff --git a/src/api/constants.js b/src/api/constants.js new file mode 100644 index 0000000..c625fe5 --- /dev/null +++ b/src/api/constants.js @@ -0,0 +1,134 @@ +// API端点常量定义 +export const API_BASE_URL = '/dxsz_client_api' + +// 认证模块 +export const AUTH = { + LOGIN: '/auth/login', + PHONE_LOGIN: '/auth/phone_login', + COMPANY_LOGIN: '/auth/company_login', + LOGOUT: '/auth/logout' +} + +// 用户模块 +export const USER = { + INFO: '/user/info', + UPDATE: '/user', + CHANGE_PASSWORD: '/user/change_password', + COMPANY_LIST: '/user/company_list', + MY_RULE: '/user/my_rule', + GET_USER_CONNECT_DATA: '/user/get_user_connect_data', + GET_USER_ID_BY_LOGIN: '/user/get_user_id_by_login' +} + +// 公司模块 +export const COMPANY = { + LIST: '/company/list', + LOGIN: '/company/login', + INFO: '/company/info', + INFO_DETAIL: '/company/info', + USER_LIST: '/user/company_list', + COMPANY_LOGIN: '/auth/company_login', + COMPANY_USER_INFO: '/company_user/info', + CHECK_STATUS: '/company/check_status', + CHECK_SWITCH_PERMISSION: '/company/check_switch_permission' +} + +// 验证码模块 +export const VERIFICATION = { + CODE: '/common/verification_code' +} + +// 微信小程序模块 +export const WECHAT = { + CREATE_QRCODE: '/wechat_mini_program/create_qrcode', + CHECK_SCAN_STATUS: '/wechat_mini_program/check_scan_status' +} + +// CA关系设备模块 +export const CA_DEVICE = { + // 设备管理 + LIST: '/ca_relation_device/list', + CONNECT: '/ca_relation_device/connect', + DISCONNECT: '/ca_relation_device/disconnect', + CHANGE: '/ca_relation_device/change', + ADD: '/ca_relation_device/add', + UPDATE: '/ca_relation_device/update', + DELETE: '/ca_relation_device/delete', + INFO: '/ca_relation_device/info', + + // 设备审批 + APPROVE_LIST: '/ca_use_approve/connect_ca_relation_device_list_v2', + REVOKE: '/ca_use_approve/revoke', + + // 设备操作 + FORCE_DISCONNECT: '/ca_relation_device/force_disconnect', + REQUEST_CONNECT: '/ca_relation_device/request_connect', + GET_DEVICE_TIME_LIST: '/ca_relation_device/get_device_time_list', + + // 设备查询 + GET_ALL_HUB_DEVICE_LIST_BY_GROUP: '/ca_device_server/get_all_hub_device_list_by_group_v2', + GET_RELATION_DEVICE_LIST_BY_GROUP: '/ca_device_server/get_relation_device_list_by_group', + TYPE_LIST: '/ca_device_server/type_list', + + // 端口管理 + GET_PORT_LIST: '/ca_device_server/get_port_list', + GET_PORT_STATUS: '/ca_device_server/get_port_status', + + // 设备类型管理 + GET_DEVICE_TYPE_LIST: '/ca_device_server/get_device_type_list', + GET_STATUS_LIST: '/ca_device_server/get_status_list', + CREATE_DEVICE: '/ca_device_server/create_device', + UPDATE_DEVICE: '/ca_device_server/update_device', + DELETE_DEVICE: '/ca_device_server/delete_device', + QUERY_RELATED_DEVICES: '/ca_device_server/query_related_devices', + GET_DEVICE_TYPE_TREE: '/ca_device_server/get_device_type_tree' +} + +// 设备使用时间模块 +export const DEVICE_USE_TIME = { + LIST: '/device_use_time_list' +} + +// 错误报告模块 +export const ERROR_REPORT = { + BY_ID: '/report_error_busid_by_id', + BY_UID: '/report_error_busid_by_uid' +} + +// 授权中心模块 +export const AUTHORIZATION_CENTER = { + USER_LIST: '/authorization_center/authorization_center_user_list', + USER_DELETE: '/authorization_center/authorization_center_user_delete', + USER_ADD: '/authorization_center/authorization_center_user_add', + USER_INFO: '/authorization_center/authorization_center_user_info', + USER_EDIT: '/authorization_center/authorization_center_user_edit', + IMPORT: '/authorization_center/import', + DOWNLOAD_TEMPLATE: '/authorization_center/download_template' +} + +// 系统模块 +export const SYSTEM = { + GET_VERSION: '/get_version', + VERSION_REPORT: '/version_report', + CHECK_UPDATE: '/check_update', + DOWNLOAD_UPDATE: '/download' +} + +// API端点汇总 +export const API_ENDPOINTS = { + AUTH, + USER, + COMPANY, + VERIFICATION, + WECHAT, + CA_DEVICE, + DEVICE_USE_TIME, + ERROR_REPORT, + AUTHORIZATION_CENTER, + SYSTEM +} + +export default { + API_BASE_URL, + API_ENDPOINTS +} \ No newline at end of file diff --git a/src/api/device.js b/src/api/device.js new file mode 100644 index 0000000..bb64384 --- /dev/null +++ b/src/api/device.js @@ -0,0 +1,159 @@ +// 设备管理相关API接口 +// 包括设备状态列表、设备类型列表、设备增删改查等接口 + +import request from '@/utils/request' + +const API_BASE = '/dxsz_client_api' + +/** + * 获取设备列表 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getDeviceList = (params) => { + return request({ + url: `${API_BASE}/ca_relation_device/list`, + method: 'get', + params + }) +} + +/** + * 获取设备类型列表 + * @returns {Promise} + */ +export const getDeviceTypes = () => { + return request({ + url: `${API_BASE}/ca_relation_device/type_list`, + method: 'get', + params: { level: 1 } + }) +} + +/** + * 获取设备详情 + * @param {number} id 设备ID + * @returns {Promise} + */ +export const getDeviceDetail = (id) => { + return request({ + url: `${API_BASE}/ca_relation_device/info/${id}`, + method: 'get' + }) +} + +/** + * 强制断开设备连接 + * @param {number} id 设备ID + * @returns {Promise} + */ +export const forceDisconnectDevice = (id) => { + return request({ + url: `${API_BASE}/ca_relation_device/force_disconnect/${id}`, + method: 'post' + }) +} + +/** + * 申请连接设备 + * @param {Object} data 申请数据 + * @returns {Promise} + */ +export const requestConnectDevice = (data) => { + return request({ + url: `${API_BASE}/ca_relation_device/request_connect`, + method: 'post', + data + }) +} + +/** + * 获取所有设备列表(按组) + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getAllHubDeviceListByGroup = (params) => { + return request({ + url: `${API_BASE}/ca_relation_device/get_all_hub_device_list_by_group_v2`, + method: 'get', + params + }) +} + +/** + * 获取设备连接记录 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getDeviceTimeList = (params) => { + return request({ + url: `${API_BASE}/ca_relation_device/get_device_time_list`, + method: 'get', + params + }) +} + +/** + * 获取连接中的设备列表 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getConnectCaRelationDeviceList = (params) => { + return request({ + url: `${API_BASE}/ca_relation_device/connect_ca_relation_device_list_v2`, + method: 'get', + params + }) +} + +/** + * 根据组ID获取设备列表 + * @param {number} groupId 组ID + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getRelationDeviceListByGroup = (groupId, params = {}) => { + return request({ + url: `${API_BASE}/ca_relation_device/get_relation_device_list_by_group/${groupId}`, + method: 'get', + params + }) +} + +/** + * 更新设备信息 + * @param {Object} data 设备数据 + * @returns {Promise} + */ +export const updateDevice = (data) => { + return request({ + url: `${API_BASE}/ca_relation_device/update`, + method: 'post', + data + }) +} + +/** + * 删除设备 + * @param {number} id 设备ID + * @returns {Promise} + */ +export const deleteDevice = (id) => { + return request({ + url: `${API_BASE}/ca_relation_device/delete/${id}`, + method: 'delete' + }) +} + +/** + * 添加设备 + * @param {Object} data 设备数据 + * @returns {Promise} + */ +export const addDevice = (data) => { + return request({ + url: `${API_BASE}/ca_relation_device/add`, + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/api/index.js b/src/api/index.js new file mode 100644 index 0000000..9f80a18 --- /dev/null +++ b/src/api/index.js @@ -0,0 +1,35 @@ +// API统一导出文件 +// 所有API模块的入口文件 + +// 基础API模块 +export * from './auth' +export * from './user' +export * from './device' +export * from './port' +export * from './system' +export * from './company' + +// 专用组件API +export * from './select-company' + +// 常量导出 +export { API_BASE_URL, API_ENDPOINTS } from './constants' + +// 默认导出 +import * as auth from './auth' +import * as user from './user' +import * as device from './device' +import * as port from './port' +import * as system from './system' +import * as company from './company' +import * as selectCompany from './select-company' + +export default { + auth, + user, + device, + port, + system, + company, + selectCompany +} \ No newline at end of file diff --git a/src/api/port.js b/src/api/port.js new file mode 100644 index 0000000..2ca753e --- /dev/null +++ b/src/api/port.js @@ -0,0 +1,146 @@ +// 端口管理相关API接口 +import request from '@/utils/request' + +const API_BASE = '/dxsz_client_api' + +/** + * 获取端口列表 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getPortList = (params) => { + return request({ + url: `${API_BASE}/ca_device_server/get_port_list`, + method: 'get', + params + }) +} + +/** + * 获取端口状态 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getPortStatus = (params) => { + return request({ + url: `${API_BASE}/ca_device_server/get_port_status`, + method: 'get', + params + }) +} + +/** + * 获取所有设备列表(按组) + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getAllHubDeviceListByGroup = (params) => { + return request({ + url: `${API_BASE}/ca_device_server/get_all_hub_device_list_by_group_v2`, + method: 'get', + params + }) +} + +/** + * 获取设备类型列表 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getDeviceTypeList = (params) => { + return request({ + url: `${API_BASE}/ca_device_server/get_device_type_list`, + method: 'get', + params + }) +} + +/** + * 获取状态列表 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getStatusList = (params) => { + return request({ + url: `${API_BASE}/ca_device_server/get_status_list`, + method: 'get', + params + }) +} + +/** + * 创建设备 + * @param {Object} data 设备数据 + * @returns {Promise} + */ +export const createDevice = (data) => { + return request({ + url: `${API_BASE}/ca_device_server/create_device`, + method: 'post', + data + }) +} + +/** + * 更新设备信息 + * @param {Object} data 设备数据 + * @returns {Promise} + */ +export const updateDeviceInfo = (data) => { + return request({ + url: `${API_BASE}/ca_device_server/update_device`, + method: 'put', + data + }) +} + +/** + * 删除设备 + * @param {number} id 设备ID + * @returns {Promise} + */ +export const deleteDevice = (id) => { + return request({ + url: `${API_BASE}/ca_device_server/delete_device/${id}`, + method: 'delete' + }) +} + +/** + * 查询关联设备 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const queryRelatedDevices = (params) => { + return request({ + url: `${API_BASE}/ca_device_server/query_related_devices`, + method: 'get', + params + }) +} + +/** + * 获取设备类型树 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getDeviceTypeTree = (params) => { + return request({ + url: `${API_BASE}/ca_device_server/get_device_type_tree`, + method: 'get', + params + }) +} + +export default { + getPortList, + getPortStatus, + getAllHubDeviceListByGroup, + getDeviceTypeList, + getStatusList, + createDevice, + updateDeviceInfo, + deleteDevice, + queryRelatedDevices, + getDeviceTypeTree +} \ No newline at end of file diff --git a/src/api/select-company.js b/src/api/select-company.js new file mode 100644 index 0000000..6c53ba7 --- /dev/null +++ b/src/api/select-company.js @@ -0,0 +1,165 @@ +// SelectCompany组件专用API封装 +// 基于index-BYhys97C.js中提取的SelectCompany功能实现 +import request from '@/utils/request' +import { getUserCompanyList, companyLogin, getCompanyDetail } from './company' + +const API_BASE = '/dxsz_client_api' + +/** + * SelectCompany组件的核心API集合 + * 用于处理企业切换的完整流程 + */ + +/** + * 获取用户可选择的企业列表 + * 对应编译代码中的: e.setCompanyList(o.data) + * @returns {Promise} 企业列表数据 + */ +export const fetchCompanyOptions = () => { + return getUserCompanyList() +} + +/** + * 执行企业切换操作 + * 对应编译代码中的完整切换流程 + * @param {Object} params 切换参数 + * @param {number} params.companyId 目标企业ID + * @param {number} params.userId 用户ID + * @param {number} params.selectIndex 选择的企业索引 + * @returns {Promise} 切换结果 + */ +export const switchCompany = async ({ companyId, userId, selectIndex }) => { + try { + // 1. 执行企业登录 (对应编译代码: companyLogin) + const loginResult = await companyLogin({ + company_id: companyId, + user_id: userId + }) + + // 2. 获取新企业信息 (对应编译代码: getCompanyDetail) + const companyInfo = await getCompanyDetail() + + // 3. 执行设备断开和重新连接 (对应编译代码中的异步操作) + // 这些操作在前端处理,不在API层面 + + return { + success: true, + data: { + loginResult, + companyInfo, + selectedIndex: selectIndex + } + } + } catch (error) { + console.error('企业切换失败:', error) + return { + success: false, + error: error.response?.data?.message || '企业切换失败' + } + } +} + +/** + * 检查企业切换权限 + * 对应编译代码中的权限检查逻辑 + * @param {number} companyId 企业ID + * @returns {Promise} 权限检查结果 + */ +export const checkSwitchPermission = (companyId) => { + return request({ + url: `${API_BASE}/company/check_switch_permission/${companyId}`, + method: 'get' + }) +} + +/** + * 获取企业切换前的准备数据 + * 包括当前企业信息、可切换企业列表等 + * @returns {Promise} 准备数据 + */ +export const getSwitchPrepareData = async () => { + try { + const [companyList, currentCompany] = await Promise.all([ + fetchCompanyOptions(), + getCompanyDetail() + ]) + + return { + companyList: companyList.data || companyList, + currentCompany: currentCompany.data || currentCompany, + canSwitch: companyList.length > 1 + } + } catch (error) { + console.error('获取切换准备数据失败:', error) + throw error + } +} + +/** + * 验证企业选择 + * 对应编译代码中的企业选择验证逻辑 + * @param {number} selectedIndex 选择的企业索引 + * @param {Array} companyList 企业列表 + * @returns {Object} 验证结果 + */ +export const validateCompanySelection = (selectedIndex, companyList) => { + if (!companyList || companyList.length === 0) { + return { + valid: false, + message: '请先入驻企业!' + } + } + + if (selectedIndex < 0 || selectedIndex >= companyList.length) { + return { + valid: false, + message: '选择的企业无效' + } + } + + return { + valid: true, + selectedCompany: companyList[selectedIndex] + } +} + +/** + * 处理企业切换错误 + * 对应编译代码中的错误处理逻辑 + * @param {Object} error 错误对象 + * @returns {Object} 处理后的错误信息 + */ +export const handleSwitchError = (error) => { + const errorCode = error.response?.status + const errorMessage = error.response?.data?.message + + // 处理402错误码 (对应编译代码: v.code === 402) + if (errorCode === 402) { + return { + type: 'permission_denied', + message: errorMessage || '无权限切换到此企业' + } + } + + // 处理网络错误 + if (error.code === 'NETWORK_ERROR') { + return { + type: 'network_error', + message: '网络连接失败,请检查网络后重试' + } + } + + return { + type: 'unknown_error', + message: errorMessage || '企业切换失败,请稍后重试' + } +} + +export default { + fetchCompanyOptions, + switchCompany, + checkSwitchPermission, + getSwitchPrepareData, + validateCompanySelection, + handleSwitchError +} \ No newline at end of file diff --git a/src/api/system.js b/src/api/system.js new file mode 100644 index 0000000..5bb4e70 --- /dev/null +++ b/src/api/system.js @@ -0,0 +1,231 @@ +import request from '@/utils/request' + +// 获取版本信息 +export function getVersion() { + return request({ + url: '/dxsz_client_api/get_version', + method: 'get', + params: { + is_new: 1, + type: 'dxsz' + } + }) +} + +// 上报版本信息 +export function reportVersionInfo(data) { + return request({ + url: '/dxsz_client_api/version_report', + method: 'post', + data + }) +} + +// 检查更新 +export function checkUpdate() { + return request({ + url: '/dxsz_client_api/check_update', + method: 'get', + params: { + is_new: 1, + type: 'dxsz' + } + }) +} + +// 获取更新包 +export function downloadUpdate(version) { + return request({ + url: `/download/${version}`, + method: 'get', + responseType: 'blob' + }) +} + +// CA关系设备连接 +export const connectCaRelationDevice = (data) => { + const os = require('os') + const networkInterfaces = os.networkInterfaces() + let mac = 'unknown' + + for (const name of Object.keys(networkInterfaces)) { + for (const net of networkInterfaces[name]) { + if (net.mac && net.mac !== '00:00:00:00:00:00') { + mac = net.mac + break + } + } + if (mac !== 'unknown') break + } + + return request({ + url: `/dxsz_client_api/ca_relation_device/connect/${data.id}`, + method: 'post', + data: { + ...data, + computer_name: os.hostname(), + ip: Object.values(os.networkInterfaces()).flat().find(net => net.family === 'IPv4' && !net.internal)?.address || 'unknown', + mac: mac + }, + loading: false + }) +} + +// CA关系设备断开连接 +export const disconnectCaRelationDevice = (data) => { + return request({ + url: `/dxsz_client_api/ca_relation_device/disconnect/${data.id}`, + method: 'post', + data, + loading: false + }) +} + +// CA关系设备变更 +export const changeCaRelationDevice = (data) => { + return request({ + url: `/dxsz_client_api/ca_relation_device/change/${data.id}`, + method: 'put', + data, + loading: false + }) +} + +// 获取用户连接数据 +export const getUserConnectData = (params) => { + return request({ + url: '/dxsz_client_api/user/get_user_connect_data', + method: 'get', + params, + loading: true + }) +} + +// 用户登出 +export const userLogout = (data) => { + return request({ + url: '/dxsz_client_api/auth/logout', + method: 'post', + data, + loading: true + }) +} + +// 更新用户信息 +export const updateUserInfo = (data) => { + return request({ + url: '/dxsz_client_api/user', + method: 'put', + data, + loading: true + }) +} + +// 获取用户规则 +export const getUserRule = () => { + return request({ + url: '/dxsz_client_api/user/my_rule', + method: 'get', + params: {}, + loading: true + }) +} + +// 授权中心相关API +/** + * 获取授权中心用户列表 + * @param {Object} params 查询参数 + * @returns {Promise} + */ +export const getAuthorizationCenterUserList = (params) => { + return request({ + url: '/dxsz_client_api/authorization_center/authorization_center_user_list', + method: 'get', + params, + loading: false + }) +} + +/** + * 删除授权中心用户 + * @param {Object} data 用户数据 + * @returns {Promise} + */ +export const deleteAuthorizationCenterUser = (data) => { + return request({ + url: `/dxsz_client_api/authorization_center/authorization_center_user_delete/${data.user_id}`, + method: 'delete', + params: {}, + loading: true + }) +} + +/** + * 添加授权中心用户 + * @param {Object} data 用户数据 + * @returns {Promise} + */ +export const addAuthorizationCenterUser = (data) => { + return request({ + url: '/dxsz_client_api/authorization_center/authorization_center_user_add', + method: 'post', + data, + loading: true + }) +} + +/** + * 获取授权中心用户信息 + * @param {Object} data 用户数据 + * @returns {Promise} + */ +export const getAuthorizationCenterUserInfo = (data) => { + return request({ + url: `/dxsz_client_api/authorization_center/authorization_center_user_info/${data.user_id}`, + method: 'get', + params: {}, + loading: true + }) +} + +/** + * 编辑授权中心用户 + * @param {Object} data 用户数据 + * @returns {Promise} + */ +export const editAuthorizationCenterUser = (data) => { + return request({ + url: `/dxsz_client_api/authorization_center/authorization_center_user_edit/${data.user_id}`, + method: 'put', + params: data, + loading: true + }) +} + +/** + * 导入授权中心用户 + * @param {Object} data 导入数据 + * @returns {Promise} + */ +export const importAuthorizationCenterUsers = (data) => { + return request({ + url: '/dxsz_client_api/authorization_center/import', + method: 'post', + data, + loading: true + }) +} + +/** + * 下载导入模板 + * @returns {Promise} + */ +export const downloadImportTemplate = () => { + return request({ + url: '/dxsz_client_api/authorization_center/import', + method: 'get', + params: {}, + loading: true, + responseType: 'blob' + }) +} \ No newline at end of file diff --git a/src/api/user.js b/src/api/user.js new file mode 100644 index 0000000..c6dcf77 --- /dev/null +++ b/src/api/user.js @@ -0,0 +1,82 @@ +// 用户相关API接口 +import request from '@/utils/request' + +const API_BASE = '/dxsz_client_api' + +/** + * 修改用户密码 + * @param {Object} data 密码数据 + * @param {string} data.password 新密码 + * @param {string} data.repassword 确认密码 + * @returns {Promise} + */ +export const changePassword = (data) => { + return request({ + url: `${API_BASE}/user/change_password`, + method: 'post', + data, + loading: true + }) +} + +/** + * 获取用户信息 + * @returns {Promise} + */ +export const getUserInfo = () => { + return request({ + url: `${API_BASE}/user/info`, + method: 'get' + }) +} + +/** + * 获取公司列表 + * @returns {Promise} + */ +export const getCompanyList = () => { + return request({ + url: `${API_BASE}/user/company_list`, + method: 'get', + params: {}, + loading: true + }) +} + +/** + * 根据登录获取用户ID + * @param {Object} data 登录数据 + * @returns {Promise} + */ +export const getUserIdByLogin = (data) => { + const os = require('os') + const networkInterfaces = os.networkInterfaces() + let mac = 'unknown' + + for (const name of Object.keys(networkInterfaces)) { + for (const net of networkInterfaces[name]) { + if (net.mac && net.mac !== '00:00:00:00:00:00') { + mac = net.mac + break + } + } + if (mac !== 'unknown') break + } + + return request({ + url: `${API_BASE}/user/get_user_id_by_login`, + method: 'post', + data: { + ...data, + mac, + verify_type: 3 + } + }) +} + +export default { + changePassword, + getUserInfo, + getCompanyList, + getUserIdByLogin +} \ No newline at end of file diff --git a/src/assets/accredit_img.png b/src/assets/accredit_img.png new file mode 100644 index 0000000..37f2bca Binary files /dev/null and b/src/assets/accredit_img.png differ diff --git a/src/assets/ca_Lock.png b/src/assets/ca_Lock.png new file mode 100644 index 0000000..6d637f5 Binary files /dev/null and b/src/assets/ca_Lock.png differ diff --git a/src/assets/ca_lock_bg.png b/src/assets/ca_lock_bg.png new file mode 100644 index 0000000..86c9711 Binary files /dev/null and b/src/assets/ca_lock_bg.png differ diff --git a/src/assets/ca_lock_bg1.png b/src/assets/ca_lock_bg1.png new file mode 100644 index 0000000..fdefd5a Binary files /dev/null and b/src/assets/ca_lock_bg1.png differ diff --git a/src/assets/chengyuan.png b/src/assets/chengyuan.png new file mode 100644 index 0000000..c126842 Binary files /dev/null and b/src/assets/chengyuan.png differ diff --git a/src/assets/flashing-icon.png b/src/assets/flashing-icon.png new file mode 100644 index 0000000..a9b925e Binary files /dev/null and b/src/assets/flashing-icon.png differ diff --git a/src/assets/hardware_img.png b/src/assets/hardware_img.png new file mode 100644 index 0000000..85803de Binary files /dev/null and b/src/assets/hardware_img.png differ diff --git a/src/assets/head_logo.png b/src/assets/head_logo.png new file mode 100644 index 0000000..cbdf9d3 Binary files /dev/null and b/src/assets/head_logo.png differ diff --git a/src/assets/images/enterprise-logo.png b/src/assets/images/enterprise-logo.png new file mode 100644 index 0000000..739cfe1 Binary files /dev/null and b/src/assets/images/enterprise-logo.png differ diff --git a/src/assets/images/upgrade-title.png b/src/assets/images/upgrade-title.png new file mode 100644 index 0000000..627a55b Binary files /dev/null and b/src/assets/images/upgrade-title.png differ diff --git a/src/assets/installerSiddebar.bmp b/src/assets/installerSiddebar.bmp new file mode 100644 index 0000000..9884836 Binary files /dev/null and b/src/assets/installerSiddebar.bmp differ diff --git a/src/assets/list1.jpg b/src/assets/list1.jpg new file mode 100644 index 0000000..5d14372 Binary files /dev/null and b/src/assets/list1.jpg differ diff --git a/src/assets/list2.jpg b/src/assets/list2.jpg new file mode 100644 index 0000000..ab9dcaa Binary files /dev/null and b/src/assets/list2.jpg differ diff --git a/src/assets/list3.jpg b/src/assets/list3.jpg new file mode 100644 index 0000000..2f5705a Binary files /dev/null and b/src/assets/list3.jpg differ diff --git a/src/assets/list4.jpg b/src/assets/list4.jpg new file mode 100644 index 0000000..f1a6043 Binary files /dev/null and b/src/assets/list4.jpg differ diff --git a/src/assets/list5.jpg b/src/assets/list5.jpg new file mode 100644 index 0000000..594a5cc Binary files /dev/null and b/src/assets/list5.jpg differ diff --git a/src/assets/list6.jpg b/src/assets/list6.jpg new file mode 100644 index 0000000..5861da9 Binary files /dev/null and b/src/assets/list6.jpg differ diff --git a/src/assets/list7.jpg b/src/assets/list7.jpg new file mode 100644 index 0000000..db65baa Binary files /dev/null and b/src/assets/list7.jpg differ diff --git a/src/assets/logo-main.png b/src/assets/logo-main.png new file mode 100644 index 0000000..bec9f24 Binary files /dev/null and b/src/assets/logo-main.png differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..739cfe1 Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/port1.png b/src/assets/port1.png new file mode 100644 index 0000000..d83f580 Binary files /dev/null and b/src/assets/port1.png differ diff --git a/src/assets/port2.png b/src/assets/port2.png new file mode 100644 index 0000000..3fe8975 Binary files /dev/null and b/src/assets/port2.png differ diff --git a/src/assets/port3.png b/src/assets/port3.png new file mode 100644 index 0000000..699f878 Binary files /dev/null and b/src/assets/port3.png differ diff --git a/src/assets/port4.png b/src/assets/port4.png new file mode 100644 index 0000000..eec959c Binary files /dev/null and b/src/assets/port4.png differ diff --git a/src/assets/timg.ico b/src/assets/timg.ico new file mode 100644 index 0000000..da88db6 Binary files /dev/null and b/src/assets/timg.ico differ diff --git a/src/assets/update_bg.png b/src/assets/update_bg.png new file mode 100644 index 0000000..47b55f3 Binary files /dev/null and b/src/assets/update_bg.png differ diff --git a/src/assets/upgrade-title.png b/src/assets/upgrade-title.png new file mode 100644 index 0000000..627a55b Binary files /dev/null and b/src/assets/upgrade-title.png differ diff --git a/src/assets/vue.svg b/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/DetectingTimeout.vue b/src/components/DetectingTimeout.vue new file mode 100644 index 0000000..e840aca --- /dev/null +++ b/src/components/DetectingTimeout.vue @@ -0,0 +1,92 @@ + + + + + \ No newline at end of file diff --git a/src/components/DeviceDetail.vue b/src/components/DeviceDetail.vue new file mode 100644 index 0000000..ba53413 --- /dev/null +++ b/src/components/DeviceDetail.vue @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/components/DeviceList.vue b/src/components/DeviceList.vue new file mode 100644 index 0000000..ba53413 --- /dev/null +++ b/src/components/DeviceList.vue @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/components/Header.vue b/src/components/Header.vue new file mode 100644 index 0000000..4ae2857 --- /dev/null +++ b/src/components/Header.vue @@ -0,0 +1,126 @@ + + + + + \ No newline at end of file diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue new file mode 100644 index 0000000..546ebbc --- /dev/null +++ b/src/components/HelloWorld.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/TimeoutPopup.vue b/src/components/TimeoutPopup.vue new file mode 100644 index 0000000..e18f7e7 --- /dev/null +++ b/src/components/TimeoutPopup.vue @@ -0,0 +1,226 @@ + + + + + \ No newline at end of file diff --git a/src/components/UserInfo.vue b/src/components/UserInfo.vue new file mode 100644 index 0000000..912b7e2 --- /dev/null +++ b/src/components/UserInfo.vue @@ -0,0 +1,258 @@ + + + + + \ No newline at end of file diff --git a/src/components/WindowControls.vue b/src/components/WindowControls.vue new file mode 100644 index 0000000..0e6cdb8 --- /dev/null +++ b/src/components/WindowControls.vue @@ -0,0 +1,99 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/ChangePasswordDialog.vue b/src/components/common/ChangePasswordDialog.vue new file mode 100644 index 0000000..68935f3 --- /dev/null +++ b/src/components/common/ChangePasswordDialog.vue @@ -0,0 +1,135 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/DialogHeader.vue b/src/components/common/DialogHeader.vue new file mode 100644 index 0000000..d430d6f --- /dev/null +++ b/src/components/common/DialogHeader.vue @@ -0,0 +1,72 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/MainHead.vue b/src/components/common/MainHead.vue new file mode 100644 index 0000000..65e039f --- /dev/null +++ b/src/components/common/MainHead.vue @@ -0,0 +1,89 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/NotificationDialog.vue b/src/components/common/NotificationDialog.vue new file mode 100644 index 0000000..dbd3b8d --- /dev/null +++ b/src/components/common/NotificationDialog.vue @@ -0,0 +1,132 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/SelectCompany.vue b/src/components/common/SelectCompany.vue new file mode 100644 index 0000000..6805cb7 --- /dev/null +++ b/src/components/common/SelectCompany.vue @@ -0,0 +1,114 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/SvgIcon.vue b/src/components/common/SvgIcon.vue new file mode 100644 index 0000000..c63fd49 --- /dev/null +++ b/src/components/common/SvgIcon.vue @@ -0,0 +1,62 @@ + + + + + \ No newline at end of file diff --git a/src/components/common/index.js b/src/components/common/index.js new file mode 100644 index 0000000..9a238e3 --- /dev/null +++ b/src/components/common/index.js @@ -0,0 +1,11 @@ +// 用户相关组件 +export { default as UserInfo } from './UserInfo.vue' + +// 对话框组件 +export { default as ChangePasswordDialog } from './ChangePasswordDialog.vue' +export { default as NotificationDialog } from './NotificationDialog.vue' +export { default as SelectCompany } from './SelectCompany.vue' + +// 通用组件 +export { default as DialogHeader } from './DialogHeader.vue' +export { default as SvgIcon } from './SvgIcon.vue' \ No newline at end of file diff --git a/src/components/device/AddDevice.vue b/src/components/device/AddDevice.vue new file mode 100644 index 0000000..234ea16 --- /dev/null +++ b/src/components/device/AddDevice.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/components/device/DeviceCardList.vue b/src/components/device/DeviceCardList.vue new file mode 100644 index 0000000..af37f78 --- /dev/null +++ b/src/components/device/DeviceCardList.vue @@ -0,0 +1,333 @@ + + + + + \ No newline at end of file diff --git a/src/components/device/DeviceDetail.vue b/src/components/device/DeviceDetail.vue new file mode 100644 index 0000000..80f148d --- /dev/null +++ b/src/components/device/DeviceDetail.vue @@ -0,0 +1,133 @@ + + + + + \ No newline at end of file diff --git a/src/components/device/DeviceList.vue b/src/components/device/DeviceList.vue new file mode 100644 index 0000000..7ca2da8 --- /dev/null +++ b/src/components/device/DeviceList.vue @@ -0,0 +1,396 @@ + + + + + \ No newline at end of file diff --git a/src/components/device/HardwareManagement.vue b/src/components/device/HardwareManagement.vue new file mode 100644 index 0000000..a5317ac --- /dev/null +++ b/src/components/device/HardwareManagement.vue @@ -0,0 +1,516 @@ + + + + + \ No newline at end of file diff --git a/src/components/history/History.vue b/src/components/history/History.vue new file mode 100644 index 0000000..9cb5ba6 --- /dev/null +++ b/src/components/history/History.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/components/import/ImportExcel.vue b/src/components/import/ImportExcel.vue new file mode 100644 index 0000000..98cde94 --- /dev/null +++ b/src/components/import/ImportExcel.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/components/login/AccountLogin.vue b/src/components/login/AccountLogin.vue new file mode 100644 index 0000000..934f618 --- /dev/null +++ b/src/components/login/AccountLogin.vue @@ -0,0 +1,85 @@ + + + + + \ No newline at end of file diff --git a/src/components/login/CodeLogin.vue b/src/components/login/CodeLogin.vue new file mode 100644 index 0000000..36e0214 --- /dev/null +++ b/src/components/login/CodeLogin.vue @@ -0,0 +1,108 @@ + + + + + \ No newline at end of file diff --git a/src/components/login/LoginOutTips.vue b/src/components/login/LoginOutTips.vue new file mode 100644 index 0000000..0a2a5f1 --- /dev/null +++ b/src/components/login/LoginOutTips.vue @@ -0,0 +1,85 @@ + + + \ No newline at end of file diff --git a/src/components/login/SelectCompany.vue b/src/components/login/SelectCompany.vue new file mode 100644 index 0000000..5c0e95d --- /dev/null +++ b/src/components/login/SelectCompany.vue @@ -0,0 +1,81 @@ + + + + + \ No newline at end of file diff --git a/src/components/port/PortCardList.vue b/src/components/port/PortCardList.vue new file mode 100644 index 0000000..5a947a6 --- /dev/null +++ b/src/components/port/PortCardList.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/components/port/PortConfigForm.vue b/src/components/port/PortConfigForm.vue new file mode 100644 index 0000000..67d5c7d --- /dev/null +++ b/src/components/port/PortConfigForm.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/components/port/PortList.vue b/src/components/port/PortList.vue new file mode 100644 index 0000000..618667a --- /dev/null +++ b/src/components/port/PortList.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/components/port/PortManage.vue b/src/components/port/PortManage.vue new file mode 100644 index 0000000..365a47e --- /dev/null +++ b/src/components/port/PortManage.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/components/update/UpdateDialog.vue b/src/components/update/UpdateDialog.vue new file mode 100644 index 0000000..13b93ed --- /dev/null +++ b/src/components/update/UpdateDialog.vue @@ -0,0 +1,105 @@ + + + + + \ No newline at end of file diff --git a/src/components/update/UpgradeVersion.vue b/src/components/update/UpgradeVersion.vue new file mode 100644 index 0000000..5d9cfec --- /dev/null +++ b/src/components/update/UpgradeVersion.vue @@ -0,0 +1,317 @@ + + + + + \ No newline at end of file diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..8441fa7 --- /dev/null +++ b/src/main.js @@ -0,0 +1,52 @@ +// 主应用入口文件 +import { createApp } from 'vue'; +import ElementPlus from 'element-plus'; +import 'element-plus/dist/index.css'; +import { createPinia } from 'pinia'; +import App from './App.vue'; +import store from './store'; +import router from './router'; +import SvgIcon from './components/common/SvgIcon.vue'; + +// 全局样式 +import './style.css'; + +const pinia = createPinia(); +// 创建Vue应用 +const app = createApp(App); + +// 注册全局组件 +app.component('SvgIcon', SvgIcon); + +app.use(pinia); // 必须先注册 Pinia +// 使用Vuex状态管理 +app.use(store); +app.use(router); + +// 使用ElementPlus +app.use(ElementPlus); + +// 挂载应用 +app.mount('#app'); + +// 全局错误处理 +app.config.errorHandler = (err, instance, info) => { + console.error('全局错误:', err); + console.error('错误信息:', info); +}; + +// 全局属性 +app.config.globalProperties.$electron = { + ipcRenderer: window.require ? window.require('electron').ipcRenderer : null +}; + +// 控制台日志增强 +if (process.env.NODE_ENV === 'development') { + const originalLog = console.log; + console.log = (...args) => { + const timestamp = new Date().toLocaleString('zh-CN', { + timeZone: 'Asia/Shanghai' + }); + originalLog(`[${timestamp}]`, ...args); + }; +} \ No newline at end of file diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..77a2029 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,83 @@ +import { createRouter, createWebHistory } from 'vue-router' +import { getToken } from '@/utils/auth' + +// 路由组件 +import Login from '@/views/login/Login.vue' +import PortManage from '@/views/PortManage.vue' +import DeviceManage from '@/views/DeviceManage.vue' +import HelpCenter from '@/views/HelpCenter.vue' +import GuanglianDaDocument from '@/views/GuanglianDaDocument.vue' + +const routes = [ + { + path: '/login', + name: 'Login', + component: Login, + meta: { title: '登录' } + }, + { + path: '/portManage', + name: 'PortManage', + component: PortManage, + meta: { title: '端口管理', requiresAuth: true } + }, + { + path: '/deviceManage', + name: 'DeviceManage', + component: DeviceManage, + meta: { title: '设备管理', requiresAuth: true } + }, + { + path: '/helpCenter', + name: 'HelpCenter', + component: HelpCenter, + meta: { title: '帮助中心', requiresAuth: true } + }, + { + path: '/guanglianDaDocument', + name: 'GuanglianDaDocument', + component: GuanglianDaDocument, + meta: { title: '广联达网络锁配置', requiresAuth: true } + }, + { + path: '/', + redirect: '/deviceManage', + meta: { requiresAuth: true } + }, + { + path: '/caCloudLock', + redirect: '/login' + } +] + +const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes +}) + +// 路由守卫 +router.beforeEach((to, from, next) => { + // 设置页面标题 + if (to.meta?.title) { + document.title = `${to.meta.title} - 云企通安全云锁` + } + + // 检查是否需要登录 + if (to.meta?.requiresAuth) { + const token = getToken() + if (!token) { + next('/login') + } else { + next() + } + } else { + next() + } +}) + +// 路由错误处理 +router.onError((error) => { + console.error('路由错误:', error) +}) + +export default router \ No newline at end of file diff --git a/src/services/api-manager.js b/src/services/api-manager.js new file mode 100644 index 0000000..93f7b03 --- /dev/null +++ b/src/services/api-manager.js @@ -0,0 +1,356 @@ +/** + * API管理器 + * 处理网络请求配置、错误处理、文件下载等功能 + * 从混淆代码中提取的业务逻辑 + */ + +import axios from 'axios'; +import { ElMessage, ElLoading } from 'element-plus'; +import { userStore } from '@/store/user'; +import { companyStore } from '@/store/company'; +import { ipcRenderer } from 'electron'; + +// 配置常量 +const CONFIG = { + baseURL: '/dxsz_client_api', + timeout: 20000, + maxRetries: 3, + retryDelay: 1000 +}; + +// 创建axios实例 +const apiClient = axios.create({ + baseURL: CONFIG.baseURL, + timeout: CONFIG.timeout, + withCredentials: false +}); + +// 全局变量 +let loadingInstance = null; + +/** + * 显示加载中 + */ +function showLoading() { + loadingInstance = ElLoading.service({ + lock: true, + text: 'Loading', + background: 'rgba(0, 0, 0, 0.7)' + }); +} + +/** + * 隐藏加载中 + */ +function hideLoading() { + if (loadingInstance) { + loadingInstance.close(); + loadingInstance = null; + } +} + +/** + * 获取错误消息 + */ +function getErrorMessage(error) { + if (!error || !error.response) { + return '网络连接错误'; + } + + const { status, data } = error.response; + + const errorMessages = { + 302: '接口重定向了!', + 400: '参数不正确!', + 401: '您未登录,或者登录已经超时,请先登录!', + 402: () => { + reloadPage(); + return data.msg || '登录已过期'; + }, + 403: () => { + reloadPage(); + return data.msg || '您没有权限操作!'; + }, + 404: `请求地址出错: ${error.response.config?.url}`, + 408: '请求超时!', + 409: '系统已存在相同数据!', + 500: data.msg || '服务器内部错误', + 501: '服务未实现!', + 502: '网关错误!', + 503: '服务不可用!', + 504: '服务暂时无法访问,请稍后再试!', + 505: 'HTTP 版本不受支持!' + }; + + const message = errorMessages[status]; + if (typeof message === 'function') { + return message(); + } + return message || '异常问题,请联系管理员!'; +} + +/** + * 重新加载页面 + */ +function reloadPage() { + if (companyStore().companyToken) { + setTimeout(() => { + window.location.reload(); + }, 1500); + } +} + +// 请求拦截器 +apiClient.interceptors.request.use( + (config) => { + const user = userStore(); + const company = companyStore(); + + // 设置默认值 + config.isErrorMessage = config.isErrorMessage ?? true; + config.loading = config.loading ?? false; + + if (config.loading) { + showLoading(); + } + + // 设置token + if (user.token) { + config.headers.token = user.token; + } + if (company.companyToken) { + config.headers['company-token'] = company.companyToken; + } + + // 设置默认content-type + if (!config.headers['content-type'] && config.method === 'post') { + config.headers['content-type'] = 'application/json'; + } + + return config; + }, + (error) => { + hideLoading(); + return Promise.reject(error); + } +); + +// 响应拦截器 +apiClient.interceptors.response.use( + (response) => { + hideLoading(); + return response.data; + }, + (error) => { + hideLoading(); + + const message = getErrorMessage(error); + + if (error.response?.config?.isErrorMessage !== false && message !== 'fail') { + ElMessage.error(message); + } + + if (error.response) { + error.response.data.message = message; + } + + return Promise.reject(error.response?.data); + } +); + +/** + * 设备相关API + */ +export const deviceAPI = { + /** + * 连接设备 + */ + async connectDevice(deviceInfo) { + const systemInfo = { + computer_name: await ipcRenderer.invoke('get-hostname'), + ip: await ipcRenderer.invoke('get-ip-address'), + mac: await ipcRenderer.invoke('get-mac-address') + }; + + return apiClient({ + url: `/ca_relation_device/connect/${deviceInfo.id}`, + method: 'post', + data: { + ...deviceInfo, + ...systemInfo + }, + loading: false + }); + }, + + /** + * 断开设备连接 + */ + async disconnectDevice(deviceInfo) { + return apiClient({ + url: `/ca_relation_device/disconnect/${deviceInfo.id}`, + method: 'post', + data: deviceInfo, + loading: false + }); + }, + + /** + * 修改设备信息 + */ + async updateDevice(deviceInfo) { + return apiClient({ + url: `/ca_relation_device/change/${deviceInfo.id}`, + method: 'put', + data: deviceInfo, + loading: false + }); + } +}; + +/** + * 文件下载API + */ +export const fileAPI = { + /** + * 下载文件 + */ + async downloadFile(url, fileName = null, mkdirPath = 'Downloads') { + try { + const finalFileName = fileName || url.split('/').pop(); + + const result = await ipcRenderer.invoke('download-file', { + url, + fileName: finalFileName, + mkdirPath + }); + + if (result.success) { + return { + success: true, + filePath: result.filePath + }; + } else { + return { + success: false, + error: result.error + }; + } + } catch (error) { + throw new Error(`下载文件失败: ${error.message}`); + } + } +}; + +/** + * 系统工具API + */ +export const systemAPI = { + /** + * 执行命令 + */ + async executeCommand(command, options = {}) { + const { exec } = await import('child_process'); + const { promisify } = await import('util'); + const execAsync = promisify(exec); + + try { + const { stdout, stderr } = await execAsync(command, { + timeout: options.timeout || 5000, + ...options + }); + + return { + success: true, + stdout: stdout.trim(), + stderr: stderr.trim() + }; + } catch (error) { + if (error.code === 0 || error.code === null) { + return { + success: true, + stdout: '', + stderr: '' + }; + } + + return { + success: false, + stdout: error.stdout || '', + stderr: error.stderr || '', + error: error + }; + } + }, + + /** + * 检查进程是否存在 + */ + async checkProcess(processName, options = { timeout: 3000 }) { + try { + const result = await this.executeCommand(`tasklist | findstr "${processName}"`, options); + return result.stdout.includes(processName); + } catch { + return false; + } + }, + + /** + * 安装驱动 + */ + async installDriver() { + const driverPath = await ipcRenderer.invoke('get-app-path'); + const command = `"${driverPath}\\resources\\driver\\devcon.exe" ins -w`; + + return this.executeCommand(command, { timeout: 5000 }); + }, + + /** + * 卸载驱动 + */ + async uninstallDriver(mode = 'u') { + const driverPath = await ipcRenderer.invoke('get-app-path'); + const command = `"${driverPath}\\resources\\driver\\devcon.exe" unins -${mode}`; + + return this.executeCommand(command, { timeout: 5000 }); + } +}; + +/** + * 工具函数 + */ +export const utils = { + /** + * 延迟执行 + */ + delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + }, + + /** + * 获取应用路径 + */ + async getAppPath() { + return await ipcRenderer.invoke('get-app-path'); + } +}; + +/** + * 重新导出 + */ +export default { + apiClient, + deviceAPI, + fileAPI, + systemAPI, + utils +}; + +// 兼容性导出 +export { + apiClient as http, + deviceAPI as device, + fileAPI as file, + systemAPI as system, + utils +}; \ No newline at end of file diff --git a/src/services/api.js b/src/services/api.js new file mode 100644 index 0000000..13d0448 --- /dev/null +++ b/src/services/api.js @@ -0,0 +1,274 @@ +// API服务层 +import axios from 'axios'; +import { API_BASE_URL, API_ENDPOINTS } from '../utils/constants.js'; + +// 获取设备MAC地址 +export function getDeviceMacAddress() { + const os = require('os'); + const networkInterfaces = os.networkInterfaces(); + for (const name of Object.keys(networkInterfaces)) { + for (const net of networkInterfaces[name]) { + if (net.mac && net.mac !== '00:00:00:00:00:00') { + return net.mac; + } + } + } + return 'unknown'; +} + +// 创建axios实例 +const http = axios.create({ + baseURL: API_BASE_URL, + timeout: 30000, + headers: { + 'Content-Type': 'application/json' + } +}); + +// 请求拦截器 +http.interceptors.request.use( + config => { + // 可以在这里添加token等认证信息 + return config; + }, + error => { + return Promise.reject(error); + } +); + +// 响应拦截器 +http.interceptors.response.use( + response => { + return response; + }, + error => { + console.error('API请求错误:', error); + return Promise.reject(error); + } +); + +// 认证相关API +export const authAPI = { + // 账号密码登录 + login: (data) => { + const mac = getDeviceMacAddress(); + return http.post(API_ENDPOINTS.AUTH.LOGIN, { + ...data, + mac + }); + }, + + // 手机号验证码登录 + phoneLogin: (data) => { + const mac = getDeviceMacAddress(); + return http.post(API_ENDPOINTS.AUTH.PHONE_LOGIN, { + ...data, + mac + }); + }, + + // 企业登录 + companyLogin: (data) => { + return http.post(API_ENDPOINTS.AUTH.COMPANY_LOGIN, data); + }, + + // 设置登录缓存 + setLoginCache: (data) => { + const mac = getDeviceMacAddress(); + return http.post(API_ENDPOINTS.AUTH.SET_LOGIN_CACHE, { + ...data, + mac + }); + } +}; + +// 用户相关API +export const userAPI = { + // 获取用户信息 + getUserInfo: () => { + return http.put(API_ENDPOINTS.USER.INFO, {}); + }, + + // 获取公司列表 + getCompanyList: () => { + return http.get(API_ENDPOINTS.USER.COMPANY_LIST, { + params: {}, + loading: true + }); + }, + + // 根据登录获取用户ID + getUserIdByLogin: (data) => { + const mac = getDeviceMacAddress(); + return http.post(API_ENDPOINTS.USER.GET_USER_ID, { + ...data, + mac, + verify_type: 3 + }); + }, + + // 修改密码 + changePassword: (data) => { + return http.post(API_ENDPOINTS.USER.CHANGE_PASSWORD, data, { + loading: true + }); + } +}; + +// 公司相关API +export const companyAPI = { + // 获取公司用户信息 + getCompanyUserInfo: () => { + return http.post(API_ENDPOINTS.COMPANY.INFO, {}, { + loading: true + }); + } +}; + +// 设备相关API +export const deviceAPI = { + // 获取所有设备列表 + getDeviceList: (params) => { + return http.get(API_ENDPOINTS.DEVICE.LIST, { + params, + loading: true + }); + }, + + // 获取设备类型列表 + getDeviceTypes: (params) => { + return http.get(API_ENDPOINTS.DEVICE.TYPES, { + params, + loading: true + }); + }, + + // 连接设备 + connectDevice: (params) => { + return http.get(API_ENDPOINTS.DEVICE.CONNECT, { + params, + loading: params.loading || false, + isErrorMessage: false + }); + }, + + // 获取设备使用日志 + getDeviceLogs: (params) => { + return http.get(API_ENDPOINTS.DEVICE.LOGS, { + params, + loading: true + }); + }, + + // 添加使用申请 + addUseApprove: (params) => { + return http.post(API_ENDPOINTS.DEVICE.APPROVE, null, { + params, + loading: true + }); + }, + + // 撤销使用申请 + revokeUseApprove: (params) => { + return http.post(API_ENDPOINTS.DEVICE.REVOKE, null, { + params, + loading: true + }); + }, + + // 获取用途列表 + getPurposeList: (params) => { + return http.get(API_ENDPOINTS.DEVICE.PURPOSE_LIST, { + params, + loading: true + }); + }, + + // 获取设备使用时间列表 + getDeviceTimeList: (params) => { + return http.get(API_ENDPOINTS.DEVICE.TIME_LIST, { + params, + loading: true + }); + }, + + // 获取端口列表 + getPortList: (params) => { + return http.get(API_ENDPOINTS.DEVICE.PORT_LIST, { + params, + loading: true + }); + }, + + // 获取端口状态 + getPortStatus: (params) => { + return http.get(API_ENDPOINTS.DEVICE.PORT_STATUS, { + params, + loading: true + }); + } +}; + +// 通用API +export const commonAPI = { + // 获取验证码 + getVerificationCode: (data) => { + return http.post(API_ENDPOINTS.COMMON.VERIFICATION_CODE, data, { + loading: true + }); + }, + + // 获取微信二维码 + getWechatQRCode: () => { + return http.get(API_ENDPOINTS.COMMON.WECHAT_QRCODE, { + params: {} + }); + }, + + // 检查扫码状态 + checkScanStatus: (params) => { + return http.get(API_ENDPOINTS.COMMON.CHECK_SCAN, { + params + }); + } +}; + +// 统一的API响应处理 +export function handleApiResponse(response, successMessage = '操作成功') { + if (response.data && response.data.code === 200) { + return { + success: true, + data: response.data.data, + message: response.data.message || successMessage + }; + } else { + return { + success: false, + message: response.data?.message || '操作失败', + code: response.data?.code + }; + } +} + +// 统一的错误处理 +export function handleApiError(error) { + console.error('API调用失败:', error); + + let message = '网络请求失败'; + + if (error.response) { + // 服务器返回了错误状态码 + message = error.response.data?.message || `服务器错误: ${error.response.status}`; + } else if (error.request) { + // 请求发出但没有收到响应 + message = '网络连接失败,请检查网络'; + } else { + // 其他错误 + message = error.message || '请求失败'; + } + + return { + success: false, + message + }; +} \ No newline at end of file diff --git a/src/services/driver-manager.js b/src/services/driver-manager.js new file mode 100644 index 0000000..0e929b6 --- /dev/null +++ b/src/services/driver-manager.js @@ -0,0 +1,371 @@ +/** + * 驱动管理器 + * 处理驱动检测、安装、修复等功能 + * 从混淆代码中提取的业务逻辑 + */ + +import { systemAPI } from './api-manager'; +import { ipcRenderer } from 'electron'; +import { ElMessage, ElMessageBox } from 'element-plus'; + +// 驱动配置 +const DRIVER_CONFIG = { + driverName: 'CloudLock Driver', + driverFile: 'cloudlock.sys', + serviceName: 'CloudLockService', + installPath: 'C:\\Program Files\\CloudLock\\Driver', + registryPath: 'HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\CloudLockService' +}; + +// 驱动状态 +const DRIVER_STATUS = { + NOT_INSTALLED: 'not_installed', + INSTALLED: 'installed', + RUNNING: 'running', + STOPPED: 'stopped', + ERROR: 'error' +}; + +/** + * 驱动管理器类 + */ +class DriverManager { + constructor() { + this.currentStatus = DRIVER_STATUS.NOT_INSTALLED; + this.isChecking = false; + } + + /** + * 检查驱动状态 + */ + async checkDriverStatus() { + if (this.isChecking) return this.currentStatus; + + this.isChecking = true; + try { + // 检查服务是否存在 + const serviceExists = await this.checkServiceExists(); + if (!serviceExists) { + this.currentStatus = DRIVER_STATUS.NOT_INSTALLED; + return this.currentStatus; + } + + // 检查服务状态 + const serviceStatus = await this.getServiceStatus(); + this.currentStatus = serviceStatus; + + return this.currentStatus; + } catch (error) { + console.error('检查驱动状态失败:', error); + this.currentStatus = DRIVER_STATUS.ERROR; + return this.currentStatus; + } finally { + this.isChecking = false; + } + } + + /** + * 检查服务是否存在 + */ + async checkServiceExists() { + try { + const result = await systemAPI.executeCommand( + `sc query ${DRIVER_CONFIG.serviceName}`, + { timeout: 3000 } + ); + return result.success; + } catch { + return false; + } + } + + /** + * 获取服务状态 + */ + async getServiceStatus() { + try { + const result = await systemAPI.executeCommand( + `sc query ${DRIVER_CONFIG.serviceName}`, + { timeout: 3000 } + ); + + if (!result.success) { + return DRIVER_STATUS.ERROR; + } + + const output = result.stdout; + if (output.includes('RUNNING')) { + return DRIVER_STATUS.RUNNING; + } else if (output.includes('STOPPED')) { + return DRIVER_STATUS.STOPPED; + } else { + return DRIVER_STATUS.INSTALLED; + } + } catch { + return DRIVER_STATUS.ERROR; + } + } + + /** + * 安装驱动 + */ + async installDriver() { + try { + ElMessage.info('正在安装驱动...'); + + // 检查管理员权限 + const isAdmin = await this.checkAdminRights(); + if (!isAdmin) { + ElMessage.error('需要管理员权限才能安装驱动'); + return { success: false, error: '需要管理员权限' }; + } + + // 执行驱动安装 + const result = await systemAPI.installDriver(); + + if (result.success) { + ElMessage.success('驱动安装成功'); + this.currentStatus = DRIVER_STATUS.INSTALLED; + return { success: true }; + } else { + ElMessage.error('驱动安装失败'); + return { success: false, error: result.stderr || '安装失败' }; + } + } catch (error) { + console.error('驱动安装失败:', error); + ElMessage.error('驱动安装失败: ' + error.message); + return { success: false, error: error.message }; + } + } + + /** + * 卸载驱动 + */ + async uninstallDriver() { + try { + const confirmed = await ElMessageBox.confirm( + '确定要卸载驱动吗?这将影响所有使用此驱动的应用。', + '确认卸载', + { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning' + } + ); + + if (!confirmed) return { success: false, cancelled: true }; + + ElMessage.info('正在卸载驱动...'); + + // 停止服务 + await this.stopService(); + + // 卸载驱动 + const result = await systemAPI.uninstallDriver(); + + if (result.success) { + ElMessage.success('驱动卸载成功'); + this.currentStatus = DRIVER_STATUS.NOT_INSTALLED; + return { success: true }; + } else { + ElMessage.error('驱动卸载失败'); + return { success: false, error: result.stderr || '卸载失败' }; + } + } catch (error) { + console.error('驱动卸载失败:', error); + ElMessage.error('驱动卸载失败: ' + error.message); + return { success: false, error: error.message }; + } + } + + /** + * 修复驱动 + */ + async repairDriver() { + try { + ElMessage.info('正在修复驱动...'); + + // 先停止服务 + await this.stopService(); + + // 重新安装驱动 + const result = await systemAPI.installDriver(); + + if (result.success) { + // 启动服务 + await this.startService(); + + ElMessage.success('驱动修复成功'); + this.currentStatus = DRIVER_STATUS.RUNNING; + return { success: true }; + } else { + ElMessage.error('驱动修复失败'); + return { success: false, error: result.stderr || '修复失败' }; + } + } catch (error) { + console.error('驱动修复失败:', error); + ElMessage.error('驱动修复失败: ' + error.message); + return { success: false, error: error.message }; + } + } + + /** + * 启动服务 + */ + async startService() { + try { + const result = await systemAPI.executeCommand( + `sc start ${DRIVER_CONFIG.serviceName}`, + { timeout: 5000 } + ); + + if (result.success) { + this.currentStatus = DRIVER_STATUS.RUNNING; + return { success: true }; + } else { + return { success: false, error: result.stderr || '启动失败' }; + } + } catch (error) { + return { success: false, error: error.message }; + } + } + + /** + * 停止服务 + */ + async stopService() { + try { + const result = await systemAPI.executeCommand( + `sc stop ${DRIVER_CONFIG.serviceName}`, + { timeout: 5000 } + ); + + if (result.success) { + this.currentStatus = DRIVER_STATUS.STOPPED; + return { success: true }; + } else { + return { success: false, error: result.stderr || '停止失败' }; + } + } catch (error) { + return { success: false, error: error.message }; + } + } + + /** + * 检查管理员权限 + */ + async checkAdminRights() { + try { + const result = await systemAPI.executeCommand( + 'net session', + { timeout: 2000 } + ); + return result.success; + } catch { + return false; + } + } + + /** + * 获取驱动信息 + */ + async getDriverInfo() { + try { + const result = await systemAPI.executeCommand( + `sc qc ${DRIVER_CONFIG.serviceName}`, + { timeout: 3000 } + ); + + if (!result.success) { + return null; + } + + const output = result.stdout; + const info = {}; + + // 解析服务配置 + const lines = output.split('\n'); + for (const line of lines) { + if (line.includes('BINARY_PATH_NAME')) { + info.path = line.split('=')[1]?.trim(); + } else if (line.includes('DISPLAY_NAME')) { + info.displayName = line.split('=')[1]?.trim(); + } else if (line.includes('START_TYPE')) { + info.startType = line.split('=')[1]?.trim(); + } + } + + return info; + } catch (error) { + console.error('获取驱动信息失败:', error); + return null; + } + } + + /** + * 检查驱动文件是否存在 + */ + async checkDriverFileExists() { + try { + const appPath = await ipcRenderer.invoke('get-app-path'); + const driverPath = `${appPath}\\resources\\driver\\${DRIVER_CONFIG.driverFile}`; + + const result = await systemAPI.executeCommand( + `if exist "${driverPath}" echo exists`, + { timeout: 2000 } + ); + + return result.success && result.stdout.includes('exists'); + } catch { + return false; + } + } + + /** + * 获取驱动版本 + */ + async getDriverVersion() { + try { + const appPath = await ipcRenderer.invoke('get-app-path'); + const driverPath = `${appPath}\\resources\\driver\\${DRIVER_CONFIG.driverFile}`; + + const result = await systemAPI.executeCommand( + `powershell -Command "(Get-Item '${driverPath}').VersionInfo.FileVersion"`, + { timeout: 3000 } + ); + + if (result.success) { + return result.stdout.trim(); + } + + return '未知版本'; + } catch { + return '未知版本'; + } + } + + /** + * 显示驱动状态 + */ + async showDriverStatus() { + const status = await this.checkDriverStatus(); + + const statusMessages = { + [DRIVER_STATUS.NOT_INSTALLED]: '驱动未安装', + [DRIVER_STATUS.INSTALLED]: '驱动已安装但未运行', + [DRIVER_STATUS.RUNNING]: '驱动运行正常', + [DRIVER_STATUS.STOPPED]: '驱动已停止', + [DRIVER_STATUS.ERROR]: '驱动状态异常' + }; + + ElMessage.info(statusMessages[status] || '未知状态'); + return status; + } +} + +// 创建单例实例 +const driverManager = new DriverManager(); + +// 导出实例和类 +export default driverManager; +export { DriverManager, DRIVER_STATUS }; \ No newline at end of file diff --git a/src/services/index.js b/src/services/index.js new file mode 100644 index 0000000..dd4b931 --- /dev/null +++ b/src/services/index.js @@ -0,0 +1,58 @@ +/** + * 服务模块统一导出 + * 从混淆代码中提取的业务逻辑模块 + */ + +// 服务模块 +export { default as apiManager } from './api-manager'; +export { default as driverManager } from './driver-manager'; +export { default as messageManager } from './message-manager'; +export { default as fileLogger } from './file-logger'; + +// 从api-manager中导出具体的API +export { + apiClient, + deviceAPI, + fileAPI, + systemAPI, + utils as apiUtils +} from './api-manager'; + +// 从driver-manager中导出 +export { DriverManager, DRIVER_STATUS } from './driver-manager'; + +// 从message-manager中导出 +export { + MessageManager, + MESSAGE_TYPE, + MESSAGE_CONFIG, + success, + error, + warning, + info, + loading, + confirm, + alert, + prompt +} from './message-manager'; + +// 工具函数 +export { + typeUtils, + objectUtils, + stringUtils, + arrayUtils, + dateUtils, + networkUtils, + fileUtils, + validationUtils, + cacheUtils +} from '../utils/tools'; + +// 重新导出已有的服务 +export * from './api'; +export * from './auth'; +export * from './logger'; +export * from './network-manager'; +export * from './request'; +export * from './websocket-client'; \ No newline at end of file diff --git a/src/services/message-manager.js b/src/services/message-manager.js new file mode 100644 index 0000000..47d8fd7 --- /dev/null +++ b/src/services/message-manager.js @@ -0,0 +1,346 @@ +/** + * 消息管理器 + * 处理自定义消息弹窗、通知等功能 + * 从混淆代码中提取的业务逻辑 + */ + +import { ElMessage, ElMessageBox, ElNotification } from 'element-plus'; +import { h } from 'vue'; + +/** + * 消息类型枚举 + */ +const MESSAGE_TYPE = { + SUCCESS: 'success', + ERROR: 'error', + WARNING: 'warning', + INFO: 'info' +}; + +/** + * 消息配置 + */ +const MESSAGE_CONFIG = { + duration: 3000, + showClose: true, + center: false, + offset: 20, + grouping: true +}; + +/** + * 自定义消息管理器 + */ +class MessageManager { + constructor() { + this.messageQueue = []; + this.isProcessing = false; + } + + /** + * 显示普通消息 + */ + showMessage(message, type = MESSAGE_TYPE.INFO, duration = MESSAGE_CONFIG.duration) { + return ElMessage({ + message, + type, + duration, + showClose: MESSAGE_CONFIG.showClose, + center: MESSAGE_CONFIG.center, + offset: MESSAGE_CONFIG.offset, + grouping: MESSAGE_CONFIG.grouping + }); + } + + /** + * 显示成功消息 + */ + success(message, duration = MESSAGE_CONFIG.duration) { + return this.showMessage(message, MESSAGE_TYPE.SUCCESS, duration); + } + + /** + * 显示错误消息 + */ + error(message, duration = MESSAGE_CONFIG.duration) { + return this.showMessage(message, MESSAGE_TYPE.ERROR, duration); + } + + /** + * 显示警告消息 + */ + warning(message, duration = MESSAGE_CONFIG.duration) { + return this.showMessage(message, MESSAGE_TYPE.WARNING, duration); + } + + /** + * 显示信息消息 + */ + info(message, duration = MESSAGE_CONFIG.duration) { + return this.showMessage(message, MESSAGE_TYPE.INFO, duration); + } + + /** + * 显示加载中消息 + */ + loading(message = '加载中...') { + return ElMessage({ + message, + type: MESSAGE_TYPE.INFO, + duration: 0, + showClose: false, + icon: 'el-icon-loading' + }); + } + + /** + * 关闭所有消息 + */ + closeAll() { + ElMessage.closeAll(); + } + + /** + * 显示确认对话框 + */ + async confirm(message, title = '确认', options = {}) { + const defaultOptions = { + confirmButtonText: '确定', + cancelButtonText: '取消', + type: 'warning', + ...options + }; + + try { + await ElMessageBox.confirm(message, title, defaultOptions); + return { confirmed: true, cancelled: false }; + } catch (action) { + return { confirmed: false, cancelled: true, action }; + } + } + + /** + * 显示提示对话框 + */ + async alert(message, title = '提示', options = {}) { + const defaultOptions = { + confirmButtonText: '确定', + type: 'info', + ...options + }; + + try { + await ElMessageBox.alert(message, title, defaultOptions); + return { confirmed: true }; + } catch (action) { + return { confirmed: false, action }; + } + } + + /** + * 显示输入对话框 + */ + async prompt(message, title = '输入', options = {}) { + const defaultOptions = { + confirmButtonText: '确定', + cancelButtonText: '取消', + inputPattern: null, + inputErrorMessage: '输入格式不正确', + ...options + }; + + try { + const value = await ElMessageBox.prompt(message, title, defaultOptions); + return { value, confirmed: true, cancelled: false }; + } catch (action) { + return { value: null, confirmed: false, cancelled: true, action }; + } + } + + /** + * 显示通知 + */ + notify(options) { + const defaultOptions = { + title: '通知', + message: '', + type: MESSAGE_TYPE.INFO, + duration: 4500, + position: 'top-right', + offset: 0, + ...options + }; + + return ElNotification(defaultOptions); + } + + /** + * 显示成功通知 + */ + notifySuccess(message, title = '成功') { + return this.notify({ title, message, type: MESSAGE_TYPE.SUCCESS }); + } + + /** + * 显示错误通知 + */ + notifyError(message, title = '错误') { + return this.notify({ title, message, type: MESSAGE_TYPE.ERROR }); + } + + /** + * 显示警告通知 + */ + notifyWarning(message, title = '警告') { + return this.notify({ title, message, type: MESSAGE_TYPE.WARNING }); + } + + /** + * 显示信息通知 + */ + notifyInfo(message, title = '信息') { + return this.notify({ title, message, type: MESSAGE_TYPE.INFO }); + } + + /** + * 显示自定义内容通知 + */ + notifyCustom(content, options = {}) { + return this.notify({ + ...options, + message: h('div', content) + }); + } + + /** + * 队列消息处理 + */ + async processMessageQueue() { + if (this.isProcessing || this.messageQueue.length === 0) { + return; + } + + this.isProcessing = true; + + while (this.messageQueue.length > 0) { + const message = this.messageQueue.shift(); + await this.showMessage(message.text, message.type, message.duration); + await this.delay(500); + } + + this.isProcessing = false; + } + + /** + * 添加到消息队列 + */ + enqueueMessage(message, type = MESSAGE_TYPE.INFO, duration = MESSAGE_CONFIG.duration) { + this.messageQueue.push({ text: message, type, duration }); + this.processMessageQueue(); + } + + /** + * 延迟函数 + */ + delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + /** + * 格式化错误消息 + */ + formatError(error) { + if (typeof error === 'string') { + return error; + } + + if (error instanceof Error) { + return error.message; + } + + if (error && error.message) { + return error.message; + } + + return '未知错误'; + } + + /** + * 显示网络错误 + */ + showNetworkError(error) { + const message = this.formatError(error); + this.error(`网络错误: ${message}`); + } + + /** + * 显示系统错误 + */ + showSystemError(error) { + const message = this.formatError(error); + this.error(`系统错误: ${message}`); + } + + /** + * 显示操作成功 + */ + showOperationSuccess(operation) { + this.success(`${operation}成功`); + } + + /** + * 显示操作失败 + */ + showOperationFailed(operation, error) { + const message = this.formatError(error); + this.error(`${operation}失败: ${message}`); + } + + /** + * 显示进度消息 + */ + showProgress(current, total, message = '') { + const percent = Math.round((current / total) * 100); + const progressMessage = message ? `${message}: ${percent}%` : `进度: ${percent}%`; + + return this.showMessage(progressMessage, MESSAGE_TYPE.INFO, 0); + } + + /** + * 显示批量操作结果 + */ + showBatchResult(success, failed, total) { + const message = `完成: 成功 ${success} 个, 失败 ${failed} 个, 总计 ${total} 个`; + + if (failed === 0) { + this.success(message); + } else if (success === 0) { + this.error(message); + } else { + this.warning(message); + } + } +} + +// 创建单例实例 +const messageManager = new MessageManager(); + +// 快捷方法 +const { success, error, warning, info, loading, confirm, alert, prompt } = messageManager; + +// 导出实例和方法 +export default messageManager; +export { + MessageManager, + MESSAGE_TYPE, + MESSAGE_CONFIG, + messageManager, + success, + error, + warning, + info, + loading, + confirm, + alert, + prompt +}; \ No newline at end of file diff --git a/src/store/device.js b/src/store/device.js new file mode 100644 index 0000000..c9b244b --- /dev/null +++ b/src/store/device.js @@ -0,0 +1,2 @@ +// 设备状态管理 +// 使用Pinia进行状态管理 \ No newline at end of file diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..a817d88 --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,451 @@ +// Vuex状态管理 +import { createStore } from 'vuex'; +import { authAPI, userAPI, deviceAPI } from '../services/api.js'; +// src/store/index.js +import { defineStore } from 'pinia'; +export const useStore = defineStore('main', { /* 配置 */ }); + + +// 用户模块 +const user = { + namespaced: true, + state: () => ({ + userInfo: null, + companyList: [], + currentCompany: null, + token: localStorage.getItem('token') || null, + loginInfo: null + }), + + mutations: { + SET_USER_INFO(state, userInfo) { + state.userInfo = userInfo; + }, + + SET_COMPANY_LIST(state, companyList) { + state.companyList = companyList; + }, + + SET_CURRENT_COMPANY(state, company) { + state.currentCompany = company; + }, + + SET_TOKEN(state, token) { + state.token = token; + if (token) { + localStorage.setItem('token', token); + } else { + localStorage.removeItem('token'); + } + }, + + SET_LOGIN_INFO(state, loginInfo) { + state.loginInfo = loginInfo; + }, + + CLEAR_USER_DATA(state) { + state.userInfo = null; + state.companyList = []; + state.currentCompany = null; + state.token = null; + state.loginInfo = null; + localStorage.removeItem('token'); + } + }, + + actions: { + // 获取用户基本信息 + async fetchUserInfo({ commit }) { + try { + const response = await userAPI.getUserInfo(); + const result = response.data; + + if (result.code === 200) { + commit('SET_USER_INFO', result.data); + return { success: true, data: result.data }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取用户信息失败:', error); + return { success: false, message: '获取用户信息失败' }; + } + }, + + // 获取用户公司列表 + async fetchCompanyList({ commit }) { + try { + const response = await userAPI.getCompanyList(); + const result = response.data; + + if (result.code === 200) { + commit('SET_COMPANY_LIST', result.data || []); + return { success: true, data: result.data || [] }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取公司列表失败:', error); + return { success: false, message: '获取公司列表失败' }; + } + }, + + // 设置当前公司 + setCurrentCompany({ commit }, company) { + commit('SET_CURRENT_COMPANY', company); + }, + + // 设置token + setToken({ commit }, token) { + commit('SET_TOKEN', token); + }, + + // 设置登录信息 + setLoginInfo({ commit }, loginInfo) { + commit('SET_LOGIN_INFO', loginInfo); + }, + + // 用户登出 + async userLogout({ commit }) { + commit('CLEAR_USER_DATA'); + } + }, + + getters: { + isLoggedIn: state => !!state.token, + userName: state => state.userInfo?.name || '', + companyName: state => state.currentCompany?.name || '' + } +}; + +// VPN状态模块 +const vpn = { + namespaced: true, + state: () => ({ + isConnectVPN: false, + vpnStatus: 'disconnected', // disconnected, connecting, connected, error + vpnConfig: null, + connectionHistory: [] + }), + + mutations: { + SET_VPN_STATUS(state, status) { + state.isConnectVPN = status + state.vpnStatus = status ? 'connected' : 'disconnected' + }, + + SET_VPN_CONFIG(state, config) { + state.vpnConfig = config + }, + + ADD_CONNECTION_HISTORY(state, record) { + state.connectionHistory.push({ + timestamp: new Date().toISOString(), + ...record + }) + }, + + CLEAR_CONNECTION_HISTORY(state) { + state.connectionHistory = [] + } + }, + + actions: { + // 设置VPN连接状态 + setVPNStatus({ commit }, status) { + commit('SET_VPN_STATUS', status) + + commit('ADD_CONNECTION_HISTORY', { + action: status ? 'connected' : 'disconnected' + }) + }, + + // 设置VPN配置 + setVPNConfig({ commit }, config) { + commit('SET_VPN_CONFIG', config) + }, + + // 清除连接历史 + clearConnectionHistory({ commit }) { + commit('CLEAR_CONNECTION_HISTORY') + } + }, + + getters: { + vpnStatusText: (state) => { + const statusMap = { + disconnected: '未连接', + connecting: '连接中...', + connected: '已连接', + error: '连接失败' + } + return statusMap[state.vpnStatus] || '未知状态' + }, + + isVPNConnected: (state) => state.isConnectVPN + } +}; + +// 设备模块 +const device = { + namespaced: true, + state: () => ({ + deviceList: [], + deviceTypes: [], + currentDevice: null, + deviceLogs: [], + purposeList: [], + deviceTimeList: [], + connectedDevices: new Map(), + deviceStatus: {} + }), + + mutations: { + SET_DEVICE_LIST(state, devices) { + state.deviceList = devices; + }, + + SET_DEVICE_TYPES(state, types) { + state.deviceTypes = types; + }, + + SET_CURRENT_DEVICE(state, device) { + state.currentDevice = device; + }, + + SET_DEVICE_LOGS(state, logs) { + state.deviceLogs = logs; + }, + + SET_PURPOSE_LIST(state, purposes) { + state.purposeList = purposes; + }, + + SET_DEVICE_TIME_LIST(state, timeList) { + state.deviceTimeList = timeList; + }, + + SET_DEVICE_STATUS(state, { deviceId, status }) { + state.deviceStatus[deviceId] = status; + }, + + ADD_CONNECTED_DEVICE(state, { deviceId, connectionInfo }) { + state.connectedDevices.set(deviceId, connectionInfo); + }, + + REMOVE_CONNECTED_DEVICE(state, deviceId) { + state.connectedDevices.delete(deviceId); + }, + + UPDATE_DEVICE_STATUS(state, { deviceId, status }) { + const device = state.deviceList.find(d => d.id === deviceId); + if (device) { + device.status = status; + } + } + }, + + actions: { + // 获取设备列表数据 + async fetchDeviceList({ commit }, params = {}) { + try { + const response = await deviceAPI.getDeviceList(params); + const result = response.data; + + if (result.code === 200) { + commit('SET_DEVICE_LIST', result.data || []); + return { success: true, data: result.data || [] }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取设备列表失败:', error); + return { success: false, message: '获取设备列表失败' }; + } + }, + + // 获取设备类型列表 + async fetchDeviceTypes({ commit }, params = {}) { + try { + const response = await deviceAPI.getDeviceTypes(params); + const result = response.data; + + if (result.code === 200) { + commit('SET_DEVICE_TYPES', result.data || []); + return { success: true, data: result.data || [] }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取设备类型失败:', error); + return { success: false, message: '获取设备类型失败' }; + } + }, + + // 连接指定设备 + async connectToDevice({ commit }, params) { + try { + const response = await deviceAPI.connectDevice(params); + const result = response.data; + + if (result.code === 200) { + commit('SET_DEVICE_STATUS', { + deviceId: params.device_id, + status: 'connected' + }); + commit('ADD_CONNECTED_DEVICE', { + deviceId: params.device_id, + connectionInfo: result.data + }); + return { success: true, data: result.data }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('连接设备失败:', error); + return { success: false, message: '连接设备失败' }; + } + }, + + // 获取设备使用日志 + async fetchDeviceLogs({ commit }, params) { + try { + const response = await deviceAPI.getDeviceLogs(params); + const result = response.data; + + if (result.code === 200) { + commit('SET_DEVICE_LOGS', result.data || []); + return { success: true, data: result.data || [] }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取设备日志失败:', error); + return { success: false, message: '获取设备日志失败' }; + } + }, + + // 获取设备使用用途列表 + async fetchPurposeList({ commit }, params) { + try { + const response = await deviceAPI.getPurposeList(params); + const result = response.data; + + if (result.code === 200) { + commit('SET_PURPOSE_LIST', result.data || []); + return { success: true, data: result.data || [] }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取用途列表失败:', error); + return { success: false, message: '获取用途列表失败' }; + } + }, + + // 获取设备使用时间列表 + async fetchDeviceTimeList({ commit }, params) { + try { + const response = await deviceAPI.getDeviceTimeList(params); + const result = response.data; + + if (result.code === 200) { + commit('SET_DEVICE_TIME_LIST', result.data || []); + return { success: true, data: result.data || [] }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取设备使用时间列表失败:', error); + return { success: false, message: '获取设备使用时间列表失败' }; + } + }, + + // 设置当前设备 + setCurrentDevice({ commit }, device) { + commit('SET_CURRENT_DEVICE', device); + }, + + // 更新设备状态 + updateDeviceStatus({ commit }, { deviceId, status }) { + commit('UPDATE_DEVICE_STATUS', { deviceId, status }); + } + }, + + getters: { + availableDevices: state => state.deviceList.filter(d => d.status === 'available'), + connectedDeviceCount: state => state.connectedDevices.size, + getDeviceById: state => id => state.deviceList.find(d => d.id === id) + } +}; + +// 端口模块 +const port = { + namespaced: true, + state: () => ({ + portList: [], + currentPort: null, + portStatus: {}, + isLoading: false + }), + + mutations: { + SET_PORT_LIST(state, ports) { + state.portList = ports; + }, + + SET_CURRENT_PORT(state, port) { + state.currentPort = port; + }, + + SET_PORT_STATUS(state, { portId, status }) { + state.portStatus[portId] = status; + }, + + SET_LOADING(state, loading) { + state.isLoading = loading; + } + }, + + actions: { + // 获取端口列表 + async fetchPortList({ commit }, params = {}) { + try { + const response = await deviceAPI.getPortList(params); + const result = response.data; + + if (result.code === 200) { + commit('SET_PORT_LIST', result.data || []); + return { success: true, data: result.data || [] }; + } else { + return { success: false, message: result.message }; + } + } catch (error) { + console.error('获取端口列表失败:', error); + return { success: false, message: '获取端口列表失败' }; + } + }, + + // 设置当前端口 + setCurrentPort({ commit }, port) { + commit('SET_CURRENT_PORT', port); + } + }, + + getters: { + availablePorts: state => state.portList.filter(p => p.status === 'available'), + occupiedPorts: state => state.portList.filter(p => p.status === 'occupied'), + totalPorts: state => state.portList.length + } +}; + +// 创建store实例 +export default createStore({ + modules: { + user, + vpn, + device, + port + }, + strict: process.env.NODE_ENV !== 'production' +}); \ No newline at end of file diff --git a/src/store/port.js b/src/store/port.js new file mode 100644 index 0000000..1ac066e --- /dev/null +++ b/src/store/port.js @@ -0,0 +1,2 @@ +// 端口状态管理 +// 使用Pinia进行状态管理,如myRule(用户权限)、totalPort(端口统计)等 \ No newline at end of file diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..355ee38 --- /dev/null +++ b/src/style.css @@ -0,0 +1,24158 @@ +@charset "UTF-8"; + +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + color-scheme: light dark; + color: #ffffffde; + background-color: #242424; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit +} + +a:hover { + color: #535bf2 +} + +body { + margin: 0; + display: flex; + min-width: 320px; + min-height: 100vh +} + +h1 { + font-size: 3.2em; + line-height: 1.1 +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: .6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color .25s +} + +button:hover { + border-color: #646cff +} + +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color +} + +.card { + padding: 2em +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #fff + } + + a:hover { + color: #747bff + } + + button { + background-color: #f9f9f9 + } +} + +.main-head[data-v-cfd99582] { + width: 100%; + height: 40px; + background-color: #1490f6; + border-radius: 4px 4px 0 0; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 10px +} + +.main-head_left[data-v-cfd99582] { + display: flex; + align-items: center +} + +.main-head_left span[data-v-cfd99582] { + color: #fff; + font-size: 12px; + font-weight: 500; + margin-left: 4px +} + +.main-head_left img[data-v-cfd99582] { + width: 16px; + height: 18px +} + +.main-head_close[data-v-cfd99582] { + cursor: pointer; + padding: 2px +} + +.main-head_close[data-v-cfd99582]:hover { + background-color: #fff3 +} + +.notification-dialog_content[data-v-b0ea6fa7] { + display: flex; + align-items: center; + padding: 14px 13px 24px +} + +.notification-dialog_content span[data-v-b0ea6fa7] { + color: #000000e6; + font-size: 16px; + font-weight: 700; + margin-left: 10px +} + +.notification-dialog .dialog-footer[data-v-b0ea6fa7] { + padding-right: 15px +} + +.login-account[data-v-2c3348ea], +.login-code[data-v-6d4f098b] { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + margin-top: 32px +} + +.login-code_number[data-v-6d4f098b] { + color: #2ba8ef; + font-size: 14px; + cursor: pointer +} + +.login-head_logo[data-v-ef660240] { + width: 32px; + height: 36px +} + +.login-head span[data-v-ef660240] { + color: #000; + font-size: 26px; + font-weight: 700; + margin-left: 8px +} + +.login-head_title[data-v-ef660240] { + color: #000; + font-size: 18px; + font-weight: 500; + margin-top: 9px +} + +.login-content[data-v-ef660240] { + transition: height .3s +} + +.login-type[data-v-ef660240] { + display: flex; + align-items: center; + padding: 16px 10px 0 +} + +.login-type_txt[data-v-ef660240] { + color: #333; + font-size: 16px; + font-weight: 500; + margin-right: 20px; + position: relative; + cursor: pointer +} + +.login-type_active[data-v-ef660240] { + color: #2ba8ef +} + +.login-type_active[data-v-ef660240]:after { + content: ""; + width: 30px; + height: 4px; + border-radius: 8px; + background: #2ba8ef; + display: block; + position: absolute; + left: 50%; + transform: translate(-50%); + bottom: -10px +} + +.login-btn[data-v-ef660240] { + display: flex; + justify-content: center +} + +.login-btn .el-button[data-v-ef660240] { + width: 331px; + height: 44px; + margin: 16px auto 10px +} + +.notification-dialog_content[data-v-fcedb696] { + display: flex; + align-items: center; + padding: 14px 13px 24px +} + +.notification-dialog_content span[data-v-fcedb696] { + color: #000000e6; + font-size: 16px; + font-weight: 700; + margin-left: 10px +} + +.notification-dialog .dialog-footer[data-v-fcedb696] { + padding-right: 15px +} + +.upgrade-version_head[data-v-8b2c681c] { + height: 164px; + background-color: #1490f6; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center +} + +.upgrade-version_title[data-v-8b2c681c] { + width: 346px; + height: 88px +} + +.upgrade-version_tips[data-v-8b2c681c] { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding-top: 40px +} + +.upgrade-version_tips span[data-v-8b2c681c] { + color: #000; + font-size: 18px +} + +.upgrade-version_tips .el-button[data-v-8b2c681c] { + width: 180px; + height: 44px; + margin-top: 28px +} + +.upgrade-version_progress[data-v-8b2c681c] { + display: flex; + justify-content: center; + align-items: flex-end; + margin-top: 16px +} + +.upgrade-version_progress_left[data-v-8b2c681c] { + width: 546px; + margin-right: 14px +} + +.upgrade-version_progress_left_text[data-v-8b2c681c] { + display: flex; + justify-content: space-between; + margin-bottom: 10px +} + +.back-button[data-v-16a3d516] { + display: flex; + align-items: center; + justify-content: center; + width: 78px; + height: 32px; + background-color: #0000004d; + border-radius: 0 0 12px; + -webkit-app-region: no-drag; + cursor: pointer +} + +.back-button span[data-v-16a3d516] { + color: #fff; + font-weight: 500; + font-size: 14px; + margin-left: 4px +} + +.app-logo[data-v-d8f1618f] { + height: 40px; + display: flex; + align-items: center; + padding-left: 12px; + -webkit-app-region: no-drag +} + +.app-logo__left[data-v-d8f1618f] { + display: flex; + align-items: center +} + +.app-logo__left span[data-v-d8f1618f] { + color: #fff; + font-size: 12px; + font-weight: 500; + margin-left: 4px +} + +.app-logo__left img[data-v-d8f1618f] { + width: 16px; + height: 18px +} + +.app-logo__update[data-v-d8f1618f] { + display: flex; + align-items: center; + margin-left: 16px; + cursor: pointer; + position: relative +} + +.app-logo__update span[data-v-d8f1618f] { + color: #fff; + font-size: 12px; + line-height: 22px; + margin-right: 8px; + margin-left: 4px +} + +.app-logo__update img[data-v-d8f1618f] { + width: 12px; + height: 12px +} + +.app-logo__update .new-badge[data-v-d8f1618f] { + background-color: red; + color: #fff; + font-size: 10px; + line-height: 14px; + padding: 0 4px; + border-radius: 12px; + position: absolute; + top: -14px; + right: -22px; + display: inline-block; + animation: bounce-d8f1618f 1s infinite alternate +} + +@keyframes bounce-d8f1618f { + 0% { + transform: translateY(0) + } + + 50% { + transform: translateY(-2px) + } + + to { + transform: translateY(0) + } +} + +.password-dialog .dialog-footer[data-v-378bf6fa] { + padding: 20px 15px 12px +} + +.user-popover_info[data-v-767ef01b] { + display: flex; + align-items: center; + border-bottom: 1px solid #eeeeee; + padding-bottom: 10px +} + +.user-popover_info_name[data-v-767ef01b] { + display: flex; + flex-direction: column; + margin-left: 5px +} + +.user-popover_info_name_txt[data-v-767ef01b] { + color: #333; + font-size: 12px; + font-weight: 500 +} + +.user-popover_info_name_company[data-v-767ef01b] { + color: #999; + font-size: 10px; + margin-top: 2px +} + +.user-popover_list[data-v-767ef01b] { + width: 100%; + display: flex; + align-items: center; + justify-content: space-between; + padding: 10px 0; + border-bottom: 1px solid #eeeeee; + cursor: pointer +} + +.user-popover_list_left[data-v-767ef01b] { + display: flex; + align-items: center +} + +.user-popover_list_left span[data-v-767ef01b] { + color: #333; + font-size: 14px; + margin-left: 4px +} + +.user-popover_loginout[data-v-767ef01b] { + border: none; + padding-bottom: 0 +} + +.user-info[data-v-16b933c1] { + display: flex; + align-items: center; + cursor: pointer +} + +.user-info img[data-v-16b933c1] { + width: 16px; + height: 16px; + border-radius: 50% +} + +.user-info span[data-v-16b933c1] { + color: #fff; + font-size: 12px; + margin: 0 2px 0 6px +} + +.window-controls[data-v-d8a38b1e] { + display: flex; + align-items: center; + -webkit-app-region: no-drag +} + +.window-controls__icon[data-v-d8a38b1e] { + margin: 0 6px; + cursor: pointer; + padding: 2px +} + +.window-controls__icon[data-v-d8a38b1e]:hover { + background-color: #fff3 +} + +.head[data-v-1a9eb5e2] { + height: 40px; + background: linear-gradient(45deg, #0382dc, #0481db); + padding: 0 6px 0 0; + display: flex; + justify-content: space-between; + -webkit-app-region: drag +} + +.head_options[data-v-1a9eb5e2] { + display: flex; + align-items: center; + -webkit-app-region: no-drag +} + +.head_options_vpn[data-v-1a9eb5e2] { + cursor: pointer +} + +.head_options_vpn[data-v-1a9eb5e2]:after { + content: ""; + width: 1px; + height: 9px; + background: #fff; + margin: 0 12px 0 8px +} + +.head_options_vpn .vpn-status[data-v-1a9eb5e2] { + color: #fff; + font-size: 11px; + margin-left: 4px +} + +.timeout-tips span[data-v-b89b7792] { + color: #000000e6; + font-size: 16px; + font-weight: 700; + line-height: 24px +} + +.timeout-tips_primary[data-v-b89b7792] { + color: #1490f6 !important +} + +* { + box-sizing: border-box; + -webkit-user-select: none; + user-select: none +} + +.main { + width: 100vw; + height: calc(100vh - 40px) +} + +input::-webkit-outer-spin-button, +input::-webkit-inner-spin-button { + -webkit-appearance: none +} + +input[type=number] { + -moz-appearance: textfield +} + +.el-button:focus { + outline: none; + box-shadow: none +} + +.custom-message-box { + padding: 0 !important +} + +.custom-message-box .el-message-box__message { + width: 100% +} + +.custom-message-box .message-content { + font-size: 16px; + color: #000000e6 +} + +.notification-dialog_content[data-v-35989509] { + display: flex; + align-items: center; + padding: 14px 13px 24px +} + +.notification-dialog_content span[data-v-35989509] { + color: #000000e6; + font-size: 16px; + font-weight: 700; + margin-left: 10px +} + +.notification-dialog .dialog-footer[data-v-35989509] { + padding-right: 15px +} + +.notification-dialog .dialog-cancelText[data-v-35989509] { + background-color: #d54941; + color: #fff +} + +.menu[data-v-578cab41] { + height: 150px; + background-color: #fff; + display: flex; + align-items: center; + flex-shrink: 0; + position: relative +} + +.menu .router-link-active span[data-v-578cab41], +.menu .router-link:hover span[data-v-578cab41] { + color: #2ba8ef +} + +.menu .span-5[data-v-578cab41] { + width: 16.6666666667% +} + +.menu_tab[data-v-578cab41] { + height: 102px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center +} + +.menu_tab_img[data-v-578cab41] { + width: 70px; + height: 70px +} + +.menu_tab span[data-v-578cab41] { + color: #000; + font-size: 14px +} + +.home[data-v-83ff3653] { + height: 100%; + display: flex; + flex-direction: column +} + +.home_content[data-v-83ff3653] { + flex: 1 +} + +.date[data-v-f9f6f269] { + display: flex; + align-items: center; + margin: 20px 10px +} + +.date .date-bg[data-v-f9f6f269] { + display: flex; + flex-wrap: nowrap; + align-items: center; + width: 100%; + scrollbar-width: none +} + +.date .element[data-v-f9f6f269]::-webkit-scrollbar { + width: 0; + height: 0 +} + +.date .date-item[data-v-f9f6f269] { + min-width: 80px; + padding: 5px 0; + margin: 0 8px; + font-size: 16px; + text-align: center; + cursor: pointer +} + +.date .active[data-v-f9f6f269] { + color: #fff; + background: var(--el-color-primary); + border-radius: 15px +} + +.time[data-v-f9f6f269] { + display: flex; + justify-content: center +} + +.time .time-item[data-v-f9f6f269] { + margin-left: 0; + border: 1px solid #e6e6e6; + border-radius: 2px +} + +.time .active[data-v-f9f6f269] { + color: var(--el-color-primary) +} + +.hours[data-v-f9f6f269] { + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + height: 258px; + margin: 10px 20px; + overflow: auto +} + +.hours .active[data-v-f9f6f269] { + color: #fff; + background: var(--el-color-primary) +} + +.hours[data-v-f9f6f269] .is-text:hover { + background: var(--el-color-primary) !important +} + +.hours .el-button[data-v-f9f6f269]:hover { + color: #fff; + background: var(--el-color-primary) +} + +.hours .is-disabled[data-v-f9f6f269]:hover { + background-color: var(--el-color-primary) !important +} + +.hours .el-button[data-v-f9f6f269] { + width: 104px; + padding: 0; + margin-left: 0; + border-radius: 0 +} + +.hours .time-used[data-v-f9f6f269] { + width: 104px; + font-size: 12px; + color: #a8abb2; + text-align: center +} + +.foot-btn[data-v-f9f6f269] { + padding: 10px; + text-align: right; + border-top: 1px solid #eeeeee +} + +.request-connection .date-mask[data-v-cbe06cc0] { + position: absolute; + top: 0; + width: 530px; + height: 32px +} + +.request-connection_content[data-v-cbe06cc0] { + padding: 0 20px +} + +.request-connection_content .ca-use[data-v-cbe06cc0] { + width: 680px +} + +.request-connection_content .date[data-v-cbe06cc0] { + margin-right: 6px +} + +.request-connection_content .calendar[data-v-cbe06cc0] { + color: #999; + font-size: 12px +} + +.request-connection .dialog-footer[data-v-cbe06cc0] { + padding: 0 28px +} + +.ca-lock_join[data-v-0ccf482f] { + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center +} + +.ca-lock_join_head[data-v-0ccf482f] { + display: flex; + align-items: center +} + +.ca-lock_join_head img[data-v-0ccf482f] { + width: 70px; + height: 80px +} + +.ca-lock_join_head_right[data-v-0ccf482f] { + display: flex; + flex-direction: column; + margin-left: 12px +} + +.ca-lock_join_head_right span[data-v-0ccf482f]:first-child { + color: #fff; + font-size: 30px; + font-weight: 700 +} + +.ca-lock_join_head_right span[data-v-0ccf482f]:last-child { + color: #fff; + font-size: 14px +} + +.ca-lock_join .el-table[data-v-0ccf482f] { + margin: 20px auto 0 +} + +.ca-lock_join .table-status[data-v-0ccf482f] { + display: flex; + align-items: center +} + +.ca-lock_join .table-status span[data-v-0ccf482f] { + color: #31a3f4; + font-size: 14px; + font-weight: 500; + margin-left: 4px +} + +.ca-lock_join .table-status_circle[data-v-0ccf482f] { + width: 6px; + height: 6px; + border-radius: 3px; + background-color: #31a3f4 +} + +.ca-lock_join .table-status .el-icon[data-v-0ccf482f] { + background-color: #0d6ce4; + border-radius: 50%; + margin-left: 6px +} + +.ca-lock_join .table-status_success span[data-v-0ccf482f] { + color: #19b21e +} + +.ca-lock_join .table-status_success .table-status_circle[data-v-0ccf482f] { + background-color: #19b21e +} + +.ca-lock_join .table-status_loading span[data-v-0ccf482f] { + color: #fa9600 +} + +.ca-lock_join .table-status_loading .table-status_circle[data-v-0ccf482f] { + background-color: #fa9600 +} + +.ca-lock_join .table-status_loading .el-icon[data-v-0ccf482f] { + background-color: #0d6ce4; + border-radius: 50%; + margin-left: 6px +} + +.ca-lock_join .table-status_error span[data-v-0ccf482f] { + color: #fc474c +} + +.ca-lock_join .table-status_error .table-status_circle[data-v-0ccf482f] { + background-color: #fc474c +} + +.ca-lock_content[data-v-c20d7d76] { + height: 100%; + display: flex; + align-items: center; + justify-content: center; + position: relative +} + +.ca-lock_content .device-connect[data-v-c20d7d76] { + position: relative; + z-index: 10 +} + +.ca-lock_content .ca_lock_bg[data-v-c20d7d76], +.ca-lock_content .ca_lock_bg1[data-v-c20d7d76] { + position: absolute; + bottom: 0 +} + +.ca-lock_content .ca_lock_bg[data-v-c20d7d76] { + right: 0 +} + +.ca-lock_content .ca_lock_bg1[data-v-c20d7d76] { + left: 0 +} + +.ca-lock_content .lock_content_right[data-v-c20d7d76] { + display: flex; + align-items: center +} + +.ca-lock_content .lock_content_right span[data-v-c20d7d76] { + color: #fff; + font-size: 30px; + font-weight: 700; + margin-left: 6px +} + +.ca-lock_content .lock_content_right_tips[data-v-c20d7d76] { + color: #fff; + font-size: 18px; + margin: 10px 0 0 30px +} + +.ca-lock[data-v-6f062fde] { + height: 100%; + background: linear-gradient(90deg, #0382dc, #0481db); + position: relative +} + +.device-info[data-v-6f062fde] { + display: flex; + align-items: center; + position: absolute; + bottom: 15px; + left: 17px +} + +.device-info span[data-v-6f062fde] { + color: #fff; + font-size: 14px; + margin-right: 22px +} + +.detection[data-v-b9692364] { + height: 100%; + margin: 0 auto +} + +.detection_head[data-v-b9692364] { + display: flex; + justify-content: space-between; + align-items: center; + padding: 32px 24px 0 30px +} + +.detection_head_title[data-v-b9692364] { + color: #000; + font-size: 24px; + font-weight: 700 +} + +.detection_head_tips[data-v-b9692364] { + color: #000; + font-size: 12px; + margin-top: 4px +} + +.detection_head .el-progress[data-v-b9692364] { + width: 386px; + margin-top: 6px +} + +.detection .el-scrollbar[data-v-b9692364] { + height: 311px; + background: #edf9ff; + box-sizing: border-box; + margin-top: 22px +} + +.detection .detection_list[data-v-b9692364] { + padding: 12px 30px +} + +.detection .detection_list_txt[data-v-b9692364] { + display: flex; + align-items: center; + margin-top: 12px +} + +.detection .detection_list_txt span[data-v-b9692364] { + color: #000; + font-size: 12px +} + +.detection .detection_head[data-v-b9692364] { + padding: 16px 24px 0 30px +} + +.repair-driver-btn[data-v-b9692364] { + margin-left: auto +} + +.detection_list_txt[data-v-b9692364] { + display: flex; + align-items: center +} + +.tab[data-v-f82ec0a7] { + height: 62px; + background: linear-gradient(45deg, #0382dc, #0481db); + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 16px +} + +.tab_left[data-v-f82ec0a7] { + display: flex; + align-items: center +} + +.tab_left_item[data-v-f82ec0a7] { + width: 88px; + line-height: 32px; + color: #fff; + font-size: 14px; + font-weight: 700; + margin-right: 13px; + text-align: center; + border-radius: 100px; + cursor: pointer +} + +.tab_left_active[data-v-f82ec0a7] { + background-color: #fff; + color: #0482dc +} + +.tab_right[data-v-f82ec0a7] { + display: flex; + align-items: center +} + +.tab_right_item[data-v-f82ec0a7] { + width: 32px; + height: 32px; + border: 1px solid #fff; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-left: 15px +} + +.tab_right_item[data-v-f82ec0a7]:hover { + background-color: #fff +} + +.tab_right_item:hover .el-icon[data-v-f82ec0a7] { + color: #0482dc +} + +.tab_right_active[data-v-f82ec0a7] { + background-color: #fff +} + +.tab_right_active .el-icon[data-v-f82ec0a7] { + color: #0482dc +} + +.form[data-v-f82ec0a7] { + padding: 16px 0 0 16px; + background-color: #ebf9ff +} + +.form .el-form-item[data-v-f82ec0a7] { + margin-right: 12px +} + +.form .el-input[data-v-f82ec0a7] { + width: 15vw +} + +.form .el-select[data-v-f82ec0a7] { + width: 10vw +} + +.form .ca-type[data-v-f82ec0a7] { + width: 15vw +} + +.form[data-v-f82ec0a7] .el-form-item__label { + padding-right: 5px !important +} + +.device-item[data-v-347fd8ee] { + width: 247px; + height: 148px; + background-color: #fff; + border-radius: 8px; + margin: 0 8px 16px; + overflow: hidden +} + +.device-item_head[data-v-347fd8ee] { + height: 108px; + background-color: #4dbf6c; + padding: 10px 12px 18px; + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: space-between +} + +.device-item_head_title[data-v-347fd8ee] { + display: flex; + align-items: center; + justify-content: space-between +} + +.device-item_head_title span[data-v-347fd8ee] { + color: #fff; + font-size: 14px; + font-weight: 700 +} + +.device-item_head_bot[data-v-347fd8ee] { + min-height: 42px +} + +.device-item_head_name[data-v-347fd8ee] { + color: #fff; + font-size: 18px; + font-weight: 700; + text-align: center +} + +.device-item_head_code[data-v-347fd8ee] { + color: #fff; + font-size: 10px; + margin-top: 5px; + text-align: center +} + +.device-item_bot[data-v-347fd8ee] { + height: 40px; + background-color: #fff; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 12px +} + +.device-item_bot_left[data-v-347fd8ee] { + display: flex; + align-items: center +} + +.device-item_bot_left_before[data-v-347fd8ee] { + width: 6px; + height: 6px; + background-color: #ee516b; + border-radius: 50% +} + +.device-item_bot_left .el-icon[data-v-347fd8ee] { + background-color: #0d6ce4; + border-radius: 50% +} + +.device-item_bot_left_status[data-v-347fd8ee] { + color: #ee516b; + font-size: 12px; + font-weight: 700; + margin: 0 3px +} + +.device-item_bot_active .device-item_bot_left_before[data-v-347fd8ee] { + background-color: #67c23a +} + +.device-item_bot_active span[data-v-347fd8ee] { + color: #67c23a +} + +.device-item_bot_status[data-v-347fd8ee] { + display: flex; + align-items: center; + cursor: pointer +} + +.device-item_bot_status span[data-v-347fd8ee] { + color: #c1c1c1; + font-size: 12px; + font-weight: 500 +} + +.device-item_bot_status img[data-v-347fd8ee] { + width: 16px; + height: 16px; + margin-right: 4px +} + +.device-item_bot_status1[data-v-347fd8ee] { + display: flex; + align-items: center +} + +.device-item_bot_status1 span[data-v-347fd8ee] { + color: #0793e4 +} + +.device-item_bot_status2[data-v-347fd8ee] { + display: flex; + align-items: center +} + +.device-item_bot_status2 span[data-v-347fd8ee] { + color: #ee516b +} + +.device-item_bot_right[data-v-347fd8ee] { + color: #333; + font-size: 12px; + font-weight: 500 +} + +.el-popover .device-popover[data-v-347fd8ee] { + display: flex +} + +.el-popover .device-popover_content[data-v-347fd8ee] { + display: flex; + flex-direction: column; + margin-left: 8px +} + +.el-popover .device-popover_content span[data-v-347fd8ee] { + font-size: 14px; + color: #000; + font-weight: 700 +} + +.el-popover .device-popover_content span[data-v-347fd8ee]:last-child { + margin-top: 6px +} + +.el-popover .el-button[data-v-347fd8ee] { + margin: 16px 0 0 auto +} + +.el-popover .device-popover_btn[data-v-347fd8ee] { + display: flex; + justify-content: flex-end +} + +.port-list[data-v-adda06ba] { + margin: 0 20px +} + +.port-list_item[data-v-adda06ba] { + display: flex; + align-items: center +} + +.port-list_item_text[data-v-adda06ba] { + display: flex; + align-items: center; + height: 40px; + border: .5px solid #eaeaea; + padding: 0 15px; + font-size: 14px +} + +.port-list_item_title[data-v-adda06ba] { + width: 100px; + background-color: #f4f7f9; + color: #666 +} + +.port-list_item_content[data-v-adda06ba] { + width: 202px; + background-color: #fff; + color: #171a1d +} + +.port-list_item_type[data-v-adda06ba] { + width: 106px +} + +.port-list_item_remark[data-v-adda06ba] { + flex: 1 +} + +.port-records[data-v-adda06ba] { + padding: 12px 20px 0 +} + +.port-records_title[data-v-adda06ba] { + color: #000; + font-size: 16px; + font-weight: 700 +} + +.port-records .el-table[data-v-adda06ba] { + margin-top: 10px +} + +.port-records_pagination[data-v-adda06ba] { + display: flex; + justify-content: flex-end; + margin-top: 14px +} + +.switch-device .device-list_item[data-v-5a0ea238] { + max-height: calc(100vh - 170px); + display: flex; + flex-wrap: wrap; + padding: 0 7px; + overflow: auto; + background: linear-gradient(90deg, #f4fcff, #e5f7ff) +} + +.switch-device .device-list_item_empty[data-v-5a0ea238] { + width: 100%; + display: flex; + justify-content: center +} + +.switch-device .status[data-v-5a0ea238] { + font-size: 14px; + color: #19b31e +} + +.switch-device .status[data-v-5a0ea238]:before { + content: ""; + display: inline-block; + width: 6px; + height: 6px; + border-radius: 3px; + background-color: #19b31e; + margin-right: 4px +} + +.switch-device .status-active[data-v-5a0ea238] { + color: #fc474c +} + +.switch-device .status-active[data-v-5a0ea238]:before { + background-color: #fc474c +} + +.device-list[data-v-04d158c3] { + height: calc(100vh - 40px); + display: flex; + flex-direction: column +} + +.device-list .content[data-v-04d158c3] { + flex: 1; + background: linear-gradient(90deg, #f4fcff, #e5f7ff) +} + +.device-list .content .device-list_item[data-v-04d158c3] { + max-height: 442px; + display: flex; + flex-wrap: wrap; + padding: 0 7px; + overflow: auto +} + +.device-list .content .device-list_item_empty[data-v-04d158c3] { + width: 100%; + display: flex; + justify-content: center +} + +.user-edit[data-v-4c4b97b0] { + padding: 0 14px +} + +.user-edit_item[data-v-4c4b97b0] { + display: flex; + align-items: center; + margin-bottom: 18px +} + +.user-edit_item_label[data-v-4c4b97b0] { + width: 78px; + color: #000; + font-size: 14px; + text-align: right +} + +.user-edit_item_name[data-v-4c4b97b0] { + color: #000; + font-size: 14px; + margin-left: 22px +} + +.user-edit_item .el-select[data-v-4c4b97b0] { + width: 162px; + height: 24px; + margin-left: 22px +} + +.user-edit_item .el-select[data-v-4c4b97b0] .el-select__wrapper { + min-height: 24px +} + +.user-edit_item .el-radio-group[data-v-4c4b97b0] { + margin-left: 24px +} + +.dialog-footer[data-v-4c4b97b0] { + padding: 0 15px +} + +.user-management[data-v-729ab3ab] { + padding: 8px 10px +} + +.user-management_head[data-v-729ab3ab] { + display: flex; + align-items: center +} + +.user-management_head .label[data-v-729ab3ab] { + color: #666; + font-size: 12px; + padding-right: 6px +} + +.user-management_head .label-left[data-v-729ab3ab] { + margin-left: 16px +} + +.user-management_head .el-input[data-v-729ab3ab] { + width: 128px; + height: 24px +} + +.user-management_head .el-select[data-v-729ab3ab] { + width: 120px; + height: 24px +} + +.user-management_head .el-select[data-v-729ab3ab] .el-select__wrapper { + min-height: 24px +} + +.user-management_head_add[data-v-729ab3ab] { + display: flex; + height: 24px; + padding: 0 8px; + align-items: center; + justify-content: center; + border-radius: 2px; + background-color: #2784f4; + margin-left: 10px; + cursor: pointer +} + +.user-management_head_add span[data-v-729ab3ab] { + color: #fff; + font-size: 12px; + margin-left: 6px +} + +.user-management .el-table[data-v-729ab3ab] { + margin-top: 18px; + height: calc(100vh - 220px) +} + +.user-management .el-table .status[data-v-729ab3ab] { + display: flex; + align-items: center; + color: #67c23a; + font-size: 14px +} + +.user-management .el-table .status[data-v-729ab3ab]:before { + content: ""; + display: block; + width: 6px; + height: 6px; + border-radius: 3px; + background-color: #67c23a; + margin-right: 4px +} + +.user-management .pagination[data-v-729ab3ab] { + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 12px +} + +.add-user[data-v-770f50f5] { + padding: 0 20px +} + +.add-user .el-form-item[data-v-770f50f5] { + margin-bottom: 10px +} + +.add-user .el-input[data-v-770f50f5] { + width: 250px +} + +.add-user .el-select[data-v-770f50f5] { + width: 350px +} + +.add-user .device-group-select[data-v-770f50f5] { + width: 632px +} + +.select[data-v-770f50f5] { + display: flex; + width: 632px; + min-height: 32px; + max-height: 64px; + padding: 0 0 5px; + align-items: center; + flex-wrap: wrap; + border-radius: 3px; + border: 1px solid #dcdcdc; + overflow: auto +} + +.select_item[data-v-770f50f5] { + max-width: 264px; + height: 22px; + display: flex; + align-items: center; + color: #909399; + background-color: #f4f4f5; + padding: 0 5px; + margin-top: 5px; + margin-left: 8px +} + +.select_item_text[data-v-770f50f5] { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.select_item .el-icon[data-v-770f50f5] { + margin-left: 6px; + border-radius: 50% +} + +.select_item .el-icon[data-v-770f50f5]:hover { + background-color: var(--el-color-info); + color: var(--el-color-white) +} + +.screen[data-v-770f50f5] { + background-color: #f4fcff; + padding: 8px 10px +} + +.screen .el-form-item[data-v-770f50f5] { + margin-bottom: 0; + margin-right: 10px +} + +.screen .el-form-item[data-v-770f50f5] .el-form-item__label { + height: 24px; + line-height: 24px +} + +.screen .el-input[data-v-770f50f5] { + width: 124px; + height: 24px +} + +.el-table[data-v-770f50f5] { + margin-top: 10px +} + +.pagination[data-v-770f50f5] { + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 12px +} + +.pagination_jumper[data-v-770f50f5] { + width: 144px; + display: flex; + align-items: center; + justify-content: space-around; + border-radius: 3px; + background-color: #f3f3f3; + margin-left: 20px +} + +.pagination_jumper span[data-v-770f50f5] { + color: #0009; + font-size: 12px +} + +.pagination_jumper .el-input[data-v-770f50f5] { + width: 50px; + height: 20px +} + +.dialog-footer[data-v-770f50f5] { + padding: 0 15px +} + +.user-management[data-v-3cee0bdb] { + padding: 8px 10px +} + +.user-management_head[data-v-3cee0bdb] { + display: flex; + align-items: center +} + +.user-management_head .label[data-v-3cee0bdb] { + color: #666; + font-size: 12px; + padding-right: 6px +} + +.user-management_head .label-left[data-v-3cee0bdb] { + margin-left: 16px +} + +.user-management_head .el-input[data-v-3cee0bdb] { + width: 180px; + height: 24px +} + +.user-management_head_add[data-v-3cee0bdb] { + display: flex; + width: 104px; + height: 24px; + padding: 0 8px; + align-items: center; + border-radius: 2px; + background-color: #2784f4; + margin-left: 64px; + cursor: pointer +} + +.user-management_head_add span[data-v-3cee0bdb] { + color: #fff; + font-size: 12px; + margin-left: 6px +} + +.user-management .el-table[data-v-3cee0bdb] { + margin-top: 18px; + height: calc(100vh - 180px) +} + +.screen[data-v-6c25a848] { + background-color: #f4fcff; + padding: 8px 10px +} + +.screen .el-form-item[data-v-6c25a848] { + margin-bottom: 0; + margin-right: 10px +} + +.screen .el-form-item[data-v-6c25a848] .el-form-item__label { + height: 24px; + line-height: 24px; + padding: 0 4px 0 0 +} + +.screen .el-form-item[data-v-6c25a848] .el-select__wrapper { + min-height: 24px +} + +.screen .el-input[data-v-6c25a848] { + width: 100px; + height: 24px +} + +.screen .el-select[data-v-6c25a848] { + width: 90px; + height: 24px +} + +.screen .serial-number[data-v-6c25a848] { + width: 62px +} + +.port-name[data-v-261f6544] { + width: 732px +} + +.select[data-v-261f6544] { + display: flex; + width: 733px; + min-height: 32px; + max-height: 64px; + padding: 0 0 5px; + align-items: center; + flex-wrap: wrap; + border-radius: 3px; + border: 1px solid #dcdcdc; + overflow: auto +} + +.select_item[data-v-261f6544] { + max-width: 264px; + height: 22px; + display: flex; + align-items: center; + color: #909399; + background-color: #f4f4f5; + padding: 0 5px; + margin-top: 5px; + margin-left: 8px +} + +.select_item_text[data-v-261f6544] { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.select_item .el-icon[data-v-261f6544] { + margin-left: 6px; + border-radius: 50% +} + +.select_item .el-icon[data-v-261f6544]:hover { + background-color: var(--el-color-info); + color: var(--el-color-white) +} + +.add-user[data-v-0995fdce] { + padding: 0 20px +} + +.add-user .el-table[data-v-0995fdce] { + margin-top: 20px +} + +.add-user .pagination[data-v-0995fdce] { + display: flex; + align-items: center; + justify-content: flex-end; + margin-top: 16px +} + +.add-user .pagination_jumper[data-v-0995fdce] { + width: 144px; + display: flex; + align-items: center; + justify-content: space-around; + border-radius: 3px; + background-color: #f3f3f3; + margin-left: 20px +} + +.add-user .pagination_jumper span[data-v-0995fdce] { + color: #0009; + font-size: 12px +} + +.add-user .pagination_jumper .el-input[data-v-0995fdce] { + width: 50px; + height: 20px +} + +.dialog-footer[data-v-0995fdce] { + padding: 0 15px +} + +.user-management[data-v-fdba8a25] { + padding: 8px 10px +} + +.user-management_head[data-v-fdba8a25] { + display: flex; + align-items: center +} + +.user-management_head .label[data-v-fdba8a25] { + color: #666; + font-size: 12px; + padding-right: 6px +} + +.user-management_head .label-left[data-v-fdba8a25] { + margin-left: 16px +} + +.user-management_head .el-input[data-v-fdba8a25] { + width: 180px; + height: 24px +} + +.user-management_head_add[data-v-fdba8a25] { + display: flex; + width: 104px; + height: 24px; + padding: 0 8px; + align-items: center; + border-radius: 2px; + background-color: #2784f4; + margin-left: 64px; + cursor: pointer +} + +.user-management_head_add span[data-v-fdba8a25] { + color: #fff; + font-size: 12px; + margin-left: 6px +} + +.user-management .el-table[data-v-fdba8a25] { + height: calc(100vh - 180px); + margin-top: 18px +} + +.authorization-center[data-v-e393b41c] { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + background-color: #f4fcff +} + +.authorization-center .head[data-v-e393b41c] { + height: 73px; + display: flex; + align-items: center; + justify-content: space-between; + flex-shrink: 0; + background: linear-gradient(90deg, #0382dc, #0481db); + padding: 0 20px +} + +.authorization-center .head_title[data-v-e393b41c] { + color: #fff; + font-size: 24px; + font-weight: 700 +} + +.authorization-center .head_tab[data-v-e393b41c] { + width: 32px; + height: 32px; + border: 1px solid #fff; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center +} + +.authorization-center .head_tab[data-v-e393b41c]:hover { + background-color: #fff +} + +.authorization-center .head_tab:hover .el-icon[data-v-e393b41c] { + color: #0482dc +} + +.authorization-center .content[data-v-e393b41c] { + width: 100%; + display: flex; + flex: 1 +} + +.authorization-center .content .el-menu[data-v-e393b41c] { + width: 160px +} + +.authorization-center .content .menu-text[data-v-e393b41c] { + color: #0009; + font-size: 14px +} + +.authorization-center .content .is-active[data-v-e393b41c] { + border-right: 3px solid #0482dc +} + +.authorization-center .content .is-active span[data-v-e393b41c] { + color: #0482dc; + font-weight: 700 +} + +.authorization-center .content .right[data-v-e393b41c] { + width: calc(100vw - 160px) +} + +.user-management_head[data-v-1cb8717f] { + height: 62px; + background: linear-gradient(90deg, #0382dc, #0481db); + padding: 10px 20px; + color: #fff; + font-size: 24px; + font-weight: 700 +} + +.user-management_form[data-v-1cb8717f] { + display: flex; + align-items: center; + padding: 8px 10px +} + +.user-management_form .label[data-v-1cb8717f] { + color: #666; + font-size: 12px; + padding-right: 6px +} + +.user-management_form .label-left[data-v-1cb8717f] { + margin-left: 16px +} + +.user-management_form .el-input[data-v-1cb8717f] { + width: 180px; + height: 24px +} + +.user-management .el-table[data-v-1cb8717f] { + height: calc(100vh - 142px) +} + +.head[data-v-8f5b4226] { + display: flex; + align-items: center; + justify-content: space-between; + background: linear-gradient(90deg, #0382dc, #0481db); + color: #fff; + font-size: 24px; + font-style: normal; + font-weight: 700; + padding: 20px +} + +.head .head-right[data-v-8f5b4226] { + display: flex; + align-items: center +} + +.head .head-right .head-right-btn[data-v-8f5b4226] { + width: 30px; + height: 30px; + border: 1px solid #ffffff; + border-radius: 50%; + text-align: center; + margin: 0 5px; + cursor: pointer; + line-height: 30px +} + +.head .head-right .head-right-btn img[data-v-8f5b4226] { + width: 20px; + height: 20px +} + +.head .head-right .active[data-v-8f5b4226] { + background: #fff +} + +.filter[data-v-7dfc389c] { + display: flex; + justify-content: space-between; + align-items: center; + max-height: 50px; + margin: 10px +} + +.filter .filter-left[data-v-7dfc389c] { + color: #333 +} + +.filter .filter-left .el-form--inline .el-form-item[data-v-7dfc389c] { + margin-right: 10px; + margin-bottom: 0 +} + +.filter .filter-left .el-input[data-v-7dfc389c] { + width: 160px +} + +.filter .filter-left .select[data-v-7dfc389c] { + width: 150px +} + +.device-num[data-v-b1c3e674] { + padding: 10px; + margin-bottom: 10px; + background-color: #fff +} + +.device-num .device-port[data-v-b1c3e674] { + display: flex +} + +.device-num .device-port .port[data-v-b1c3e674] { + display: flex; + align-items: center; + justify-content: center; + width: 25%; + font-size: 15px; + border-radius: 8px +} + +.device-num .device-port .port img[data-v-b1c3e674] { + width: 54px; + height: 54px; + margin-right: 5px +} + +.device-num .device-port .port .num[data-v-b1c3e674] { + font-size: 30px; + font-weight: 600 +} + +.device-num .device-port .port .title[data-v-b1c3e674] { + color: #737577; + font-size: 12px +} + +.device-tip[data-v-b1c3e674] { + display: flex; + margin: 10px 15px; + font-size: 14px; + color: #737577 +} + +.device-tip .device-item[data-v-b1c3e674] { + display: flex; + align-items: center; + margin-right: 15px +} + +.device-tip .device-item .device-color[data-v-b1c3e674] { + width: 10px; + height: 10px; + border-radius: 2px; + margin-right: 10px +} + +.port-card[data-v-fd144d45] { + width: 100% +} + +.list-container[data-v-fd144d45] { + display: flex; + flex-wrap: wrap; + gap: 15px; + min-height: 100px; + padding: 10px; + margin-bottom: 10px; + overflow: hidden; + box-sizing: border-box +} + +.grid-content[data-v-fd144d45] { + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: space-between; + width: 250px; + height: 150px; + padding: 0; + font-size: 14px; + color: #fff; + text-align: center; + border-radius: 8px; + overflow: hidden; + position: relative +} + +.grid-content .top[data-v-fd144d45] { + display: flex; + justify-content: space-between; + margin: 10px; + box-sizing: border-box; + overflow: hidden +} + +.grid-content .lock-name[data-v-fd144d45] { + margin: 0 5px; + font-size: 18px +} + +.grid-content .lock-id[data-v-fd144d45] { + position: absolute; + font-size: 11px; + right: 10px; + bottom: 40px +} + +.grid-content .bottom[data-v-fd144d45] { + display: flex; + align-items: center; + justify-content: space-between; + height: 40px; + padding: 0 10px; + font-size: 12px; + line-height: 40px; + color: #666; + background: #fff; + border-bottom-right-radius: 7px; + border-bottom-left-radius: 7px; + box-sizing: border-box; + overflow: hidden +} + +.grid-content .bottom .bottom-item[data-v-fd144d45] { + display: flex; + align-items: center; + cursor: pointer +} + +.grid-content .bottom .bottom-item .dot[data-v-fd144d45] { + width: 5px; + height: 5px; + margin-right: 2px; + background-color: #4dbf6c; + border-radius: 50% +} + +.port-status-pop[data-v-fd144d45] { + display: flex; + margin-bottom: 10px; + color: #000; + text-align: left +} + +.ep-bg-green[data-v-fd144d45] { + background: #4dbf6c +} + +.ep-bg-blue[data-v-fd144d45] { + background: #3b88fc +} + +.ep-bg-red[data-v-fd144d45] { + background: #f79321 +} + +.ep-bg-gray[data-v-fd144d45] { + background: #838a96 +} + +.bind-btn[data-v-fd144d45] { + cursor: pointer +} + +.bottom-item[data-v-9bda7ba9] { + display: flex; + align-items: center; + cursor: pointer +} + +.bottom-item .dot[data-v-9bda7ba9] { + width: 5px; + height: 5px; + margin-right: 2px; + background-color: #4dbf6c; + border-radius: 50% +} + +.port-status-pop[data-v-9bda7ba9] { + display: flex; + margin-bottom: 10px; + color: #000; + text-align: left +} + +.port-list[data-v-9bda7ba9] { + padding: 10px +} + +.ep-bg-green[data-v-9bda7ba9] { + color: #4dbf6c +} + +.ep-bg-blue[data-v-9bda7ba9] { + color: #3b88fc +} + +.ep-bg-red[data-v-9bda7ba9] { + color: #f79321 +} + +.ep-bg-gray[data-v-9bda7ba9] { + color: #838a96 +} + +.bind-btn[data-v-9bda7ba9] { + cursor: pointer +} + +.add-port-container[data-v-aa793553] { + padding: 20px +} + +.add-port-container .el-form-item[data-v-aa793553] { + width: 44% +} + +.import-excel[data-v-8f7fcb18] { + padding: 30px 20px; + min-height: 300px +} + +.import-excel .import-excel-title[data-v-8f7fcb18] { + font-size: 14px; + color: #f54040; + margin-bottom: 10px +} + +.import-excel .import-excel-upload[data-v-8f7fcb18] { + display: flex; + align-items: flex-start +} + +.import-excel .import-progress[data-v-8f7fcb18] { + margin-top: 20px; + width: 80%; + margin-left: 80px; + background-color: #f7f8fa; + padding: 10px +} + +.import-excel .import-excel-btn[data-v-8f7fcb18] { + margin-top: 30px; + text-align: right +} + +.container[data-v-adfe2de1] { + background-color: #f4fcff; + min-height: calc(100vh - 40px) +} + +.container .content[data-v-adfe2de1] { + max-height: calc(100vh - 335px); + overflow-y: scroll +} + +.container .dialog .dialog-title[data-v-adfe2de1] { + color: #fff; + font-size: 12px; + display: flex; + align-items: center +} + +.container .dialog .dialog-title .logo[data-v-adfe2de1] { + width: 15px; + margin-right: 5px +} + +.container .dialog[data-v-adfe2de1] .el-dialog { + padding: 0; + color: #fff +} + +.container .dialog[data-v-adfe2de1] .el-dialog__header { + background-color: #1490f6; + padding: 10px 20px +} + +.container .dialog[data-v-adfe2de1] .el-dialog__header .el-dialog__close { + color: #fff +} + +.filter[data-v-43244adb] { + display: flex; + justify-content: space-between; + align-items: center; + max-height: 50px; + margin: 10px +} + +.filter .filter-left[data-v-43244adb] { + color: #333 +} + +.filter .filter-left .el-form--inline .el-form-item[data-v-43244adb] { + margin-right: 10px; + margin-bottom: 0 +} + +.filter .filter-left .el-input[data-v-43244adb] { + width: 160px +} + +.filter .filter-left .select[data-v-43244adb] { + width: 150px +} + +.card-container[data-v-87c1efb0] { + display: flex; + flex-wrap: wrap; + padding: 10px; + gap: 5px; + height: calc(100vh - 212px); + overflow-y: auto +} + +.card-item[data-v-87c1efb0] { + box-sizing: border-box; + width: 256px +} + +.box-card[data-v-87c1efb0] { + width: 100%; + height: 150px; + cursor: pointer; + background: #fff; + border: 1px solid #e7e7e7; + border-radius: 8px; + box-shadow: 0 4px 13.2px #eaeaea; + box-sizing: border-box; + overflow: hidden; + font-size: 12px +} + +.box-card[data-v-87c1efb0] .el-card__body { + padding: 10px +} + +.card-top[data-v-87c1efb0] { + display: flex +} + +.card-top .card-top-left[data-v-87c1efb0] { + width: 58px; + height: 58px; + border-radius: 5px +} + +.card-top .card-top-right[data-v-87c1efb0] { + flex: 1; + margin-left: 5px +} + +.card-top .card-top-right .card-top-right-title[data-v-87c1efb0] { + display: flex; + align-items: center; + justify-content: space-between +} + +.card-top .card-top-right .card-top-right-title .title[data-v-87c1efb0] { + max-width: 140px; + overflow: hidden; + font-size: 16px; + font-style: normal; + font-weight: 700; + color: #2f3133; + text-overflow: ellipsis; + white-space: nowrap +} + +.card-top .card-top-right .card-top-right-title .edit[data-v-87c1efb0] { + margin-left: 2px; + cursor: pointer +} + +.card-top .card-top-right .card-top-right-title .delete[data-v-87c1efb0] { + width: 24px; + height: 24px; + font-size: 16px; + padding: 5px +} + +.card-top .card-top-right .device-id[data-v-87c1efb0] { + width: 150px; + margin-top: 5px; + overflow: hidden; + font-size: 12px; + color: #999; + text-overflow: ellipsis; + white-space: nowrap +} + +.card-top .card-top-right .device-status[data-v-87c1efb0] { + display: flex; + flex-wrap: wrap; + align-items: center +} + +.card-bottom[data-v-87c1efb0] { + display: flex; + align-items: center; + justify-content: space-around; + margin-top: 10px; + font-size: 12px; + color: #959595; + text-align: center +} + +.card-bottom .num[data-v-87c1efb0] { + margin: 5px 0; + font-size: 20px; + font-weight: 500; + color: #222 +} + +.status-text[data-v-87c1efb0] { + display: flex; + align-items: center; + margin-right: 5px; + font-weight: 700 +} + +.device-list-container[data-v-78e4a380] { + padding: 10px +} + +.device-list-container .el-table[data-v-78e4a380] { + height: calc(100vh - 190px) +} + +.head[data-v-7be24886] { + display: flex; + justify-content: center; + align-items: center; + margin: 30px 0 +} + +.head .step[data-v-7be24886] { + width: 240px; + height: 40px; + padding: 0 20px +} + +.head .step1[data-v-7be24886] { + position: relative; + background: #2ca8ef; + border-radius: 4px 0 0 4px; + color: #fff; + line-height: 40px +} + +.head .step1[data-v-7be24886]:after { + content: ""; + position: absolute; + right: -20px; + top: 0; + width: 0; + height: 0; + border-top: 20px solid transparent; + border-bottom: 20px solid transparent; + border-left: 20px solid #2CA8EF; + z-index: 10 +} + +.head .step2[data-v-7be24886] { + position: relative; + background: #f7f8fa; + border-radius: 0 4px 4px 0; + color: #999; + line-height: 40px; + margin-left: 10px; + padding-left: 40px +} + +.head .step2[data-v-7be24886]:after { + content: ""; + position: absolute; + left: 0; + top: 0; + width: 0; + height: 0; + border-top: 20px solid transparent; + border-bottom: 20px solid transparent; + border-left: 20px solid #fff; + z-index: 9 +} + +.add-container[data-v-a79803e3] { + box-sizing: border-box; + padding: 20px !important; + overflow: hidden +} + +.add-container .add-form[data-v-a79803e3] { + display: flex; + justify-content: center; + margin: 20px auto +} + +.add-container .add-form .el-form[data-v-a79803e3], +.add-container .add-form .form-input[data-v-a79803e3] { + width: 100% +} + +.add-container .add-form[data-v-a79803e3] .el-form-item__label { + color: #000; + font-weight: 400 +} + +.add-container .foot-btn[data-v-a79803e3] { + padding: 10px; + text-align: right; + border-top: 1px solid #eeeeee +} + +.container[data-v-ef4e3c2a] { + background-color: #f4fcff; + min-height: calc(100vh - 40px) +} + +.container .dialog .dialog-title[data-v-ef4e3c2a] { + color: #fff; + font-size: 12px; + display: flex; + align-items: center +} + +.container .dialog .dialog-title .logo[data-v-ef4e3c2a] { + width: 15px; + margin-right: 5px +} + +.container .dialog[data-v-ef4e3c2a] .el-dialog { + padding: 0; + color: #fff +} + +.container .dialog[data-v-ef4e3c2a] .el-dialog__header { + background-color: #1490f6; + padding: 10px 20px +} + +.container .dialog[data-v-ef4e3c2a] .el-dialog__header .el-dialog__close { + color: #fff +} + +.container .pagination[data-v-ef4e3c2a] { + padding: 10px 30px; + display: flex; + justify-content: flex-end +} + +button:focus, +button:focus-visible { + outline: none +} + +.el-container[data-v-a65bf524] { + height: calc(100vh - 100px) !important +} + +.help-center[data-v-a65bf524] { + height: 100% +} + +.help-center .help-title[data-v-a65bf524] { + height: 60px; + line-height: 60px; + background: linear-gradient(90deg, #0382dc, #0481db); + color: #fff; + font-size: 24px; + font-weight: 700; + padding-left: 20px +} + +.help-center .el-container[data-v-a65bf524] { + height: 100% +} + +.help-center .el-aside[data-v-a65bf524] { + background-color: #fff; + border-right: 1px solid #e6e6e6 +} + +.help-center .el-aside .help-menu[data-v-a65bf524] { + border-right: none +} + +.help-center .el-main[data-v-a65bf524] { + padding: 20px; + background-color: #f5f7fa +} + +.help-center .el-main .content-section[data-v-a65bf524] { + background-color: #fff; + padding: 20px; + border-radius: 4px +} + +.help-center .el-main .content-section h2[data-v-a65bf524] { + font-size: 18px; + font-weight: 700; + color: #333; + border-left: 4px solid #0093ff; + padding-left: 10px; + margin: 20px 0 +} + +.help-center .el-main .content-section h2[data-v-a65bf524]:first-child { + margin-top: 0 +} + +.help-center .el-main .content-section .content-text[data-v-a65bf524] { + margin-bottom: 30px; + color: #666; + line-height: 1.8 +} + +.help-center .el-main .content-section .content-text p[data-v-a65bf524] { + margin: 12px 0 +} + +.help-center .el-main .content-section .content-text p strong[data-v-a65bf524] { + font-weight: 500; + color: #333 +} + +.document-title[data-v-b9036092] { + height: 60px; + line-height: 60px; + background: linear-gradient(90deg, #0382dc, #0481db); + color: #fff; + font-size: 24px; + font-weight: 700; + padding-left: 20px +} + +.el-container[data-v-b9036092] { + height: calc(100vh - 100px) !important +} + +.document-content[data-v-b9036092] { + width: fit-content; + margin: 0 auto; + font-size: 16px; + line-height: 30px +} + +.document-content img[data-v-b9036092] { + display: block +} + +:root { + --el-color-white: #ffffff; + --el-color-black: #000000; + --el-color-primary-rgb: 64, 158, 255; + --el-color-success-rgb: 103, 194, 58; + --el-color-warning-rgb: 230, 162, 60; + --el-color-danger-rgb: 245, 108, 108; + --el-color-error-rgb: 245, 108, 108; + --el-color-info-rgb: 144, 147, 153; + --el-font-size-extra-large: 20px; + --el-font-size-large: 18px; + --el-font-size-medium: 16px; + --el-font-size-base: 14px; + --el-font-size-small: 13px; + --el-font-size-extra-small: 12px; + --el-font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", "微软雅黑", Arial, sans-serif; + --el-font-weight-primary: 500; + --el-font-line-height-primary: 24px; + --el-index-normal: 1; + --el-index-top: 1000; + --el-index-popper: 2000; + --el-border-radius-base: 4px; + --el-border-radius-small: 2px; + --el-border-radius-round: 20px; + --el-border-radius-circle: 100%; + --el-transition-duration: .3s; + --el-transition-duration-fast: .2s; + --el-transition-function-ease-in-out-bezier: cubic-bezier(.645, .045, .355, 1); + --el-transition-function-fast-bezier: cubic-bezier(.23, 1, .32, 1); + --el-transition-all: all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier); + --el-transition-fade: opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier); + --el-transition-md-fade: transform var(--el-transition-duration) var(--el-transition-function-fast-bezier), opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier); + --el-transition-fade-linear: opacity var(--el-transition-duration-fast) linear; + --el-transition-border: border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier); + --el-transition-box-shadow: box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier); + --el-transition-color: color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier); + --el-component-size-large: 40px; + --el-component-size: 32px; + --el-component-size-small: 24px; + color-scheme: light; + --el-color-primary: #409eff; + --el-color-primary-light-3: rgb(121.3, 187.1, 255); + --el-color-primary-light-5: rgb(159.5, 206.5, 255); + --el-color-primary-light-7: rgb(197.7, 225.9, 255); + --el-color-primary-light-8: rgb(216.8, 235.6, 255); + --el-color-primary-light-9: rgb(235.9, 245.3, 255); + --el-color-primary-dark-2: rgb(51.2, 126.4, 204); + --el-color-success: #67c23a; + --el-color-success-light-3: rgb(148.6, 212.3, 117.1); + --el-color-success-light-5: rgb(179, 224.5, 156.5); + --el-color-success-light-7: rgb(209.4, 236.7, 195.9); + --el-color-success-light-8: rgb(224.6, 242.8, 215.6); + --el-color-success-light-9: rgb(239.8, 248.9, 235.3); + --el-color-success-dark-2: rgb(82.4, 155.2, 46.4); + --el-color-warning: #e6a23c; + --el-color-warning-light-3: rgb(237.5, 189.9, 118.5); + --el-color-warning-light-5: rgb(242.5, 208.5, 157.5); + --el-color-warning-light-7: rgb(247.5, 227.1, 196.5); + --el-color-warning-light-8: rgb(250, 236.4, 216); + --el-color-warning-light-9: rgb(252.5, 245.7, 235.5); + --el-color-warning-dark-2: rgb(184, 129.6, 48); + --el-color-danger: #f56c6c; + --el-color-danger-light-3: rgb(248, 152.1, 152.1); + --el-color-danger-light-5: rgb(250, 181.5, 181.5); + --el-color-danger-light-7: rgb(252, 210.9, 210.9); + --el-color-danger-light-8: rgb(253, 225.6, 225.6); + --el-color-danger-light-9: rgb(254, 240.3, 240.3); + --el-color-danger-dark-2: rgb(196, 86.4, 86.4); + --el-color-error: #f56c6c; + --el-color-error-light-3: rgb(248, 152.1, 152.1); + --el-color-error-light-5: rgb(250, 181.5, 181.5); + --el-color-error-light-7: rgb(252, 210.9, 210.9); + --el-color-error-light-8: rgb(253, 225.6, 225.6); + --el-color-error-light-9: rgb(254, 240.3, 240.3); + --el-color-error-dark-2: rgb(196, 86.4, 86.4); + --el-color-info: #909399; + --el-color-info-light-3: rgb(177.3, 179.4, 183.6); + --el-color-info-light-5: rgb(199.5, 201, 204); + --el-color-info-light-7: rgb(221.7, 222.6, 224.4); + --el-color-info-light-8: rgb(232.8, 233.4, 234.6); + --el-color-info-light-9: rgb(243.9, 244.2, 244.8); + --el-color-info-dark-2: rgb(115.2, 117.6, 122.4); + --el-bg-color: #ffffff; + --el-bg-color-page: #f2f3f5; + --el-bg-color-overlay: #ffffff; + --el-text-color-primary: #303133; + --el-text-color-regular: #606266; + --el-text-color-secondary: #909399; + --el-text-color-placeholder: #a8abb2; + --el-text-color-disabled: #c0c4cc; + --el-border-color: #dcdfe6; + --el-border-color-light: #e4e7ed; + --el-border-color-lighter: #ebeef5; + --el-border-color-extra-light: #f2f6fc; + --el-border-color-dark: #d4d7de; + --el-border-color-darker: #cdd0d6; + --el-fill-color: #f0f2f5; + --el-fill-color-light: #f5f7fa; + --el-fill-color-lighter: #fafafa; + --el-fill-color-extra-light: #fafcff; + --el-fill-color-dark: #ebedf0; + --el-fill-color-darker: #e6e8eb; + --el-fill-color-blank: #ffffff; + --el-box-shadow: 0px 12px 32px 4px rgba(0, 0, 0, .04), 0px 8px 20px rgba(0, 0, 0, .08); + --el-box-shadow-light: 0px 0px 12px rgba(0, 0, 0, .12); + --el-box-shadow-lighter: 0px 0px 6px rgba(0, 0, 0, .12); + --el-box-shadow-dark: 0px 16px 48px 16px rgba(0, 0, 0, .08), 0px 12px 32px rgba(0, 0, 0, .12), 0px 8px 16px -8px rgba(0, 0, 0, .16); + --el-disabled-bg-color: var(--el-fill-color-light); + --el-disabled-text-color: var(--el-text-color-placeholder); + --el-disabled-border-color: var(--el-border-color-light); + --el-overlay-color: rgba(0, 0, 0, .8); + --el-overlay-color-light: rgba(0, 0, 0, .7); + --el-overlay-color-lighter: rgba(0, 0, 0, .5); + --el-mask-color: rgba(255, 255, 255, .9); + --el-mask-color-extra-light: rgba(255, 255, 255, .3); + --el-border-width: 1px; + --el-border-style: solid; + --el-border-color-hover: var(--el-text-color-disabled); + --el-border: var(--el-border-width) var(--el-border-style) var(--el-border-color); + --el-svg-monochrome-grey: var(--el-border-color) +} + +.fade-in-linear-enter-active, +.fade-in-linear-leave-active { + transition: var(--el-transition-fade-linear) +} + +.fade-in-linear-enter-from, +.fade-in-linear-leave-to { + opacity: 0 +} + +.el-fade-in-linear-enter-active, +.el-fade-in-linear-leave-active { + transition: var(--el-transition-fade-linear) +} + +.el-fade-in-linear-enter-from, +.el-fade-in-linear-leave-to { + opacity: 0 +} + +.el-fade-in-enter-active, +.el-fade-in-leave-active { + transition: all var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1) +} + +.el-fade-in-enter-from, +.el-fade-in-leave-active { + opacity: 0 +} + +.el-zoom-in-center-enter-active, +.el-zoom-in-center-leave-active { + transition: all var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1) +} + +.el-zoom-in-center-enter-from, +.el-zoom-in-center-leave-active { + opacity: 0; + transform: scaleX(0) +} + +.el-zoom-in-top-enter-active, +.el-zoom-in-top-leave-active { + opacity: 1; + transform: scaleY(1); + transform-origin: center top; + transition: var(--el-transition-md-fade) +} + +.el-zoom-in-top-enter-active[data-popper-placement^=top], +.el-zoom-in-top-leave-active[data-popper-placement^=top] { + transform-origin: center bottom +} + +.el-zoom-in-top-enter-from, +.el-zoom-in-top-leave-active { + opacity: 0; + transform: scaleY(0) +} + +.el-zoom-in-bottom-enter-active, +.el-zoom-in-bottom-leave-active { + opacity: 1; + transform: scaleY(1); + transform-origin: center bottom; + transition: var(--el-transition-md-fade) +} + +.el-zoom-in-bottom-enter-from, +.el-zoom-in-bottom-leave-active { + opacity: 0; + transform: scaleY(0) +} + +.el-zoom-in-left-enter-active, +.el-zoom-in-left-leave-active { + opacity: 1; + transform: scale(1); + transform-origin: top left; + transition: var(--el-transition-md-fade) +} + +.el-zoom-in-left-enter-from, +.el-zoom-in-left-leave-active { + opacity: 0; + transform: scale(.45) +} + +.collapse-transition { + transition: var(--el-transition-duration) height ease-in-out, var(--el-transition-duration) padding-top ease-in-out, var(--el-transition-duration) padding-bottom ease-in-out +} + +.el-collapse-transition-enter-active, +.el-collapse-transition-leave-active { + transition: var(--el-transition-duration) max-height ease-in-out, var(--el-transition-duration) padding-top ease-in-out, var(--el-transition-duration) padding-bottom ease-in-out +} + +.horizontal-collapse-transition { + transition: var(--el-transition-duration) width ease-in-out, var(--el-transition-duration) padding-left ease-in-out, var(--el-transition-duration) padding-right ease-in-out +} + +.el-list-enter-active, +.el-list-leave-active { + transition: all 1s +} + +.el-list-enter-from, +.el-list-leave-to { + opacity: 0; + transform: translateY(-30px) +} + +.el-list-leave-active { + position: absolute !important +} + +.el-opacity-transition { + transition: opacity var(--el-transition-duration) cubic-bezier(.55, 0, .1, 1) +} + +.el-icon-loading { + animation: rotating 2s linear infinite +} + +.el-icon--right { + margin-left: 5px +} + +.el-icon--left { + margin-right: 5px +} + +@keyframes rotating { + 0% { + transform: rotate(0) + } + + to { + transform: rotate(1turn) + } +} + +.el-icon { + --color: inherit; + align-items: center; + display: inline-flex; + height: 1em; + justify-content: center; + line-height: 1em; + position: relative; + width: 1em; + fill: currentColor; + color: var(--color); + font-size: inherit +} + +.el-icon.is-loading { + animation: rotating 2s linear infinite +} + +.el-icon svg { + height: 1em; + width: 1em +} + +.el-affix--fixed { + position: fixed +} + +.el-alert { + --el-alert-padding: 8px 16px; + --el-alert-border-radius-base: var(--el-border-radius-base); + --el-alert-title-font-size: 14px; + --el-alert-title-with-description-font-size: 16px; + --el-alert-description-font-size: 14px; + --el-alert-close-font-size: 16px; + --el-alert-close-customed-font-size: 14px; + --el-alert-icon-size: 16px; + --el-alert-icon-large-size: 28px; + align-items: center; + background-color: var(--el-color-white); + border-radius: var(--el-alert-border-radius-base); + box-sizing: border-box; + display: flex; + margin: 0; + opacity: 1; + overflow: hidden; + padding: var(--el-alert-padding); + position: relative; + transition: opacity var(--el-transition-duration-fast); + width: 100% +} + +.el-alert.is-light .el-alert__close-btn { + color: var(--el-text-color-placeholder) +} + +.el-alert.is-dark .el-alert__close-btn, +.el-alert.is-dark .el-alert__description { + color: var(--el-color-white) +} + +.el-alert.is-center { + justify-content: center +} + +.el-alert--success { + --el-alert-bg-color: var(--el-color-success-light-9) +} + +.el-alert--success.is-light { + background-color: var(--el-alert-bg-color) +} + +.el-alert--success.is-light, +.el-alert--success.is-light .el-alert__description { + color: var(--el-color-success) +} + +.el-alert--success.is-dark { + background-color: var(--el-color-success); + color: var(--el-color-white) +} + +.el-alert--info { + --el-alert-bg-color: var(--el-color-info-light-9) +} + +.el-alert--info.is-light { + background-color: var(--el-alert-bg-color) +} + +.el-alert--info.is-light, +.el-alert--info.is-light .el-alert__description { + color: var(--el-color-info) +} + +.el-alert--info.is-dark { + background-color: var(--el-color-info); + color: var(--el-color-white) +} + +.el-alert--warning { + --el-alert-bg-color: var(--el-color-warning-light-9) +} + +.el-alert--warning.is-light { + background-color: var(--el-alert-bg-color) +} + +.el-alert--warning.is-light, +.el-alert--warning.is-light .el-alert__description { + color: var(--el-color-warning) +} + +.el-alert--warning.is-dark { + background-color: var(--el-color-warning); + color: var(--el-color-white) +} + +.el-alert--error { + --el-alert-bg-color: var(--el-color-error-light-9) +} + +.el-alert--error.is-light { + background-color: var(--el-alert-bg-color) +} + +.el-alert--error.is-light, +.el-alert--error.is-light .el-alert__description { + color: var(--el-color-error) +} + +.el-alert--error.is-dark { + background-color: var(--el-color-error); + color: var(--el-color-white) +} + +.el-alert__content { + display: flex; + flex-direction: column; + gap: 4px +} + +.el-alert .el-alert__icon { + font-size: var(--el-alert-icon-size); + margin-right: 8px; + width: var(--el-alert-icon-size) +} + +.el-alert .el-alert__icon.is-big { + font-size: var(--el-alert-icon-large-size); + margin-right: 12px; + width: var(--el-alert-icon-large-size) +} + +.el-alert__title { + font-size: var(--el-alert-title-font-size); + line-height: 24px +} + +.el-alert__title.with-description { + font-size: var(--el-alert-title-with-description-font-size) +} + +.el-alert .el-alert__description { + font-size: var(--el-alert-description-font-size); + margin: 0 +} + +.el-alert .el-alert__close-btn { + cursor: pointer; + font-size: var(--el-alert-close-font-size); + opacity: 1; + position: absolute; + right: 16px; + top: 12px +} + +.el-alert .el-alert__close-btn.is-customed { + font-size: var(--el-alert-close-customed-font-size); + font-style: normal; + line-height: 24px; + top: 8px +} + +.el-alert-fade-enter-from, +.el-alert-fade-leave-active { + opacity: 0 +} + +.el-aside { + box-sizing: border-box; + flex-shrink: 0; + overflow: auto; + width: var(--el-aside-width, 300px) +} + +.el-autocomplete { + --el-input-text-color: var(--el-text-color-regular); + --el-input-border: var(--el-border); + --el-input-hover-border: var(--el-border-color-hover); + --el-input-focus-border: var(--el-color-primary); + --el-input-transparent-border: 0 0 0 1px transparent inset; + --el-input-border-color: var(--el-border-color); + --el-input-border-radius: var(--el-border-radius-base); + --el-input-bg-color: var(--el-fill-color-blank); + --el-input-icon-color: var(--el-text-color-placeholder); + --el-input-placeholder-color: var(--el-text-color-placeholder); + --el-input-hover-border-color: var(--el-border-color-hover); + --el-input-clear-hover-color: var(--el-text-color-secondary); + --el-input-focus-border-color: var(--el-color-primary); + --el-input-width: 100%; + display: inline-block; + position: relative; + width: var(--el-input-width) +} + +.el-autocomplete__popper.el-popper { + background: var(--el-bg-color-overlay); + box-shadow: var(--el-box-shadow-light) +} + +.el-autocomplete__popper.el-popper, +.el-autocomplete__popper.el-popper .el-popper__arrow:before { + border: 1px solid var(--el-border-color-light) +} + +.el-autocomplete__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before { + border-left-color: transparent; + border-top-color: transparent +} + +.el-autocomplete__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before { + border-bottom-color: transparent; + border-right-color: transparent +} + +.el-autocomplete__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before { + border-bottom-color: transparent; + border-left-color: transparent +} + +.el-autocomplete__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before { + border-right-color: transparent; + border-top-color: transparent +} + +.el-autocomplete-suggestion { + border-radius: var(--el-border-radius-base); + box-sizing: border-box +} + +.el-autocomplete-suggestion__wrap { + box-sizing: border-box; + max-height: 280px; + padding: 10px 0 +} + +.el-autocomplete-suggestion__list { + margin: 0; + padding: 0 +} + +.el-autocomplete-suggestion li { + color: var(--el-text-color-regular); + cursor: pointer; + font-size: var(--el-font-size-base); + line-height: 34px; + list-style: none; + margin: 0; + overflow: hidden; + padding: 0 20px; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-autocomplete-suggestion li.highlighted, +.el-autocomplete-suggestion li:hover { + background-color: var(--el-fill-color-light) +} + +.el-autocomplete-suggestion li.divider { + border-top: 1px solid var(--el-color-black); + margin-top: 6px +} + +.el-autocomplete-suggestion li.divider:last-child { + margin-bottom: -6px +} + +.el-autocomplete-suggestion.is-loading li { + color: var(--el-text-color-secondary); + font-size: 20px; + height: 100px; + line-height: 100px; + text-align: center +} + +.el-autocomplete-suggestion.is-loading li:after { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle +} + +.el-autocomplete-suggestion.is-loading li:hover { + background-color: var(--el-bg-color-overlay) +} + +.el-autocomplete-suggestion.is-loading .el-icon-loading { + vertical-align: middle +} + +.el-avatar { + --el-avatar-text-color: var(--el-color-white); + --el-avatar-bg-color: var(--el-text-color-disabled); + --el-avatar-text-size: 14px; + --el-avatar-icon-size: 18px; + --el-avatar-border-radius: var(--el-border-radius-base); + --el-avatar-size-large: 56px; + --el-avatar-size-small: 24px; + --el-avatar-size: 40px; + align-items: center; + background: var(--el-avatar-bg-color); + box-sizing: border-box; + color: var(--el-avatar-text-color); + display: inline-flex; + font-size: var(--el-avatar-text-size); + height: var(--el-avatar-size); + justify-content: center; + outline: none; + overflow: hidden; + text-align: center; + width: var(--el-avatar-size) +} + +.el-avatar>img { + display: block; + height: 100%; + width: 100% +} + +.el-avatar--circle { + border-radius: 50% +} + +.el-avatar--square { + border-radius: var(--el-avatar-border-radius) +} + +.el-avatar--icon { + font-size: var(--el-avatar-icon-size) +} + +.el-avatar--small { + --el-avatar-size: 24px +} + +.el-avatar--large { + --el-avatar-size: 56px +} + +.el-backtop { + --el-backtop-bg-color: var(--el-bg-color-overlay); + --el-backtop-text-color: var(--el-color-primary); + --el-backtop-hover-bg-color: var(--el-border-color-extra-light); + align-items: center; + background-color: var(--el-backtop-bg-color); + border-radius: 50%; + box-shadow: var(--el-box-shadow-lighter); + color: var(--el-backtop-text-color); + cursor: pointer; + display: flex; + font-size: 20px; + height: 40px; + justify-content: center; + position: fixed; + width: 40px; + z-index: 5 +} + +.el-backtop:hover { + background-color: var(--el-backtop-hover-bg-color) +} + +.el-backtop__icon { + font-size: 20px +} + +.el-badge { + --el-badge-bg-color: var(--el-color-danger); + --el-badge-radius: 10px; + --el-badge-font-size: 12px; + --el-badge-padding: 6px; + --el-badge-size: 18px; + display: inline-block; + position: relative; + vertical-align: middle; + width: -moz-fit-content; + width: fit-content +} + +.el-badge__content { + align-items: center; + background-color: var(--el-badge-bg-color); + border: 1px solid var(--el-bg-color); + border-radius: var(--el-badge-radius); + color: var(--el-color-white); + display: inline-flex; + font-size: var(--el-badge-font-size); + height: var(--el-badge-size); + justify-content: center; + padding: 0 var(--el-badge-padding); + white-space: nowrap +} + +.el-badge__content.is-fixed { + position: absolute; + right: calc(1px + var(--el-badge-size)/2); + top: 0; + transform: translateY(-50%) translate(100%); + z-index: var(--el-index-normal) +} + +.el-badge__content.is-fixed.is-dot { + right: 5px +} + +.el-badge__content.is-dot { + border-radius: 50%; + height: 8px; + padding: 0; + right: 0; + width: 8px +} + +.el-badge__content.is-hide-zero { + display: none +} + +.el-badge__content--primary { + background-color: var(--el-color-primary) +} + +.el-badge__content--success { + background-color: var(--el-color-success) +} + +.el-badge__content--warning { + background-color: var(--el-color-warning) +} + +.el-badge__content--info { + background-color: var(--el-color-info) +} + +.el-badge__content--danger { + background-color: var(--el-color-danger) +} + +.el-breadcrumb { + font-size: 14px; + line-height: 1 +} + +.el-breadcrumb:after, +.el-breadcrumb:before { + content: ""; + display: table +} + +.el-breadcrumb:after { + clear: both +} + +.el-breadcrumb__separator { + color: var(--el-text-color-placeholder); + font-weight: 700; + margin: 0 9px +} + +.el-breadcrumb__separator.el-icon { + font-weight: 400; + margin: 0 6px +} + +.el-breadcrumb__separator.el-icon svg { + vertical-align: middle +} + +.el-breadcrumb__item { + align-items: center; + display: inline-flex; + float: left +} + +.el-breadcrumb__inner { + color: var(--el-text-color-regular) +} + +.el-breadcrumb__inner a, +.el-breadcrumb__inner.is-link { + color: var(--el-text-color-primary); + font-weight: 700; + text-decoration: none; + transition: var(--el-transition-color) +} + +.el-breadcrumb__inner a:hover, +.el-breadcrumb__inner.is-link:hover { + color: var(--el-color-primary); + cursor: pointer +} + +.el-breadcrumb__item:last-child .el-breadcrumb__inner, +.el-breadcrumb__item:last-child .el-breadcrumb__inner a, +.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover, +.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover { + color: var(--el-text-color-regular); + cursor: text; + font-weight: 400 +} + +.el-breadcrumb__item:last-child .el-breadcrumb__separator { + display: none +} + +.el-button-group { + display: inline-block; + vertical-align: middle +} + +.el-button-group:after, +.el-button-group:before { + content: ""; + display: table +} + +.el-button-group:after { + clear: both +} + +.el-button-group>.el-button { + float: left; + position: relative +} + +.el-button-group>.el-button+.el-button { + margin-left: 0 +} + +.el-button-group>.el-button:first-child { + border-bottom-right-radius: 0; + border-top-right-radius: 0 +} + +.el-button-group>.el-button:last-child { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.el-button-group>.el-button:first-child:last-child { + border-bottom-left-radius: var(--el-border-radius-base); + border-bottom-right-radius: var(--el-border-radius-base); + border-top-left-radius: var(--el-border-radius-base); + border-top-right-radius: var(--el-border-radius-base) +} + +.el-button-group>.el-button:first-child:last-child.is-round { + border-radius: var(--el-border-radius-round) +} + +.el-button-group>.el-button:first-child:last-child.is-circle { + border-radius: 50% +} + +.el-button-group>.el-button:not(:first-child):not(:last-child) { + border-radius: 0 +} + +.el-button-group>.el-button:not(:last-child) { + margin-right: -1px +} + +.el-button-group>.el-button.is-active, +.el-button-group>.el-button:active, +.el-button-group>.el-button:focus, +.el-button-group>.el-button:hover { + z-index: 1 +} + +.el-button-group>.el-dropdown>.el-button { + border-bottom-left-radius: 0; + border-left-color: var(--el-button-divide-border-color); + border-top-left-radius: 0 +} + +.el-button-group .el-button--primary:first-child { + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--primary:last-child { + border-left-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--primary:not(:first-child):not(:last-child) { + border-left-color: var(--el-button-divide-border-color); + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--success:first-child { + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--success:last-child { + border-left-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--success:not(:first-child):not(:last-child) { + border-left-color: var(--el-button-divide-border-color); + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--warning:first-child { + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--warning:last-child { + border-left-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--warning:not(:first-child):not(:last-child) { + border-left-color: var(--el-button-divide-border-color); + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--danger:first-child { + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--danger:last-child { + border-left-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--danger:not(:first-child):not(:last-child) { + border-left-color: var(--el-button-divide-border-color); + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--info:first-child { + border-right-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--info:last-child { + border-left-color: var(--el-button-divide-border-color) +} + +.el-button-group .el-button--info:not(:first-child):not(:last-child) { + border-left-color: var(--el-button-divide-border-color); + border-right-color: var(--el-button-divide-border-color) +} + +.el-button { + --el-button-font-weight: var(--el-font-weight-primary); + --el-button-border-color: var(--el-border-color); + --el-button-bg-color: var(--el-fill-color-blank); + --el-button-text-color: var(--el-text-color-regular); + --el-button-disabled-text-color: var(--el-disabled-text-color); + --el-button-disabled-bg-color: var(--el-fill-color-blank); + --el-button-disabled-border-color: var(--el-border-color-light); + --el-button-divide-border-color: rgba(255, 255, 255, .5); + --el-button-hover-text-color: var(--el-color-primary); + --el-button-hover-bg-color: var(--el-color-primary-light-9); + --el-button-hover-border-color: var(--el-color-primary-light-7); + --el-button-active-text-color: var(--el-button-hover-text-color); + --el-button-active-border-color: var(--el-color-primary); + --el-button-active-bg-color: var(--el-button-hover-bg-color); + --el-button-outline-color: var(--el-color-primary-light-5); + --el-button-hover-link-text-color: var(--el-text-color-secondary); + --el-button-active-color: var(--el-text-color-primary); + align-items: center; + -webkit-appearance: none; + background-color: var(--el-button-bg-color); + border: var(--el-border); + border-color: var(--el-button-border-color); + box-sizing: border-box; + color: var(--el-button-text-color); + cursor: pointer; + display: inline-flex; + font-weight: var(--el-button-font-weight); + height: 32px; + justify-content: center; + line-height: 1; + outline: none; + text-align: center; + transition: .1s; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + vertical-align: middle; + white-space: nowrap +} + +.el-button:hover { + background-color: var(--el-button-hover-bg-color); + border-color: var(--el-button-hover-border-color); + color: var(--el-button-hover-text-color); + outline: none +} + +.el-button:active { + background-color: var(--el-button-active-bg-color); + border-color: var(--el-button-active-border-color); + color: var(--el-button-active-text-color); + outline: none +} + +.el-button:focus-visible { + outline: 2px solid var(--el-button-outline-color); + outline-offset: 1px; + transition: outline-offset 0s, outline 0s +} + +.el-button>span { + align-items: center; + display: inline-flex +} + +.el-button+.el-button { + margin-left: 12px +} + +.el-button { + border-radius: var(--el-border-radius-base); + font-size: var(--el-font-size-base) +} + +.el-button, +.el-button.is-round { + padding: 8px 15px +} + +.el-button::-moz-focus-inner { + border: 0 +} + +.el-button [class*=el-icon]+span { + margin-left: 6px +} + +.el-button [class*=el-icon] svg { + vertical-align: bottom +} + +.el-button.is-plain { + --el-button-hover-text-color: var(--el-color-primary); + --el-button-hover-bg-color: var(--el-fill-color-blank); + --el-button-hover-border-color: var(--el-color-primary) +} + +.el-button.is-active { + background-color: var(--el-button-active-bg-color); + border-color: var(--el-button-active-border-color); + color: var(--el-button-active-text-color); + outline: none +} + +.el-button.is-disabled, +.el-button.is-disabled:hover { + background-color: var(--el-button-disabled-bg-color); + background-image: none; + border-color: var(--el-button-disabled-border-color); + color: var(--el-button-disabled-text-color); + cursor: not-allowed +} + +.el-button.is-loading { + pointer-events: none; + position: relative +} + +.el-button.is-loading:before { + background-color: var(--el-mask-color-extra-light); + border-radius: inherit; + bottom: -1px; + content: ""; + left: -1px; + pointer-events: none; + position: absolute; + right: -1px; + top: -1px; + z-index: 1 +} + +.el-button.is-round { + border-radius: var(--el-border-radius-round) +} + +.el-button.is-circle { + border-radius: 50%; + padding: 8px; + width: 32px +} + +.el-button.is-text { + background-color: transparent; + border: 0 solid transparent; + color: var(--el-button-text-color) +} + +.el-button.is-text.is-disabled { + background-color: transparent !important; + color: var(--el-button-disabled-text-color) +} + +.el-button.is-text:not(.is-disabled):hover { + background-color: var(--el-fill-color-light) +} + +.el-button.is-text:not(.is-disabled):focus-visible { + outline: 2px solid var(--el-button-outline-color); + outline-offset: 1px; + transition: outline-offset 0s, outline 0s +} + +.el-button.is-text:not(.is-disabled):active { + background-color: var(--el-fill-color) +} + +.el-button.is-text:not(.is-disabled).is-has-bg { + background-color: var(--el-fill-color-light) +} + +.el-button.is-text:not(.is-disabled).is-has-bg:hover { + background-color: var(--el-fill-color) +} + +.el-button.is-text:not(.is-disabled).is-has-bg:active { + background-color: var(--el-fill-color-dark) +} + +.el-button__text--expand { + letter-spacing: .3em; + margin-right: -.3em +} + +.el-button.is-link { + background: transparent; + border-color: transparent; + color: var(--el-button-text-color); + height: auto; + padding: 2px +} + +.el-button.is-link:hover { + color: var(--el-button-hover-link-text-color) +} + +.el-button.is-link.is-disabled { + background-color: transparent !important; + border-color: transparent !important; + color: var(--el-button-disabled-text-color) +} + +.el-button.is-link:not(.is-disabled):active, +.el-button.is-link:not(.is-disabled):hover { + background-color: transparent; + border-color: transparent +} + +.el-button.is-link:not(.is-disabled):active { + color: var(--el-button-active-color) +} + +.el-button--text { + background: transparent; + border-color: transparent; + color: var(--el-color-primary); + padding-left: 0; + padding-right: 0 +} + +.el-button--text.is-disabled { + background-color: transparent !important; + border-color: transparent !important; + color: var(--el-button-disabled-text-color) +} + +.el-button--text:not(.is-disabled):hover { + background-color: transparent; + border-color: transparent; + color: var(--el-color-primary-light-3) +} + +.el-button--text:not(.is-disabled):active { + background-color: transparent; + border-color: transparent; + color: var(--el-color-primary-dark-2) +} + +.el-button__link--expand { + letter-spacing: .3em; + margin-right: -.3em +} + +.el-button--primary { + --el-button-text-color: var(--el-color-white); + --el-button-bg-color: var(--el-color-primary); + --el-button-border-color: var(--el-color-primary); + --el-button-outline-color: var(--el-color-primary-light-5); + --el-button-active-color: var(--el-color-primary-dark-2); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-link-text-color: var(--el-color-primary-light-5); + --el-button-hover-bg-color: var(--el-color-primary-light-3); + --el-button-hover-border-color: var(--el-color-primary-light-3); + --el-button-active-bg-color: var(--el-color-primary-dark-2); + --el-button-active-border-color: var(--el-color-primary-dark-2); + --el-button-disabled-text-color: var(--el-color-white); + --el-button-disabled-bg-color: var(--el-color-primary-light-5); + --el-button-disabled-border-color: var(--el-color-primary-light-5) +} + +.el-button--primary.is-link, +.el-button--primary.is-plain, +.el-button--primary.is-text { + --el-button-text-color: var(--el-color-primary); + --el-button-bg-color: var(--el-color-primary-light-9); + --el-button-border-color: var(--el-color-primary-light-5); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-bg-color: var(--el-color-primary); + --el-button-hover-border-color: var(--el-color-primary); + --el-button-active-text-color: var(--el-color-white) +} + +.el-button--primary.is-link.is-disabled, +.el-button--primary.is-link.is-disabled:active, +.el-button--primary.is-link.is-disabled:focus, +.el-button--primary.is-link.is-disabled:hover, +.el-button--primary.is-plain.is-disabled, +.el-button--primary.is-plain.is-disabled:active, +.el-button--primary.is-plain.is-disabled:focus, +.el-button--primary.is-plain.is-disabled:hover, +.el-button--primary.is-text.is-disabled, +.el-button--primary.is-text.is-disabled:active, +.el-button--primary.is-text.is-disabled:focus, +.el-button--primary.is-text.is-disabled:hover { + background-color: var(--el-color-primary-light-9); + border-color: var(--el-color-primary-light-8); + color: var(--el-color-primary-light-5) +} + +.el-button--success { + --el-button-text-color: var(--el-color-white); + --el-button-bg-color: var(--el-color-success); + --el-button-border-color: var(--el-color-success); + --el-button-outline-color: var(--el-color-success-light-5); + --el-button-active-color: var(--el-color-success-dark-2); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-link-text-color: var(--el-color-success-light-5); + --el-button-hover-bg-color: var(--el-color-success-light-3); + --el-button-hover-border-color: var(--el-color-success-light-3); + --el-button-active-bg-color: var(--el-color-success-dark-2); + --el-button-active-border-color: var(--el-color-success-dark-2); + --el-button-disabled-text-color: var(--el-color-white); + --el-button-disabled-bg-color: var(--el-color-success-light-5); + --el-button-disabled-border-color: var(--el-color-success-light-5) +} + +.el-button--success.is-link, +.el-button--success.is-plain, +.el-button--success.is-text { + --el-button-text-color: var(--el-color-success); + --el-button-bg-color: var(--el-color-success-light-9); + --el-button-border-color: var(--el-color-success-light-5); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-bg-color: var(--el-color-success); + --el-button-hover-border-color: var(--el-color-success); + --el-button-active-text-color: var(--el-color-white) +} + +.el-button--success.is-link.is-disabled, +.el-button--success.is-link.is-disabled:active, +.el-button--success.is-link.is-disabled:focus, +.el-button--success.is-link.is-disabled:hover, +.el-button--success.is-plain.is-disabled, +.el-button--success.is-plain.is-disabled:active, +.el-button--success.is-plain.is-disabled:focus, +.el-button--success.is-plain.is-disabled:hover, +.el-button--success.is-text.is-disabled, +.el-button--success.is-text.is-disabled:active, +.el-button--success.is-text.is-disabled:focus, +.el-button--success.is-text.is-disabled:hover { + background-color: var(--el-color-success-light-9); + border-color: var(--el-color-success-light-8); + color: var(--el-color-success-light-5) +} + +.el-button--warning { + --el-button-text-color: var(--el-color-white); + --el-button-bg-color: var(--el-color-warning); + --el-button-border-color: var(--el-color-warning); + --el-button-outline-color: var(--el-color-warning-light-5); + --el-button-active-color: var(--el-color-warning-dark-2); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-link-text-color: var(--el-color-warning-light-5); + --el-button-hover-bg-color: var(--el-color-warning-light-3); + --el-button-hover-border-color: var(--el-color-warning-light-3); + --el-button-active-bg-color: var(--el-color-warning-dark-2); + --el-button-active-border-color: var(--el-color-warning-dark-2); + --el-button-disabled-text-color: var(--el-color-white); + --el-button-disabled-bg-color: var(--el-color-warning-light-5); + --el-button-disabled-border-color: var(--el-color-warning-light-5) +} + +.el-button--warning.is-link, +.el-button--warning.is-plain, +.el-button--warning.is-text { + --el-button-text-color: var(--el-color-warning); + --el-button-bg-color: var(--el-color-warning-light-9); + --el-button-border-color: var(--el-color-warning-light-5); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-bg-color: var(--el-color-warning); + --el-button-hover-border-color: var(--el-color-warning); + --el-button-active-text-color: var(--el-color-white) +} + +.el-button--warning.is-link.is-disabled, +.el-button--warning.is-link.is-disabled:active, +.el-button--warning.is-link.is-disabled:focus, +.el-button--warning.is-link.is-disabled:hover, +.el-button--warning.is-plain.is-disabled, +.el-button--warning.is-plain.is-disabled:active, +.el-button--warning.is-plain.is-disabled:focus, +.el-button--warning.is-plain.is-disabled:hover, +.el-button--warning.is-text.is-disabled, +.el-button--warning.is-text.is-disabled:active, +.el-button--warning.is-text.is-disabled:focus, +.el-button--warning.is-text.is-disabled:hover { + background-color: var(--el-color-warning-light-9); + border-color: var(--el-color-warning-light-8); + color: var(--el-color-warning-light-5) +} + +.el-button--danger { + --el-button-text-color: var(--el-color-white); + --el-button-bg-color: var(--el-color-danger); + --el-button-border-color: var(--el-color-danger); + --el-button-outline-color: var(--el-color-danger-light-5); + --el-button-active-color: var(--el-color-danger-dark-2); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-link-text-color: var(--el-color-danger-light-5); + --el-button-hover-bg-color: var(--el-color-danger-light-3); + --el-button-hover-border-color: var(--el-color-danger-light-3); + --el-button-active-bg-color: var(--el-color-danger-dark-2); + --el-button-active-border-color: var(--el-color-danger-dark-2); + --el-button-disabled-text-color: var(--el-color-white); + --el-button-disabled-bg-color: var(--el-color-danger-light-5); + --el-button-disabled-border-color: var(--el-color-danger-light-5) +} + +.el-button--danger.is-link, +.el-button--danger.is-plain, +.el-button--danger.is-text { + --el-button-text-color: var(--el-color-danger); + --el-button-bg-color: var(--el-color-danger-light-9); + --el-button-border-color: var(--el-color-danger-light-5); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-bg-color: var(--el-color-danger); + --el-button-hover-border-color: var(--el-color-danger); + --el-button-active-text-color: var(--el-color-white) +} + +.el-button--danger.is-link.is-disabled, +.el-button--danger.is-link.is-disabled:active, +.el-button--danger.is-link.is-disabled:focus, +.el-button--danger.is-link.is-disabled:hover, +.el-button--danger.is-plain.is-disabled, +.el-button--danger.is-plain.is-disabled:active, +.el-button--danger.is-plain.is-disabled:focus, +.el-button--danger.is-plain.is-disabled:hover, +.el-button--danger.is-text.is-disabled, +.el-button--danger.is-text.is-disabled:active, +.el-button--danger.is-text.is-disabled:focus, +.el-button--danger.is-text.is-disabled:hover { + background-color: var(--el-color-danger-light-9); + border-color: var(--el-color-danger-light-8); + color: var(--el-color-danger-light-5) +} + +.el-button--info { + --el-button-text-color: var(--el-color-white); + --el-button-bg-color: var(--el-color-info); + --el-button-border-color: var(--el-color-info); + --el-button-outline-color: var(--el-color-info-light-5); + --el-button-active-color: var(--el-color-info-dark-2); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-link-text-color: var(--el-color-info-light-5); + --el-button-hover-bg-color: var(--el-color-info-light-3); + --el-button-hover-border-color: var(--el-color-info-light-3); + --el-button-active-bg-color: var(--el-color-info-dark-2); + --el-button-active-border-color: var(--el-color-info-dark-2); + --el-button-disabled-text-color: var(--el-color-white); + --el-button-disabled-bg-color: var(--el-color-info-light-5); + --el-button-disabled-border-color: var(--el-color-info-light-5) +} + +.el-button--info.is-link, +.el-button--info.is-plain, +.el-button--info.is-text { + --el-button-text-color: var(--el-color-info); + --el-button-bg-color: var(--el-color-info-light-9); + --el-button-border-color: var(--el-color-info-light-5); + --el-button-hover-text-color: var(--el-color-white); + --el-button-hover-bg-color: var(--el-color-info); + --el-button-hover-border-color: var(--el-color-info); + --el-button-active-text-color: var(--el-color-white) +} + +.el-button--info.is-link.is-disabled, +.el-button--info.is-link.is-disabled:active, +.el-button--info.is-link.is-disabled:focus, +.el-button--info.is-link.is-disabled:hover, +.el-button--info.is-plain.is-disabled, +.el-button--info.is-plain.is-disabled:active, +.el-button--info.is-plain.is-disabled:focus, +.el-button--info.is-plain.is-disabled:hover, +.el-button--info.is-text.is-disabled, +.el-button--info.is-text.is-disabled:active, +.el-button--info.is-text.is-disabled:focus, +.el-button--info.is-text.is-disabled:hover { + background-color: var(--el-color-info-light-9); + border-color: var(--el-color-info-light-8); + color: var(--el-color-info-light-5) +} + +.el-button--large { + --el-button-size: 40px; + height: var(--el-button-size) +} + +.el-button--large [class*=el-icon]+span { + margin-left: 8px +} + +.el-button--large { + border-radius: var(--el-border-radius-base); + font-size: var(--el-font-size-base); + padding: 12px 19px +} + +.el-button--large.is-round { + padding: 12px 19px +} + +.el-button--large.is-circle { + padding: 12px; + width: var(--el-button-size) +} + +.el-button--small { + --el-button-size: 24px; + height: var(--el-button-size) +} + +.el-button--small [class*=el-icon]+span { + margin-left: 4px +} + +.el-button--small { + border-radius: calc(var(--el-border-radius-base) - 1px); + font-size: 12px; + padding: 5px 11px +} + +.el-button--small.is-round { + padding: 5px 11px +} + +.el-button--small.is-circle { + padding: 5px; + width: var(--el-button-size) +} + +.el-calendar { + --el-calendar-border: var(--el-table-border, 1px solid var(--el-border-color-lighter)); + --el-calendar-header-border-bottom: var(--el-calendar-border); + --el-calendar-selected-bg-color: var(--el-color-primary-light-9); + --el-calendar-cell-width: 85px; + background-color: var(--el-fill-color-blank) +} + +.el-calendar__header { + border-bottom: var(--el-calendar-header-border-bottom); + display: flex; + justify-content: space-between; + padding: 12px 20px +} + +.el-calendar__title { + align-self: center; + color: var(--el-text-color) +} + +.el-calendar__body { + padding: 12px 20px 35px +} + +.el-calendar-table { + table-layout: fixed; + width: 100% +} + +.el-calendar-table thead th { + color: var(--el-text-color-regular); + font-weight: 400; + padding: 12px 0 +} + +.el-calendar-table:not(.is-range) td.next, +.el-calendar-table:not(.is-range) td.prev { + color: var(--el-text-color-placeholder) +} + +.el-calendar-table td { + border-bottom: var(--el-calendar-border); + border-right: var(--el-calendar-border); + transition: background-color var(--el-transition-duration-fast) ease; + vertical-align: top +} + +.el-calendar-table td.is-selected { + background-color: var(--el-calendar-selected-bg-color) +} + +.el-calendar-table td.is-today { + color: var(--el-color-primary) +} + +.el-calendar-table tr:first-child td { + border-top: var(--el-calendar-border) +} + +.el-calendar-table tr td:first-child { + border-left: var(--el-calendar-border) +} + +.el-calendar-table tr.el-calendar-table__row--hide-border td { + border-top: none +} + +.el-calendar-table .el-calendar-day { + box-sizing: border-box; + height: var(--el-calendar-cell-width); + padding: 8px +} + +.el-calendar-table .el-calendar-day:hover { + background-color: var(--el-calendar-selected-bg-color); + cursor: pointer +} + +.el-card { + --el-card-border-color: var(--el-border-color-light); + --el-card-border-radius: 4px; + --el-card-padding: 20px; + --el-card-bg-color: var(--el-fill-color-blank); + background-color: var(--el-card-bg-color); + border: 1px solid var(--el-card-border-color); + border-radius: var(--el-card-border-radius); + color: var(--el-text-color-primary); + overflow: hidden; + transition: var(--el-transition-duration) +} + +.el-card.is-always-shadow, +.el-card.is-hover-shadow:focus, +.el-card.is-hover-shadow:hover { + box-shadow: var(--el-box-shadow-light) +} + +.el-card__header { + border-bottom: 1px solid var(--el-card-border-color); + box-sizing: border-box; + padding: calc(var(--el-card-padding) - 2px) var(--el-card-padding) +} + +.el-card__body { + padding: var(--el-card-padding) +} + +.el-card__footer { + border-top: 1px solid var(--el-card-border-color); + box-sizing: border-box; + padding: calc(var(--el-card-padding) - 2px) var(--el-card-padding) +} + +.el-carousel__item { + display: inline-block; + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100% +} + +.el-carousel__item, +.el-carousel__item.is-active { + z-index: calc(var(--el-index-normal) - 1) +} + +.el-carousel__item--card, +.el-carousel__item.is-animating { + transition: transform .4s ease-in-out +} + +.el-carousel__item--card { + width: 50% +} + +.el-carousel__item--card.is-in-stage { + cursor: pointer; + z-index: var(--el-index-normal) +} + +.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask, +.el-carousel__item--card.is-in-stage:hover .el-carousel__mask { + opacity: .12 +} + +.el-carousel__item--card.is-active { + z-index: calc(var(--el-index-normal) + 1) +} + +.el-carousel__item--card-vertical { + height: 50%; + width: 100% +} + +.el-carousel__mask { + background-color: var(--el-color-white); + height: 100%; + left: 0; + opacity: .24; + position: absolute; + top: 0; + transition: var(--el-transition-duration-fast); + width: 100% +} + +.el-carousel { + --el-carousel-arrow-font-size: 12px; + --el-carousel-arrow-size: 36px; + --el-carousel-arrow-background: rgba(31, 45, 61, .11); + --el-carousel-arrow-hover-background: rgba(31, 45, 61, .23); + --el-carousel-indicator-width: 30px; + --el-carousel-indicator-height: 2px; + --el-carousel-indicator-padding-horizontal: 4px; + --el-carousel-indicator-padding-vertical: 12px; + --el-carousel-indicator-out-color: var(--el-border-color-hover); + position: relative +} + +.el-carousel--horizontal, +.el-carousel--vertical { + overflow: hidden +} + +.el-carousel__container { + height: 300px; + position: relative +} + +.el-carousel__arrow { + align-items: center; + background-color: var(--el-carousel-arrow-background); + border: none; + border-radius: 50%; + color: #fff; + cursor: pointer; + display: inline-flex; + font-size: var(--el-carousel-arrow-font-size); + height: var(--el-carousel-arrow-size); + justify-content: center; + margin: 0; + outline: none; + padding: 0; + position: absolute; + text-align: center; + top: 50%; + transform: translateY(-50%); + transition: var(--el-transition-duration); + width: var(--el-carousel-arrow-size); + z-index: 10 +} + +.el-carousel__arrow--left { + left: 16px +} + +.el-carousel__arrow--right { + right: 16px +} + +.el-carousel__arrow:hover { + background-color: var(--el-carousel-arrow-hover-background) +} + +.el-carousel__arrow i { + cursor: pointer +} + +.el-carousel__indicators { + list-style: none; + margin: 0; + padding: 0; + position: absolute; + z-index: calc(var(--el-index-normal) + 1) +} + +.el-carousel__indicators--horizontal { + bottom: 0; + left: 50%; + transform: translate(-50%) +} + +.el-carousel__indicators--vertical { + right: 0; + top: 50%; + transform: translateY(-50%) +} + +.el-carousel__indicators--outside { + bottom: calc(var(--el-carousel-indicator-height) + var(--el-carousel-indicator-padding-vertical)*2); + position: static; + text-align: center; + transform: none +} + +.el-carousel__indicators--outside .el-carousel__indicator:hover button { + opacity: .64 +} + +.el-carousel__indicators--outside button { + background-color: var(--el-carousel-indicator-out-color); + opacity: .24 +} + +.el-carousel__indicators--right { + right: 0 +} + +.el-carousel__indicators--labels { + left: 0; + right: 0; + text-align: center; + transform: none +} + +.el-carousel__indicators--labels .el-carousel__button { + color: #000; + font-size: 12px; + height: auto; + padding: 2px 18px; + width: auto +} + +.el-carousel__indicators--labels .el-carousel__indicator { + padding: 6px 4px +} + +.el-carousel__indicator { + background-color: transparent; + cursor: pointer +} + +.el-carousel__indicator:hover button { + opacity: .72 +} + +.el-carousel__indicator--horizontal { + display: inline-block; + padding: var(--el-carousel-indicator-padding-vertical) var(--el-carousel-indicator-padding-horizontal) +} + +.el-carousel__indicator--vertical { + padding: var(--el-carousel-indicator-padding-horizontal) var(--el-carousel-indicator-padding-vertical) +} + +.el-carousel__indicator--vertical .el-carousel__button { + height: calc(var(--el-carousel-indicator-width)/2); + width: var(--el-carousel-indicator-height) +} + +.el-carousel__indicator.is-active button { + opacity: 1 +} + +.el-carousel__button { + background-color: #fff; + border: none; + cursor: pointer; + display: block; + height: var(--el-carousel-indicator-height); + margin: 0; + opacity: .48; + outline: none; + padding: 0; + transition: var(--el-transition-duration); + width: var(--el-carousel-indicator-width) +} + +.carousel-arrow-left-enter-from, +.carousel-arrow-left-leave-active { + opacity: 0; + transform: translateY(-50%) translate(-10px) +} + +.carousel-arrow-right-enter-from, +.carousel-arrow-right-leave-active { + opacity: 0; + transform: translateY(-50%) translate(10px) +} + +.el-transitioning { + filter: url(#elCarouselHorizontal) +} + +.el-transitioning-vertical { + filter: url(#elCarouselVertical) +} + +.el-cascader-panel { + --el-cascader-menu-text-color: var(--el-text-color-regular); + --el-cascader-menu-selected-text-color: var(--el-color-primary); + --el-cascader-menu-fill: var(--el-bg-color-overlay); + --el-cascader-menu-font-size: var(--el-font-size-base); + --el-cascader-menu-radius: var(--el-border-radius-base); + --el-cascader-menu-border: solid 1px var(--el-border-color-light); + --el-cascader-menu-shadow: var(--el-box-shadow-light); + --el-cascader-node-background-hover: var(--el-fill-color-light); + --el-cascader-node-color-disabled: var(--el-text-color-placeholder); + --el-cascader-color-empty: var(--el-text-color-placeholder); + --el-cascader-tag-background: var(--el-fill-color); + border-radius: var(--el-cascader-menu-radius); + display: flex; + font-size: var(--el-cascader-menu-font-size) +} + +.el-cascader-panel.is-bordered { + border: var(--el-cascader-menu-border); + border-radius: var(--el-cascader-menu-radius) +} + +.el-cascader-menu { + border-right: var(--el-cascader-menu-border); + box-sizing: border-box; + color: var(--el-cascader-menu-text-color); + min-width: 180px +} + +.el-cascader-menu:last-child { + border-right: none +} + +.el-cascader-menu:last-child .el-cascader-node { + padding-right: 20px +} + +.el-cascader-menu__wrap.el-scrollbar__wrap { + height: 204px +} + +.el-cascader-menu__list { + box-sizing: border-box; + list-style: none; + margin: 0; + min-height: 100%; + padding: 6px 0; + position: relative +} + +.el-cascader-menu__hover-zone { + height: 100%; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + width: 100% +} + +.el-cascader-menu__empty-text { + align-items: center; + color: var(--el-cascader-color-empty); + display: flex; + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%) +} + +.el-cascader-menu__empty-text .is-loading { + margin-right: 2px +} + +.el-cascader-node { + align-items: center; + display: flex; + height: 34px; + line-height: 34px; + outline: none; + padding: 0 30px 0 20px; + position: relative +} + +.el-cascader-node.is-selectable.in-active-path { + color: var(--el-cascader-menu-text-color) +} + +.el-cascader-node.in-active-path, +.el-cascader-node.is-active, +.el-cascader-node.is-selectable.in-checked-path { + color: var(--el-cascader-menu-selected-text-color); + font-weight: 700 +} + +.el-cascader-node:not(.is-disabled) { + cursor: pointer +} + +.el-cascader-node:not(.is-disabled):focus, +.el-cascader-node:not(.is-disabled):hover { + background: var(--el-cascader-node-background-hover) +} + +.el-cascader-node.is-disabled { + color: var(--el-cascader-node-color-disabled); + cursor: not-allowed +} + +.el-cascader-node__prefix { + left: 10px; + position: absolute +} + +.el-cascader-node__postfix { + position: absolute; + right: 10px +} + +.el-cascader-node__label { + flex: 1; + overflow: hidden; + padding: 0 8px; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-cascader-node>.el-checkbox, +.el-cascader-node>.el-radio { + margin-right: 0 +} + +.el-cascader-node>.el-radio .el-radio__label { + padding-left: 0 +} + +.el-cascader { + --el-cascader-menu-text-color: var(--el-text-color-regular); + --el-cascader-menu-selected-text-color: var(--el-color-primary); + --el-cascader-menu-fill: var(--el-bg-color-overlay); + --el-cascader-menu-font-size: var(--el-font-size-base); + --el-cascader-menu-radius: var(--el-border-radius-base); + --el-cascader-menu-border: solid 1px var(--el-border-color-light); + --el-cascader-menu-shadow: var(--el-box-shadow-light); + --el-cascader-node-background-hover: var(--el-fill-color-light); + --el-cascader-node-color-disabled: var(--el-text-color-placeholder); + --el-cascader-color-empty: var(--el-text-color-placeholder); + --el-cascader-tag-background: var(--el-fill-color); + display: inline-block; + font-size: var(--el-font-size-base); + line-height: 32px; + outline: none; + position: relative; + vertical-align: middle +} + +.el-cascader:not(.is-disabled):hover .el-input__wrapper { + box-shadow: 0 0 0 1px var(--el-input-hover-border-color) inset; + cursor: pointer +} + +.el-cascader .el-input { + cursor: pointer; + display: flex +} + +.el-cascader .el-input .el-input__inner { + cursor: pointer; + text-overflow: ellipsis +} + +.el-cascader .el-input .el-input__suffix-inner .el-icon { + height: calc(100% - 2px) +} + +.el-cascader .el-input .el-input__suffix-inner .el-icon svg { + vertical-align: middle +} + +.el-cascader .el-input .icon-arrow-down { + font-size: 14px; + transition: transform var(--el-transition-duration) +} + +.el-cascader .el-input .icon-arrow-down.is-reverse { + transform: rotate(180deg) +} + +.el-cascader .el-input .icon-circle-close:hover { + color: var(--el-input-clear-hover-color, var(--el-text-color-secondary)) +} + +.el-cascader .el-input.is-focus .el-input__wrapper { + box-shadow: 0 0 0 1px var(--el-input-focus-border-color, var(--el-color-primary)) inset +} + +.el-cascader--large { + font-size: 14px; + line-height: 40px +} + +.el-cascader--large .el-cascader__tags { + gap: 6px; + padding: 8px +} + +.el-cascader--large .el-cascader__search-input { + height: 24px; + margin-left: 7px +} + +.el-cascader--small { + font-size: 12px; + line-height: 24px +} + +.el-cascader--small .el-cascader__tags { + gap: 4px; + padding: 2px +} + +.el-cascader--small .el-cascader__search-input { + height: 20px; + margin-left: 5px +} + +.el-cascader.is-disabled .el-cascader__label { + color: var(--el-disabled-text-color); + z-index: calc(var(--el-index-normal) + 1) +} + +.el-cascader__dropdown { + --el-cascader-menu-text-color: var(--el-text-color-regular); + --el-cascader-menu-selected-text-color: var(--el-color-primary); + --el-cascader-menu-fill: var(--el-bg-color-overlay); + --el-cascader-menu-font-size: var(--el-font-size-base); + --el-cascader-menu-radius: var(--el-border-radius-base); + --el-cascader-menu-border: solid 1px var(--el-border-color-light); + --el-cascader-menu-shadow: var(--el-box-shadow-light); + --el-cascader-node-background-hover: var(--el-fill-color-light); + --el-cascader-node-color-disabled: var(--el-text-color-placeholder); + --el-cascader-color-empty: var(--el-text-color-placeholder); + --el-cascader-tag-background: var(--el-fill-color); + border-radius: var(--el-cascader-menu-radius); + font-size: var(--el-cascader-menu-font-size) +} + +.el-cascader__dropdown.el-popper { + background: var(--el-cascader-menu-fill) +} + +.el-cascader__dropdown.el-popper, +.el-cascader__dropdown.el-popper .el-popper__arrow:before { + border: var(--el-cascader-menu-border) +} + +.el-cascader__dropdown.el-popper[data-popper-placement^=top] .el-popper__arrow:before { + border-left-color: transparent; + border-top-color: transparent +} + +.el-cascader__dropdown.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before { + border-bottom-color: transparent; + border-right-color: transparent +} + +.el-cascader__dropdown.el-popper[data-popper-placement^=left] .el-popper__arrow:before { + border-bottom-color: transparent; + border-left-color: transparent +} + +.el-cascader__dropdown.el-popper[data-popper-placement^=right] .el-popper__arrow:before { + border-right-color: transparent; + border-top-color: transparent +} + +.el-cascader__dropdown.el-popper { + box-shadow: var(--el-cascader-menu-shadow) +} + +.el-cascader__tags { + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + gap: 6px; + left: 0; + line-height: normal; + padding: 4px; + position: absolute; + right: 30px; + text-align: left; + top: 50%; + transform: translateY(-50%) +} + +.el-cascader__tags .el-tag { + align-items: center; + background: var(--el-cascader-tag-background); + display: inline-flex; + max-width: 100%; + text-overflow: ellipsis +} + +.el-cascader__tags .el-tag.el-tag--dark, +.el-cascader__tags .el-tag.el-tag--plain { + background-color: var(--el-tag-bg-color) +} + +.el-cascader__tags .el-tag:not(.is-hit) { + border-color: transparent +} + +.el-cascader__tags .el-tag:not(.is-hit).el-tag--dark, +.el-cascader__tags .el-tag:not(.is-hit).el-tag--plain { + border-color: var(--el-tag-border-color) +} + +.el-cascader__tags .el-tag>span { + flex: 1; + overflow: hidden; + text-overflow: ellipsis +} + +.el-cascader__tags .el-tag .el-icon-close { + background-color: var(--el-text-color-placeholder); + color: var(--el-color-white); + flex: none +} + +.el-cascader__tags .el-tag .el-icon-close:hover { + background-color: var(--el-text-color-secondary) +} + +.el-cascader__tags .el-tag+input { + margin-left: 0 +} + +.el-cascader__tags.is-validate { + right: 55px +} + +.el-cascader__collapse-tags { + white-space: normal; + z-index: var(--el-index-normal) +} + +.el-cascader__collapse-tags .el-tag { + align-items: center; + background: var(--el-fill-color); + display: inline-flex; + max-width: 100%; + text-overflow: ellipsis +} + +.el-cascader__collapse-tags .el-tag.el-tag--dark, +.el-cascader__collapse-tags .el-tag.el-tag--plain { + background-color: var(--el-tag-bg-color) +} + +.el-cascader__collapse-tags .el-tag:not(.is-hit) { + border-color: transparent +} + +.el-cascader__collapse-tags .el-tag:not(.is-hit).el-tag--dark, +.el-cascader__collapse-tags .el-tag:not(.is-hit).el-tag--plain { + border-color: var(--el-tag-border-color) +} + +.el-cascader__collapse-tags .el-tag>span { + flex: 1; + overflow: hidden; + text-overflow: ellipsis +} + +.el-cascader__collapse-tags .el-tag .el-icon-close { + background-color: var(--el-text-color-placeholder); + color: var(--el-color-white); + flex: none +} + +.el-cascader__collapse-tags .el-tag .el-icon-close:hover { + background-color: var(--el-text-color-secondary) +} + +.el-cascader__collapse-tags .el-tag+input { + margin-left: 0 +} + +.el-cascader__suggestion-panel { + border-radius: var(--el-cascader-menu-radius) +} + +.el-cascader__suggestion-list { + color: var(--el-cascader-menu-text-color); + font-size: var(--el-font-size-base); + margin: 0; + max-height: 204px; + padding: 6px 0; + text-align: center +} + +.el-cascader__suggestion-item { + align-items: center; + cursor: pointer; + display: flex; + height: 34px; + justify-content: space-between; + outline: none; + padding: 0 15px; + text-align: left +} + +.el-cascader__suggestion-item:focus, +.el-cascader__suggestion-item:hover { + background: var(--el-cascader-node-background-hover) +} + +.el-cascader__suggestion-item.is-checked { + color: var(--el-cascader-menu-selected-text-color); + font-weight: 700 +} + +.el-cascader__suggestion-item>span { + margin-right: 10px +} + +.el-cascader__empty-text { + color: var(--el-cascader-color-empty); + margin: 10px 0 +} + +.el-cascader__search-input { + background: transparent; + border: none; + box-sizing: border-box; + color: var(--el-cascader-menu-text-color); + flex: 1; + height: 24px; + margin-left: 7px; + min-width: 60px; + outline: none; + padding: 0 +} + +.el-cascader__search-input::-moz-placeholder { + color: transparent +} + +.el-cascader__search-input::placeholder { + color: transparent +} + +.el-check-tag { + background-color: var(--el-color-info-light-9); + border-radius: var(--el-border-radius-base); + color: var(--el-color-info); + cursor: pointer; + display: inline-block; + font-size: var(--el-font-size-base); + font-weight: 700; + line-height: var(--el-font-size-base); + padding: 7px 15px; + transition: var(--el-transition-all) +} + +.el-check-tag:hover { + background-color: var(--el-color-info-light-7) +} + +.el-check-tag.el-check-tag--primary.is-checked { + background-color: var(--el-color-primary-light-8); + color: var(--el-color-primary) +} + +.el-check-tag.el-check-tag--primary.is-checked:hover { + background-color: var(--el-color-primary-light-7) +} + +.el-check-tag.el-check-tag--primary.is-checked.is-disabled { + background-color: var(--el-color-primary-light-8); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--primary.is-checked.is-disabled:hover { + background-color: var(--el-color-primary-light-8) +} + +.el-check-tag.el-check-tag--primary.is-disabled { + background-color: var(--el-color-info-light-9); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--primary.is-disabled:hover { + background-color: var(--el-color-info-light-9) +} + +.el-check-tag.el-check-tag--success.is-checked { + background-color: var(--el-color-success-light-8); + color: var(--el-color-success) +} + +.el-check-tag.el-check-tag--success.is-checked:hover { + background-color: var(--el-color-success-light-7) +} + +.el-check-tag.el-check-tag--success.is-checked.is-disabled { + background-color: var(--el-color-success-light-8); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--success.is-checked.is-disabled:hover { + background-color: var(--el-color-success-light-8) +} + +.el-check-tag.el-check-tag--success.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--success.is-disabled, +.el-check-tag.el-check-tag--success.is-disabled:hover { + background-color: var(--el-color-success-light-9) +} + +.el-check-tag.el-check-tag--warning.is-checked { + background-color: var(--el-color-warning-light-8); + color: var(--el-color-warning) +} + +.el-check-tag.el-check-tag--warning.is-checked:hover { + background-color: var(--el-color-warning-light-7) +} + +.el-check-tag.el-check-tag--warning.is-checked.is-disabled { + background-color: var(--el-color-warning-light-8); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--warning.is-checked.is-disabled:hover { + background-color: var(--el-color-warning-light-8) +} + +.el-check-tag.el-check-tag--warning.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--warning.is-disabled, +.el-check-tag.el-check-tag--warning.is-disabled:hover { + background-color: var(--el-color-warning-light-9) +} + +.el-check-tag.el-check-tag--danger.is-checked { + background-color: var(--el-color-danger-light-8); + color: var(--el-color-danger) +} + +.el-check-tag.el-check-tag--danger.is-checked:hover { + background-color: var(--el-color-danger-light-7) +} + +.el-check-tag.el-check-tag--danger.is-checked.is-disabled { + background-color: var(--el-color-danger-light-8); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--danger.is-checked.is-disabled:hover { + background-color: var(--el-color-danger-light-8) +} + +.el-check-tag.el-check-tag--danger.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--danger.is-disabled, +.el-check-tag.el-check-tag--danger.is-disabled:hover { + background-color: var(--el-color-danger-light-9) +} + +.el-check-tag.el-check-tag--error.is-checked { + background-color: var(--el-color-error-light-8); + color: var(--el-color-error) +} + +.el-check-tag.el-check-tag--error.is-checked:hover { + background-color: var(--el-color-error-light-7) +} + +.el-check-tag.el-check-tag--error.is-checked.is-disabled { + background-color: var(--el-color-error-light-8); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--error.is-checked.is-disabled:hover { + background-color: var(--el-color-error-light-8) +} + +.el-check-tag.el-check-tag--error.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--error.is-disabled, +.el-check-tag.el-check-tag--error.is-disabled:hover { + background-color: var(--el-color-error-light-9) +} + +.el-check-tag.el-check-tag--info.is-checked { + background-color: var(--el-color-info-light-8); + color: var(--el-color-info) +} + +.el-check-tag.el-check-tag--info.is-checked:hover { + background-color: var(--el-color-info-light-7) +} + +.el-check-tag.el-check-tag--info.is-checked.is-disabled { + background-color: var(--el-color-info-light-8); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--info.is-checked.is-disabled:hover { + background-color: var(--el-color-info-light-8) +} + +.el-check-tag.el-check-tag--info.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-check-tag.el-check-tag--info.is-disabled, +.el-check-tag.el-check-tag--info.is-disabled:hover { + background-color: var(--el-color-info-light-9) +} + +.el-checkbox-button { + --el-checkbox-button-checked-bg-color: var(--el-color-primary); + --el-checkbox-button-checked-text-color: var(--el-color-white); + --el-checkbox-button-checked-border-color: var(--el-color-primary); + display: inline-block; + position: relative +} + +.el-checkbox-button__inner { + -webkit-appearance: none; + background: var(--el-button-bg-color, var(--el-fill-color-blank)); + border: var(--el-border); + border-left-color: transparent; + border-radius: 0; + box-sizing: border-box; + color: var(--el-button-text-color, var(--el-text-color-regular)); + cursor: pointer; + display: inline-block; + font-size: var(--el-font-size-base); + font-weight: var(--el-checkbox-font-weight); + line-height: 1; + margin: 0; + outline: none; + padding: 8px 15px; + position: relative; + text-align: center; + transition: var(--el-transition-all); + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + vertical-align: middle; + white-space: nowrap +} + +.el-checkbox-button__inner.is-round { + padding: 8px 15px +} + +.el-checkbox-button__inner:hover { + color: var(--el-color-primary) +} + +.el-checkbox-button__inner [class*=el-icon-] { + line-height: .9 +} + +.el-checkbox-button__inner [class*=el-icon-]+span { + margin-left: 5px +} + +.el-checkbox-button__original { + margin: 0; + opacity: 0; + outline: none; + position: absolute; + z-index: -1 +} + +.el-checkbox-button.is-checked .el-checkbox-button__inner { + background-color: var(--el-checkbox-button-checked-bg-color); + border-color: var(--el-checkbox-button-checked-border-color); + box-shadow: -1px 0 0 0 var(--el-color-primary-light-7); + color: var(--el-checkbox-button-checked-text-color) +} + +.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner { + border-left-color: var(--el-checkbox-button-checked-border-color) +} + +.el-checkbox-button.is-disabled .el-checkbox-button__inner { + background-color: var(--el-button-disabled-bg-color, var(--el-fill-color-blank)); + background-image: none; + border-color: var(--el-button-disabled-border-color, var(--el-border-color-light)); + box-shadow: none; + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner { + border-left-color: var(--el-button-disabled-border-color, var(--el-border-color-light)) +} + +.el-checkbox-button:first-child .el-checkbox-button__inner { + border-bottom-left-radius: var(--el-border-radius-base); + border-left: var(--el-border); + border-top-left-radius: var(--el-border-radius-base); + box-shadow: none !important +} + +.el-checkbox-button.is-focus .el-checkbox-button__inner { + border-color: var(--el-checkbox-button-checked-border-color) +} + +.el-checkbox-button:last-child .el-checkbox-button__inner { + border-bottom-right-radius: var(--el-border-radius-base); + border-top-right-radius: var(--el-border-radius-base) +} + +.el-checkbox-button--large .el-checkbox-button__inner { + border-radius: 0; + font-size: var(--el-font-size-base); + padding: 12px 19px +} + +.el-checkbox-button--large .el-checkbox-button__inner.is-round { + padding: 12px 19px +} + +.el-checkbox-button--small .el-checkbox-button__inner { + border-radius: 0; + font-size: 12px; + padding: 5px 11px +} + +.el-checkbox-button--small .el-checkbox-button__inner.is-round { + padding: 5px 11px +} + +.el-checkbox-group { + font-size: 0; + line-height: 0 +} + +.el-checkbox { + --el-checkbox-font-size: 14px; + --el-checkbox-font-weight: var(--el-font-weight-primary); + --el-checkbox-text-color: var(--el-text-color-regular); + --el-checkbox-input-height: 14px; + --el-checkbox-input-width: 14px; + --el-checkbox-border-radius: var(--el-border-radius-small); + --el-checkbox-bg-color: var(--el-fill-color-blank); + --el-checkbox-input-border: var(--el-border); + --el-checkbox-disabled-border-color: var(--el-border-color); + --el-checkbox-disabled-input-fill: var(--el-fill-color-light); + --el-checkbox-disabled-icon-color: var(--el-text-color-placeholder); + --el-checkbox-disabled-checked-input-fill: var(--el-border-color-extra-light); + --el-checkbox-disabled-checked-input-border-color: var(--el-border-color); + --el-checkbox-disabled-checked-icon-color: var(--el-text-color-placeholder); + --el-checkbox-checked-text-color: var(--el-color-primary); + --el-checkbox-checked-input-border-color: var(--el-color-primary); + --el-checkbox-checked-bg-color: var(--el-color-primary); + --el-checkbox-checked-icon-color: var(--el-color-white); + --el-checkbox-input-border-color-hover: var(--el-color-primary); + align-items: center; + color: var(--el-checkbox-text-color); + cursor: pointer; + display: inline-flex; + font-size: var(--el-font-size-base); + font-weight: var(--el-checkbox-font-weight); + height: var(--el-checkbox-height, 32px); + margin-right: 30px; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + white-space: nowrap +} + +.el-checkbox.is-disabled { + cursor: not-allowed +} + +.el-checkbox.is-bordered { + border: var(--el-border); + border-radius: var(--el-border-radius-base); + box-sizing: border-box; + padding: 0 15px 0 9px +} + +.el-checkbox.is-bordered.is-checked { + border-color: var(--el-color-primary) +} + +.el-checkbox.is-bordered.is-disabled { + border-color: var(--el-border-color-lighter) +} + +.el-checkbox.is-bordered.el-checkbox--large { + border-radius: var(--el-border-radius-base); + padding: 0 19px 0 11px +} + +.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label { + font-size: var(--el-font-size-base) +} + +.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner { + height: 14px; + width: 14px +} + +.el-checkbox.is-bordered.el-checkbox--small { + border-radius: calc(var(--el-border-radius-base) - 1px); + padding: 0 11px 0 7px +} + +.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label { + font-size: 12px +} + +.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner { + height: 12px; + width: 12px +} + +.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after { + height: 6px; + width: 2px +} + +.el-checkbox input:focus-visible+.el-checkbox__inner { + border-radius: var(--el-checkbox-border-radius); + outline: 2px solid var(--el-checkbox-input-border-color-hover); + outline-offset: 1px +} + +.el-checkbox__input { + cursor: pointer; + display: inline-flex; + outline: none; + position: relative; + white-space: nowrap +} + +.el-checkbox__input.is-disabled .el-checkbox__inner { + background-color: var(--el-checkbox-disabled-input-fill); + border-color: var(--el-checkbox-disabled-border-color); + cursor: not-allowed +} + +.el-checkbox__input.is-disabled .el-checkbox__inner:after { + border-color: var(--el-checkbox-disabled-icon-color); + cursor: not-allowed +} + +.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner { + background-color: var(--el-checkbox-disabled-checked-input-fill); + border-color: var(--el-checkbox-disabled-checked-input-border-color) +} + +.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after { + border-color: var(--el-checkbox-disabled-checked-icon-color) +} + +.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner { + background-color: var(--el-checkbox-disabled-checked-input-fill); + border-color: var(--el-checkbox-disabled-checked-input-border-color) +} + +.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before { + background-color: var(--el-checkbox-disabled-checked-icon-color); + border-color: var(--el-checkbox-disabled-checked-icon-color) +} + +.el-checkbox__input.is-disabled+span.el-checkbox__label { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-checkbox__input.is-checked .el-checkbox__inner { + background-color: var(--el-checkbox-checked-bg-color); + border-color: var(--el-checkbox-checked-input-border-color) +} + +.el-checkbox__input.is-checked .el-checkbox__inner:after { + border-color: var(--el-checkbox-checked-icon-color); + transform: rotate(45deg) scaleY(1) +} + +.el-checkbox__input.is-checked+.el-checkbox__label { + color: var(--el-checkbox-checked-text-color) +} + +.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible) { + border-color: var(--el-checkbox-input-border-color-hover) +} + +.el-checkbox__input.is-indeterminate .el-checkbox__inner { + background-color: var(--el-checkbox-checked-bg-color); + border-color: var(--el-checkbox-checked-input-border-color) +} + +.el-checkbox__input.is-indeterminate .el-checkbox__inner:before { + background-color: var(--el-checkbox-checked-icon-color); + content: ""; + display: block; + height: 2px; + left: 0; + position: absolute; + right: 0; + top: 5px; + transform: scale(.5) +} + +.el-checkbox__input.is-indeterminate .el-checkbox__inner:after { + display: none +} + +.el-checkbox__inner { + background-color: var(--el-checkbox-bg-color); + border: var(--el-checkbox-input-border); + border-radius: var(--el-checkbox-border-radius); + box-sizing: border-box; + display: inline-block; + height: var(--el-checkbox-input-height); + position: relative; + transition: border-color .25s cubic-bezier(.71, -.46, .29, 1.46), background-color .25s cubic-bezier(.71, -.46, .29, 1.46), outline .25s cubic-bezier(.71, -.46, .29, 1.46); + width: var(--el-checkbox-input-width); + z-index: var(--el-index-normal) +} + +.el-checkbox__inner:hover { + border-color: var(--el-checkbox-input-border-color-hover) +} + +.el-checkbox__inner:after { + border: 1px solid transparent; + border-left: 0; + border-top: 0; + box-sizing: content-box; + content: ""; + height: 7px; + left: 4px; + position: absolute; + top: 1px; + transform: rotate(45deg) scaleY(0); + transform-origin: center; + transition: transform .15s ease-in .05s; + width: 3px +} + +.el-checkbox__original { + height: 0; + margin: 0; + opacity: 0; + outline: none; + position: absolute; + width: 0; + z-index: -1 +} + +.el-checkbox__label { + display: inline-block; + font-size: var(--el-checkbox-font-size); + line-height: 1; + padding-left: 8px +} + +.el-checkbox.el-checkbox--large { + height: 40px +} + +.el-checkbox.el-checkbox--large .el-checkbox__label { + font-size: 14px +} + +.el-checkbox.el-checkbox--large .el-checkbox__inner { + height: 14px; + width: 14px +} + +.el-checkbox.el-checkbox--small { + height: 24px +} + +.el-checkbox.el-checkbox--small .el-checkbox__label { + font-size: 12px +} + +.el-checkbox.el-checkbox--small .el-checkbox__inner { + height: 12px; + width: 12px +} + +.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before { + top: 4px +} + +.el-checkbox.el-checkbox--small .el-checkbox__inner:after { + height: 6px; + width: 2px +} + +.el-checkbox:last-of-type { + margin-right: 0 +} + +[class*=el-col-] { + box-sizing: border-box +} + +[class*=el-col-].is-guttered { + display: block; + min-height: 1px +} + +.el-col-0 { + flex: 0 0 0%; + max-width: 0 +} + +.el-col-0, +.el-col-0.is-guttered { + display: none +} + +.el-col-offset-0 { + margin-left: 0 +} + +.el-col-pull-0 { + position: relative; + right: 0 +} + +.el-col-push-0 { + left: 0; + position: relative +} + +.el-col-1 { + flex: 0 0 4.1666666667%; + max-width: 4.1666666667% +} + +.el-col-1, +.el-col-1.is-guttered { + display: block +} + +.el-col-offset-1 { + margin-left: 4.1666666667% +} + +.el-col-pull-1 { + position: relative; + right: 4.1666666667% +} + +.el-col-push-1 { + left: 4.1666666667%; + position: relative +} + +.el-col-2 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% +} + +.el-col-2, +.el-col-2.is-guttered { + display: block +} + +.el-col-offset-2 { + margin-left: 8.3333333333% +} + +.el-col-pull-2 { + position: relative; + right: 8.3333333333% +} + +.el-col-push-2 { + left: 8.3333333333%; + position: relative +} + +.el-col-3 { + flex: 0 0 12.5%; + max-width: 12.5% +} + +.el-col-3, +.el-col-3.is-guttered { + display: block +} + +.el-col-offset-3 { + margin-left: 12.5% +} + +.el-col-pull-3 { + position: relative; + right: 12.5% +} + +.el-col-push-3 { + left: 12.5%; + position: relative +} + +.el-col-4 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% +} + +.el-col-4, +.el-col-4.is-guttered { + display: block +} + +.el-col-offset-4 { + margin-left: 16.6666666667% +} + +.el-col-pull-4 { + position: relative; + right: 16.6666666667% +} + +.el-col-push-4 { + left: 16.6666666667%; + position: relative +} + +.el-col-5 { + flex: 0 0 20.8333333333%; + max-width: 20.8333333333% +} + +.el-col-5, +.el-col-5.is-guttered { + display: block +} + +.el-col-offset-5 { + margin-left: 20.8333333333% +} + +.el-col-pull-5 { + position: relative; + right: 20.8333333333% +} + +.el-col-push-5 { + left: 20.8333333333%; + position: relative +} + +.el-col-6 { + flex: 0 0 25%; + max-width: 25% +} + +.el-col-6, +.el-col-6.is-guttered { + display: block +} + +.el-col-offset-6 { + margin-left: 25% +} + +.el-col-pull-6 { + position: relative; + right: 25% +} + +.el-col-push-6 { + left: 25%; + position: relative +} + +.el-col-7 { + flex: 0 0 29.1666666667%; + max-width: 29.1666666667% +} + +.el-col-7, +.el-col-7.is-guttered { + display: block +} + +.el-col-offset-7 { + margin-left: 29.1666666667% +} + +.el-col-pull-7 { + position: relative; + right: 29.1666666667% +} + +.el-col-push-7 { + left: 29.1666666667%; + position: relative +} + +.el-col-8 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% +} + +.el-col-8, +.el-col-8.is-guttered { + display: block +} + +.el-col-offset-8 { + margin-left: 33.3333333333% +} + +.el-col-pull-8 { + position: relative; + right: 33.3333333333% +} + +.el-col-push-8 { + left: 33.3333333333%; + position: relative +} + +.el-col-9 { + flex: 0 0 37.5%; + max-width: 37.5% +} + +.el-col-9, +.el-col-9.is-guttered { + display: block +} + +.el-col-offset-9 { + margin-left: 37.5% +} + +.el-col-pull-9 { + position: relative; + right: 37.5% +} + +.el-col-push-9 { + left: 37.5%; + position: relative +} + +.el-col-10 { + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% +} + +.el-col-10, +.el-col-10.is-guttered { + display: block +} + +.el-col-offset-10 { + margin-left: 41.6666666667% +} + +.el-col-pull-10 { + position: relative; + right: 41.6666666667% +} + +.el-col-push-10 { + left: 41.6666666667%; + position: relative +} + +.el-col-11 { + flex: 0 0 45.8333333333%; + max-width: 45.8333333333% +} + +.el-col-11, +.el-col-11.is-guttered { + display: block +} + +.el-col-offset-11 { + margin-left: 45.8333333333% +} + +.el-col-pull-11 { + position: relative; + right: 45.8333333333% +} + +.el-col-push-11 { + left: 45.8333333333%; + position: relative +} + +.el-col-12 { + flex: 0 0 50%; + max-width: 50% +} + +.el-col-12, +.el-col-12.is-guttered { + display: block +} + +.el-col-offset-12 { + margin-left: 50% +} + +.el-col-pull-12 { + position: relative; + right: 50% +} + +.el-col-push-12 { + left: 50%; + position: relative +} + +.el-col-13 { + flex: 0 0 54.1666666667%; + max-width: 54.1666666667% +} + +.el-col-13, +.el-col-13.is-guttered { + display: block +} + +.el-col-offset-13 { + margin-left: 54.1666666667% +} + +.el-col-pull-13 { + position: relative; + right: 54.1666666667% +} + +.el-col-push-13 { + left: 54.1666666667%; + position: relative +} + +.el-col-14 { + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% +} + +.el-col-14, +.el-col-14.is-guttered { + display: block +} + +.el-col-offset-14 { + margin-left: 58.3333333333% +} + +.el-col-pull-14 { + position: relative; + right: 58.3333333333% +} + +.el-col-push-14 { + left: 58.3333333333%; + position: relative +} + +.el-col-15 { + flex: 0 0 62.5%; + max-width: 62.5% +} + +.el-col-15, +.el-col-15.is-guttered { + display: block +} + +.el-col-offset-15 { + margin-left: 62.5% +} + +.el-col-pull-15 { + position: relative; + right: 62.5% +} + +.el-col-push-15 { + left: 62.5%; + position: relative +} + +.el-col-16 { + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% +} + +.el-col-16, +.el-col-16.is-guttered { + display: block +} + +.el-col-offset-16 { + margin-left: 66.6666666667% +} + +.el-col-pull-16 { + position: relative; + right: 66.6666666667% +} + +.el-col-push-16 { + left: 66.6666666667%; + position: relative +} + +.el-col-17 { + flex: 0 0 70.8333333333%; + max-width: 70.8333333333% +} + +.el-col-17, +.el-col-17.is-guttered { + display: block +} + +.el-col-offset-17 { + margin-left: 70.8333333333% +} + +.el-col-pull-17 { + position: relative; + right: 70.8333333333% +} + +.el-col-push-17 { + left: 70.8333333333%; + position: relative +} + +.el-col-18 { + flex: 0 0 75%; + max-width: 75% +} + +.el-col-18, +.el-col-18.is-guttered { + display: block +} + +.el-col-offset-18 { + margin-left: 75% +} + +.el-col-pull-18 { + position: relative; + right: 75% +} + +.el-col-push-18 { + left: 75%; + position: relative +} + +.el-col-19 { + flex: 0 0 79.1666666667%; + max-width: 79.1666666667% +} + +.el-col-19, +.el-col-19.is-guttered { + display: block +} + +.el-col-offset-19 { + margin-left: 79.1666666667% +} + +.el-col-pull-19 { + position: relative; + right: 79.1666666667% +} + +.el-col-push-19 { + left: 79.1666666667%; + position: relative +} + +.el-col-20 { + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% +} + +.el-col-20, +.el-col-20.is-guttered { + display: block +} + +.el-col-offset-20 { + margin-left: 83.3333333333% +} + +.el-col-pull-20 { + position: relative; + right: 83.3333333333% +} + +.el-col-push-20 { + left: 83.3333333333%; + position: relative +} + +.el-col-21 { + flex: 0 0 87.5%; + max-width: 87.5% +} + +.el-col-21, +.el-col-21.is-guttered { + display: block +} + +.el-col-offset-21 { + margin-left: 87.5% +} + +.el-col-pull-21 { + position: relative; + right: 87.5% +} + +.el-col-push-21 { + left: 87.5%; + position: relative +} + +.el-col-22 { + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% +} + +.el-col-22, +.el-col-22.is-guttered { + display: block +} + +.el-col-offset-22 { + margin-left: 91.6666666667% +} + +.el-col-pull-22 { + position: relative; + right: 91.6666666667% +} + +.el-col-push-22 { + left: 91.6666666667%; + position: relative +} + +.el-col-23 { + flex: 0 0 95.8333333333%; + max-width: 95.8333333333% +} + +.el-col-23, +.el-col-23.is-guttered { + display: block +} + +.el-col-offset-23 { + margin-left: 95.8333333333% +} + +.el-col-pull-23 { + position: relative; + right: 95.8333333333% +} + +.el-col-push-23 { + left: 95.8333333333%; + position: relative +} + +.el-col-24 { + flex: 0 0 100%; + max-width: 100% +} + +.el-col-24, +.el-col-24.is-guttered { + display: block +} + +.el-col-offset-24 { + margin-left: 100% +} + +.el-col-pull-24 { + position: relative; + right: 100% +} + +.el-col-push-24 { + left: 100%; + position: relative +} + +@media only screen and (max-width:767px) { + .el-col-xs-0 { + display: none; + flex: 0 0 0%; + max-width: 0 + } + + .el-col-xs-0.is-guttered { + display: none + } + + .el-col-xs-offset-0 { + margin-left: 0 + } + + .el-col-xs-pull-0 { + position: relative; + right: 0 + } + + .el-col-xs-push-0 { + left: 0; + position: relative + } + + .el-col-xs-1 { + flex: 0 0 4.1666666667%; + max-width: 4.1666666667% + } + + .el-col-xs-1, + .el-col-xs-1.is-guttered { + display: block + } + + .el-col-xs-offset-1 { + margin-left: 4.1666666667% + } + + .el-col-xs-pull-1 { + position: relative; + right: 4.1666666667% + } + + .el-col-xs-push-1 { + left: 4.1666666667%; + position: relative + } + + .el-col-xs-2 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .el-col-xs-2, + .el-col-xs-2.is-guttered { + display: block + } + + .el-col-xs-offset-2 { + margin-left: 8.3333333333% + } + + .el-col-xs-pull-2 { + position: relative; + right: 8.3333333333% + } + + .el-col-xs-push-2 { + left: 8.3333333333%; + position: relative + } + + .el-col-xs-3 { + flex: 0 0 12.5%; + max-width: 12.5% + } + + .el-col-xs-3, + .el-col-xs-3.is-guttered { + display: block + } + + .el-col-xs-offset-3 { + margin-left: 12.5% + } + + .el-col-xs-pull-3 { + position: relative; + right: 12.5% + } + + .el-col-xs-push-3 { + left: 12.5%; + position: relative + } + + .el-col-xs-4 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .el-col-xs-4, + .el-col-xs-4.is-guttered { + display: block + } + + .el-col-xs-offset-4 { + margin-left: 16.6666666667% + } + + .el-col-xs-pull-4 { + position: relative; + right: 16.6666666667% + } + + .el-col-xs-push-4 { + left: 16.6666666667%; + position: relative + } + + .el-col-xs-5 { + flex: 0 0 20.8333333333%; + max-width: 20.8333333333% + } + + .el-col-xs-5, + .el-col-xs-5.is-guttered { + display: block + } + + .el-col-xs-offset-5 { + margin-left: 20.8333333333% + } + + .el-col-xs-pull-5 { + position: relative; + right: 20.8333333333% + } + + .el-col-xs-push-5 { + left: 20.8333333333%; + position: relative + } + + .el-col-xs-6 { + flex: 0 0 25%; + max-width: 25% + } + + .el-col-xs-6, + .el-col-xs-6.is-guttered { + display: block + } + + .el-col-xs-offset-6 { + margin-left: 25% + } + + .el-col-xs-pull-6 { + position: relative; + right: 25% + } + + .el-col-xs-push-6 { + left: 25%; + position: relative + } + + .el-col-xs-7 { + flex: 0 0 29.1666666667%; + max-width: 29.1666666667% + } + + .el-col-xs-7, + .el-col-xs-7.is-guttered { + display: block + } + + .el-col-xs-offset-7 { + margin-left: 29.1666666667% + } + + .el-col-xs-pull-7 { + position: relative; + right: 29.1666666667% + } + + .el-col-xs-push-7 { + left: 29.1666666667%; + position: relative + } + + .el-col-xs-8 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .el-col-xs-8, + .el-col-xs-8.is-guttered { + display: block + } + + .el-col-xs-offset-8 { + margin-left: 33.3333333333% + } + + .el-col-xs-pull-8 { + position: relative; + right: 33.3333333333% + } + + .el-col-xs-push-8 { + left: 33.3333333333%; + position: relative + } + + .el-col-xs-9 { + flex: 0 0 37.5%; + max-width: 37.5% + } + + .el-col-xs-9, + .el-col-xs-9.is-guttered { + display: block + } + + .el-col-xs-offset-9 { + margin-left: 37.5% + } + + .el-col-xs-pull-9 { + position: relative; + right: 37.5% + } + + .el-col-xs-push-9 { + left: 37.5%; + position: relative + } + + .el-col-xs-10 { + display: block; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .el-col-xs-10.is-guttered { + display: block + } + + .el-col-xs-offset-10 { + margin-left: 41.6666666667% + } + + .el-col-xs-pull-10 { + position: relative; + right: 41.6666666667% + } + + .el-col-xs-push-10 { + left: 41.6666666667%; + position: relative + } + + .el-col-xs-11 { + display: block; + flex: 0 0 45.8333333333%; + max-width: 45.8333333333% + } + + .el-col-xs-11.is-guttered { + display: block + } + + .el-col-xs-offset-11 { + margin-left: 45.8333333333% + } + + .el-col-xs-pull-11 { + position: relative; + right: 45.8333333333% + } + + .el-col-xs-push-11 { + left: 45.8333333333%; + position: relative + } + + .el-col-xs-12 { + display: block; + flex: 0 0 50%; + max-width: 50% + } + + .el-col-xs-12.is-guttered { + display: block + } + + .el-col-xs-offset-12 { + margin-left: 50% + } + + .el-col-xs-pull-12 { + position: relative; + right: 50% + } + + .el-col-xs-push-12 { + left: 50%; + position: relative + } + + .el-col-xs-13 { + display: block; + flex: 0 0 54.1666666667%; + max-width: 54.1666666667% + } + + .el-col-xs-13.is-guttered { + display: block + } + + .el-col-xs-offset-13 { + margin-left: 54.1666666667% + } + + .el-col-xs-pull-13 { + position: relative; + right: 54.1666666667% + } + + .el-col-xs-push-13 { + left: 54.1666666667%; + position: relative + } + + .el-col-xs-14 { + display: block; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .el-col-xs-14.is-guttered { + display: block + } + + .el-col-xs-offset-14 { + margin-left: 58.3333333333% + } + + .el-col-xs-pull-14 { + position: relative; + right: 58.3333333333% + } + + .el-col-xs-push-14 { + left: 58.3333333333%; + position: relative + } + + .el-col-xs-15 { + display: block; + flex: 0 0 62.5%; + max-width: 62.5% + } + + .el-col-xs-15.is-guttered { + display: block + } + + .el-col-xs-offset-15 { + margin-left: 62.5% + } + + .el-col-xs-pull-15 { + position: relative; + right: 62.5% + } + + .el-col-xs-push-15 { + left: 62.5%; + position: relative + } + + .el-col-xs-16 { + display: block; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .el-col-xs-16.is-guttered { + display: block + } + + .el-col-xs-offset-16 { + margin-left: 66.6666666667% + } + + .el-col-xs-pull-16 { + position: relative; + right: 66.6666666667% + } + + .el-col-xs-push-16 { + left: 66.6666666667%; + position: relative + } + + .el-col-xs-17 { + display: block; + flex: 0 0 70.8333333333%; + max-width: 70.8333333333% + } + + .el-col-xs-17.is-guttered { + display: block + } + + .el-col-xs-offset-17 { + margin-left: 70.8333333333% + } + + .el-col-xs-pull-17 { + position: relative; + right: 70.8333333333% + } + + .el-col-xs-push-17 { + left: 70.8333333333%; + position: relative + } + + .el-col-xs-18 { + display: block; + flex: 0 0 75%; + max-width: 75% + } + + .el-col-xs-18.is-guttered { + display: block + } + + .el-col-xs-offset-18 { + margin-left: 75% + } + + .el-col-xs-pull-18 { + position: relative; + right: 75% + } + + .el-col-xs-push-18 { + left: 75%; + position: relative + } + + .el-col-xs-19 { + display: block; + flex: 0 0 79.1666666667%; + max-width: 79.1666666667% + } + + .el-col-xs-19.is-guttered { + display: block + } + + .el-col-xs-offset-19 { + margin-left: 79.1666666667% + } + + .el-col-xs-pull-19 { + position: relative; + right: 79.1666666667% + } + + .el-col-xs-push-19 { + left: 79.1666666667%; + position: relative + } + + .el-col-xs-20 { + display: block; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .el-col-xs-20.is-guttered { + display: block + } + + .el-col-xs-offset-20 { + margin-left: 83.3333333333% + } + + .el-col-xs-pull-20 { + position: relative; + right: 83.3333333333% + } + + .el-col-xs-push-20 { + left: 83.3333333333%; + position: relative + } + + .el-col-xs-21 { + display: block; + flex: 0 0 87.5%; + max-width: 87.5% + } + + .el-col-xs-21.is-guttered { + display: block + } + + .el-col-xs-offset-21 { + margin-left: 87.5% + } + + .el-col-xs-pull-21 { + position: relative; + right: 87.5% + } + + .el-col-xs-push-21 { + left: 87.5%; + position: relative + } + + .el-col-xs-22 { + display: block; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .el-col-xs-22.is-guttered { + display: block + } + + .el-col-xs-offset-22 { + margin-left: 91.6666666667% + } + + .el-col-xs-pull-22 { + position: relative; + right: 91.6666666667% + } + + .el-col-xs-push-22 { + left: 91.6666666667%; + position: relative + } + + .el-col-xs-23 { + display: block; + flex: 0 0 95.8333333333%; + max-width: 95.8333333333% + } + + .el-col-xs-23.is-guttered { + display: block + } + + .el-col-xs-offset-23 { + margin-left: 95.8333333333% + } + + .el-col-xs-pull-23 { + position: relative; + right: 95.8333333333% + } + + .el-col-xs-push-23 { + left: 95.8333333333%; + position: relative + } + + .el-col-xs-24 { + display: block; + flex: 0 0 100%; + max-width: 100% + } + + .el-col-xs-24.is-guttered { + display: block + } + + .el-col-xs-offset-24 { + margin-left: 100% + } + + .el-col-xs-pull-24 { + position: relative; + right: 100% + } + + .el-col-xs-push-24 { + left: 100%; + position: relative + } +} + +@media only screen and (min-width:768px) { + .el-col-sm-0 { + display: none; + flex: 0 0 0%; + max-width: 0 + } + + .el-col-sm-0.is-guttered { + display: none + } + + .el-col-sm-offset-0 { + margin-left: 0 + } + + .el-col-sm-pull-0 { + position: relative; + right: 0 + } + + .el-col-sm-push-0 { + left: 0; + position: relative + } + + .el-col-sm-1 { + flex: 0 0 4.1666666667%; + max-width: 4.1666666667% + } + + .el-col-sm-1, + .el-col-sm-1.is-guttered { + display: block + } + + .el-col-sm-offset-1 { + margin-left: 4.1666666667% + } + + .el-col-sm-pull-1 { + position: relative; + right: 4.1666666667% + } + + .el-col-sm-push-1 { + left: 4.1666666667%; + position: relative + } + + .el-col-sm-2 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .el-col-sm-2, + .el-col-sm-2.is-guttered { + display: block + } + + .el-col-sm-offset-2 { + margin-left: 8.3333333333% + } + + .el-col-sm-pull-2 { + position: relative; + right: 8.3333333333% + } + + .el-col-sm-push-2 { + left: 8.3333333333%; + position: relative + } + + .el-col-sm-3 { + flex: 0 0 12.5%; + max-width: 12.5% + } + + .el-col-sm-3, + .el-col-sm-3.is-guttered { + display: block + } + + .el-col-sm-offset-3 { + margin-left: 12.5% + } + + .el-col-sm-pull-3 { + position: relative; + right: 12.5% + } + + .el-col-sm-push-3 { + left: 12.5%; + position: relative + } + + .el-col-sm-4 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .el-col-sm-4, + .el-col-sm-4.is-guttered { + display: block + } + + .el-col-sm-offset-4 { + margin-left: 16.6666666667% + } + + .el-col-sm-pull-4 { + position: relative; + right: 16.6666666667% + } + + .el-col-sm-push-4 { + left: 16.6666666667%; + position: relative + } + + .el-col-sm-5 { + flex: 0 0 20.8333333333%; + max-width: 20.8333333333% + } + + .el-col-sm-5, + .el-col-sm-5.is-guttered { + display: block + } + + .el-col-sm-offset-5 { + margin-left: 20.8333333333% + } + + .el-col-sm-pull-5 { + position: relative; + right: 20.8333333333% + } + + .el-col-sm-push-5 { + left: 20.8333333333%; + position: relative + } + + .el-col-sm-6 { + flex: 0 0 25%; + max-width: 25% + } + + .el-col-sm-6, + .el-col-sm-6.is-guttered { + display: block + } + + .el-col-sm-offset-6 { + margin-left: 25% + } + + .el-col-sm-pull-6 { + position: relative; + right: 25% + } + + .el-col-sm-push-6 { + left: 25%; + position: relative + } + + .el-col-sm-7 { + flex: 0 0 29.1666666667%; + max-width: 29.1666666667% + } + + .el-col-sm-7, + .el-col-sm-7.is-guttered { + display: block + } + + .el-col-sm-offset-7 { + margin-left: 29.1666666667% + } + + .el-col-sm-pull-7 { + position: relative; + right: 29.1666666667% + } + + .el-col-sm-push-7 { + left: 29.1666666667%; + position: relative + } + + .el-col-sm-8 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .el-col-sm-8, + .el-col-sm-8.is-guttered { + display: block + } + + .el-col-sm-offset-8 { + margin-left: 33.3333333333% + } + + .el-col-sm-pull-8 { + position: relative; + right: 33.3333333333% + } + + .el-col-sm-push-8 { + left: 33.3333333333%; + position: relative + } + + .el-col-sm-9 { + flex: 0 0 37.5%; + max-width: 37.5% + } + + .el-col-sm-9, + .el-col-sm-9.is-guttered { + display: block + } + + .el-col-sm-offset-9 { + margin-left: 37.5% + } + + .el-col-sm-pull-9 { + position: relative; + right: 37.5% + } + + .el-col-sm-push-9 { + left: 37.5%; + position: relative + } + + .el-col-sm-10 { + display: block; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .el-col-sm-10.is-guttered { + display: block + } + + .el-col-sm-offset-10 { + margin-left: 41.6666666667% + } + + .el-col-sm-pull-10 { + position: relative; + right: 41.6666666667% + } + + .el-col-sm-push-10 { + left: 41.6666666667%; + position: relative + } + + .el-col-sm-11 { + display: block; + flex: 0 0 45.8333333333%; + max-width: 45.8333333333% + } + + .el-col-sm-11.is-guttered { + display: block + } + + .el-col-sm-offset-11 { + margin-left: 45.8333333333% + } + + .el-col-sm-pull-11 { + position: relative; + right: 45.8333333333% + } + + .el-col-sm-push-11 { + left: 45.8333333333%; + position: relative + } + + .el-col-sm-12 { + display: block; + flex: 0 0 50%; + max-width: 50% + } + + .el-col-sm-12.is-guttered { + display: block + } + + .el-col-sm-offset-12 { + margin-left: 50% + } + + .el-col-sm-pull-12 { + position: relative; + right: 50% + } + + .el-col-sm-push-12 { + left: 50%; + position: relative + } + + .el-col-sm-13 { + display: block; + flex: 0 0 54.1666666667%; + max-width: 54.1666666667% + } + + .el-col-sm-13.is-guttered { + display: block + } + + .el-col-sm-offset-13 { + margin-left: 54.1666666667% + } + + .el-col-sm-pull-13 { + position: relative; + right: 54.1666666667% + } + + .el-col-sm-push-13 { + left: 54.1666666667%; + position: relative + } + + .el-col-sm-14 { + display: block; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .el-col-sm-14.is-guttered { + display: block + } + + .el-col-sm-offset-14 { + margin-left: 58.3333333333% + } + + .el-col-sm-pull-14 { + position: relative; + right: 58.3333333333% + } + + .el-col-sm-push-14 { + left: 58.3333333333%; + position: relative + } + + .el-col-sm-15 { + display: block; + flex: 0 0 62.5%; + max-width: 62.5% + } + + .el-col-sm-15.is-guttered { + display: block + } + + .el-col-sm-offset-15 { + margin-left: 62.5% + } + + .el-col-sm-pull-15 { + position: relative; + right: 62.5% + } + + .el-col-sm-push-15 { + left: 62.5%; + position: relative + } + + .el-col-sm-16 { + display: block; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .el-col-sm-16.is-guttered { + display: block + } + + .el-col-sm-offset-16 { + margin-left: 66.6666666667% + } + + .el-col-sm-pull-16 { + position: relative; + right: 66.6666666667% + } + + .el-col-sm-push-16 { + left: 66.6666666667%; + position: relative + } + + .el-col-sm-17 { + display: block; + flex: 0 0 70.8333333333%; + max-width: 70.8333333333% + } + + .el-col-sm-17.is-guttered { + display: block + } + + .el-col-sm-offset-17 { + margin-left: 70.8333333333% + } + + .el-col-sm-pull-17 { + position: relative; + right: 70.8333333333% + } + + .el-col-sm-push-17 { + left: 70.8333333333%; + position: relative + } + + .el-col-sm-18 { + display: block; + flex: 0 0 75%; + max-width: 75% + } + + .el-col-sm-18.is-guttered { + display: block + } + + .el-col-sm-offset-18 { + margin-left: 75% + } + + .el-col-sm-pull-18 { + position: relative; + right: 75% + } + + .el-col-sm-push-18 { + left: 75%; + position: relative + } + + .el-col-sm-19 { + display: block; + flex: 0 0 79.1666666667%; + max-width: 79.1666666667% + } + + .el-col-sm-19.is-guttered { + display: block + } + + .el-col-sm-offset-19 { + margin-left: 79.1666666667% + } + + .el-col-sm-pull-19 { + position: relative; + right: 79.1666666667% + } + + .el-col-sm-push-19 { + left: 79.1666666667%; + position: relative + } + + .el-col-sm-20 { + display: block; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .el-col-sm-20.is-guttered { + display: block + } + + .el-col-sm-offset-20 { + margin-left: 83.3333333333% + } + + .el-col-sm-pull-20 { + position: relative; + right: 83.3333333333% + } + + .el-col-sm-push-20 { + left: 83.3333333333%; + position: relative + } + + .el-col-sm-21 { + display: block; + flex: 0 0 87.5%; + max-width: 87.5% + } + + .el-col-sm-21.is-guttered { + display: block + } + + .el-col-sm-offset-21 { + margin-left: 87.5% + } + + .el-col-sm-pull-21 { + position: relative; + right: 87.5% + } + + .el-col-sm-push-21 { + left: 87.5%; + position: relative + } + + .el-col-sm-22 { + display: block; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .el-col-sm-22.is-guttered { + display: block + } + + .el-col-sm-offset-22 { + margin-left: 91.6666666667% + } + + .el-col-sm-pull-22 { + position: relative; + right: 91.6666666667% + } + + .el-col-sm-push-22 { + left: 91.6666666667%; + position: relative + } + + .el-col-sm-23 { + display: block; + flex: 0 0 95.8333333333%; + max-width: 95.8333333333% + } + + .el-col-sm-23.is-guttered { + display: block + } + + .el-col-sm-offset-23 { + margin-left: 95.8333333333% + } + + .el-col-sm-pull-23 { + position: relative; + right: 95.8333333333% + } + + .el-col-sm-push-23 { + left: 95.8333333333%; + position: relative + } + + .el-col-sm-24 { + display: block; + flex: 0 0 100%; + max-width: 100% + } + + .el-col-sm-24.is-guttered { + display: block + } + + .el-col-sm-offset-24 { + margin-left: 100% + } + + .el-col-sm-pull-24 { + position: relative; + right: 100% + } + + .el-col-sm-push-24 { + left: 100%; + position: relative + } +} + +@media only screen and (min-width:992px) { + .el-col-md-0 { + display: none; + flex: 0 0 0%; + max-width: 0 + } + + .el-col-md-0.is-guttered { + display: none + } + + .el-col-md-offset-0 { + margin-left: 0 + } + + .el-col-md-pull-0 { + position: relative; + right: 0 + } + + .el-col-md-push-0 { + left: 0; + position: relative + } + + .el-col-md-1 { + flex: 0 0 4.1666666667%; + max-width: 4.1666666667% + } + + .el-col-md-1, + .el-col-md-1.is-guttered { + display: block + } + + .el-col-md-offset-1 { + margin-left: 4.1666666667% + } + + .el-col-md-pull-1 { + position: relative; + right: 4.1666666667% + } + + .el-col-md-push-1 { + left: 4.1666666667%; + position: relative + } + + .el-col-md-2 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .el-col-md-2, + .el-col-md-2.is-guttered { + display: block + } + + .el-col-md-offset-2 { + margin-left: 8.3333333333% + } + + .el-col-md-pull-2 { + position: relative; + right: 8.3333333333% + } + + .el-col-md-push-2 { + left: 8.3333333333%; + position: relative + } + + .el-col-md-3 { + flex: 0 0 12.5%; + max-width: 12.5% + } + + .el-col-md-3, + .el-col-md-3.is-guttered { + display: block + } + + .el-col-md-offset-3 { + margin-left: 12.5% + } + + .el-col-md-pull-3 { + position: relative; + right: 12.5% + } + + .el-col-md-push-3 { + left: 12.5%; + position: relative + } + + .el-col-md-4 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .el-col-md-4, + .el-col-md-4.is-guttered { + display: block + } + + .el-col-md-offset-4 { + margin-left: 16.6666666667% + } + + .el-col-md-pull-4 { + position: relative; + right: 16.6666666667% + } + + .el-col-md-push-4 { + left: 16.6666666667%; + position: relative + } + + .el-col-md-5 { + flex: 0 0 20.8333333333%; + max-width: 20.8333333333% + } + + .el-col-md-5, + .el-col-md-5.is-guttered { + display: block + } + + .el-col-md-offset-5 { + margin-left: 20.8333333333% + } + + .el-col-md-pull-5 { + position: relative; + right: 20.8333333333% + } + + .el-col-md-push-5 { + left: 20.8333333333%; + position: relative + } + + .el-col-md-6 { + flex: 0 0 25%; + max-width: 25% + } + + .el-col-md-6, + .el-col-md-6.is-guttered { + display: block + } + + .el-col-md-offset-6 { + margin-left: 25% + } + + .el-col-md-pull-6 { + position: relative; + right: 25% + } + + .el-col-md-push-6 { + left: 25%; + position: relative + } + + .el-col-md-7 { + flex: 0 0 29.1666666667%; + max-width: 29.1666666667% + } + + .el-col-md-7, + .el-col-md-7.is-guttered { + display: block + } + + .el-col-md-offset-7 { + margin-left: 29.1666666667% + } + + .el-col-md-pull-7 { + position: relative; + right: 29.1666666667% + } + + .el-col-md-push-7 { + left: 29.1666666667%; + position: relative + } + + .el-col-md-8 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .el-col-md-8, + .el-col-md-8.is-guttered { + display: block + } + + .el-col-md-offset-8 { + margin-left: 33.3333333333% + } + + .el-col-md-pull-8 { + position: relative; + right: 33.3333333333% + } + + .el-col-md-push-8 { + left: 33.3333333333%; + position: relative + } + + .el-col-md-9 { + flex: 0 0 37.5%; + max-width: 37.5% + } + + .el-col-md-9, + .el-col-md-9.is-guttered { + display: block + } + + .el-col-md-offset-9 { + margin-left: 37.5% + } + + .el-col-md-pull-9 { + position: relative; + right: 37.5% + } + + .el-col-md-push-9 { + left: 37.5%; + position: relative + } + + .el-col-md-10 { + display: block; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .el-col-md-10.is-guttered { + display: block + } + + .el-col-md-offset-10 { + margin-left: 41.6666666667% + } + + .el-col-md-pull-10 { + position: relative; + right: 41.6666666667% + } + + .el-col-md-push-10 { + left: 41.6666666667%; + position: relative + } + + .el-col-md-11 { + display: block; + flex: 0 0 45.8333333333%; + max-width: 45.8333333333% + } + + .el-col-md-11.is-guttered { + display: block + } + + .el-col-md-offset-11 { + margin-left: 45.8333333333% + } + + .el-col-md-pull-11 { + position: relative; + right: 45.8333333333% + } + + .el-col-md-push-11 { + left: 45.8333333333%; + position: relative + } + + .el-col-md-12 { + display: block; + flex: 0 0 50%; + max-width: 50% + } + + .el-col-md-12.is-guttered { + display: block + } + + .el-col-md-offset-12 { + margin-left: 50% + } + + .el-col-md-pull-12 { + position: relative; + right: 50% + } + + .el-col-md-push-12 { + left: 50%; + position: relative + } + + .el-col-md-13 { + display: block; + flex: 0 0 54.1666666667%; + max-width: 54.1666666667% + } + + .el-col-md-13.is-guttered { + display: block + } + + .el-col-md-offset-13 { + margin-left: 54.1666666667% + } + + .el-col-md-pull-13 { + position: relative; + right: 54.1666666667% + } + + .el-col-md-push-13 { + left: 54.1666666667%; + position: relative + } + + .el-col-md-14 { + display: block; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .el-col-md-14.is-guttered { + display: block + } + + .el-col-md-offset-14 { + margin-left: 58.3333333333% + } + + .el-col-md-pull-14 { + position: relative; + right: 58.3333333333% + } + + .el-col-md-push-14 { + left: 58.3333333333%; + position: relative + } + + .el-col-md-15 { + display: block; + flex: 0 0 62.5%; + max-width: 62.5% + } + + .el-col-md-15.is-guttered { + display: block + } + + .el-col-md-offset-15 { + margin-left: 62.5% + } + + .el-col-md-pull-15 { + position: relative; + right: 62.5% + } + + .el-col-md-push-15 { + left: 62.5%; + position: relative + } + + .el-col-md-16 { + display: block; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .el-col-md-16.is-guttered { + display: block + } + + .el-col-md-offset-16 { + margin-left: 66.6666666667% + } + + .el-col-md-pull-16 { + position: relative; + right: 66.6666666667% + } + + .el-col-md-push-16 { + left: 66.6666666667%; + position: relative + } + + .el-col-md-17 { + display: block; + flex: 0 0 70.8333333333%; + max-width: 70.8333333333% + } + + .el-col-md-17.is-guttered { + display: block + } + + .el-col-md-offset-17 { + margin-left: 70.8333333333% + } + + .el-col-md-pull-17 { + position: relative; + right: 70.8333333333% + } + + .el-col-md-push-17 { + left: 70.8333333333%; + position: relative + } + + .el-col-md-18 { + display: block; + flex: 0 0 75%; + max-width: 75% + } + + .el-col-md-18.is-guttered { + display: block + } + + .el-col-md-offset-18 { + margin-left: 75% + } + + .el-col-md-pull-18 { + position: relative; + right: 75% + } + + .el-col-md-push-18 { + left: 75%; + position: relative + } + + .el-col-md-19 { + display: block; + flex: 0 0 79.1666666667%; + max-width: 79.1666666667% + } + + .el-col-md-19.is-guttered { + display: block + } + + .el-col-md-offset-19 { + margin-left: 79.1666666667% + } + + .el-col-md-pull-19 { + position: relative; + right: 79.1666666667% + } + + .el-col-md-push-19 { + left: 79.1666666667%; + position: relative + } + + .el-col-md-20 { + display: block; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .el-col-md-20.is-guttered { + display: block + } + + .el-col-md-offset-20 { + margin-left: 83.3333333333% + } + + .el-col-md-pull-20 { + position: relative; + right: 83.3333333333% + } + + .el-col-md-push-20 { + left: 83.3333333333%; + position: relative + } + + .el-col-md-21 { + display: block; + flex: 0 0 87.5%; + max-width: 87.5% + } + + .el-col-md-21.is-guttered { + display: block + } + + .el-col-md-offset-21 { + margin-left: 87.5% + } + + .el-col-md-pull-21 { + position: relative; + right: 87.5% + } + + .el-col-md-push-21 { + left: 87.5%; + position: relative + } + + .el-col-md-22 { + display: block; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .el-col-md-22.is-guttered { + display: block + } + + .el-col-md-offset-22 { + margin-left: 91.6666666667% + } + + .el-col-md-pull-22 { + position: relative; + right: 91.6666666667% + } + + .el-col-md-push-22 { + left: 91.6666666667%; + position: relative + } + + .el-col-md-23 { + display: block; + flex: 0 0 95.8333333333%; + max-width: 95.8333333333% + } + + .el-col-md-23.is-guttered { + display: block + } + + .el-col-md-offset-23 { + margin-left: 95.8333333333% + } + + .el-col-md-pull-23 { + position: relative; + right: 95.8333333333% + } + + .el-col-md-push-23 { + left: 95.8333333333%; + position: relative + } + + .el-col-md-24 { + display: block; + flex: 0 0 100%; + max-width: 100% + } + + .el-col-md-24.is-guttered { + display: block + } + + .el-col-md-offset-24 { + margin-left: 100% + } + + .el-col-md-pull-24 { + position: relative; + right: 100% + } + + .el-col-md-push-24 { + left: 100%; + position: relative + } +} + +@media only screen and (min-width:1200px) { + .el-col-lg-0 { + display: none; + flex: 0 0 0%; + max-width: 0 + } + + .el-col-lg-0.is-guttered { + display: none + } + + .el-col-lg-offset-0 { + margin-left: 0 + } + + .el-col-lg-pull-0 { + position: relative; + right: 0 + } + + .el-col-lg-push-0 { + left: 0; + position: relative + } + + .el-col-lg-1 { + flex: 0 0 4.1666666667%; + max-width: 4.1666666667% + } + + .el-col-lg-1, + .el-col-lg-1.is-guttered { + display: block + } + + .el-col-lg-offset-1 { + margin-left: 4.1666666667% + } + + .el-col-lg-pull-1 { + position: relative; + right: 4.1666666667% + } + + .el-col-lg-push-1 { + left: 4.1666666667%; + position: relative + } + + .el-col-lg-2 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .el-col-lg-2, + .el-col-lg-2.is-guttered { + display: block + } + + .el-col-lg-offset-2 { + margin-left: 8.3333333333% + } + + .el-col-lg-pull-2 { + position: relative; + right: 8.3333333333% + } + + .el-col-lg-push-2 { + left: 8.3333333333%; + position: relative + } + + .el-col-lg-3 { + flex: 0 0 12.5%; + max-width: 12.5% + } + + .el-col-lg-3, + .el-col-lg-3.is-guttered { + display: block + } + + .el-col-lg-offset-3 { + margin-left: 12.5% + } + + .el-col-lg-pull-3 { + position: relative; + right: 12.5% + } + + .el-col-lg-push-3 { + left: 12.5%; + position: relative + } + + .el-col-lg-4 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .el-col-lg-4, + .el-col-lg-4.is-guttered { + display: block + } + + .el-col-lg-offset-4 { + margin-left: 16.6666666667% + } + + .el-col-lg-pull-4 { + position: relative; + right: 16.6666666667% + } + + .el-col-lg-push-4 { + left: 16.6666666667%; + position: relative + } + + .el-col-lg-5 { + flex: 0 0 20.8333333333%; + max-width: 20.8333333333% + } + + .el-col-lg-5, + .el-col-lg-5.is-guttered { + display: block + } + + .el-col-lg-offset-5 { + margin-left: 20.8333333333% + } + + .el-col-lg-pull-5 { + position: relative; + right: 20.8333333333% + } + + .el-col-lg-push-5 { + left: 20.8333333333%; + position: relative + } + + .el-col-lg-6 { + flex: 0 0 25%; + max-width: 25% + } + + .el-col-lg-6, + .el-col-lg-6.is-guttered { + display: block + } + + .el-col-lg-offset-6 { + margin-left: 25% + } + + .el-col-lg-pull-6 { + position: relative; + right: 25% + } + + .el-col-lg-push-6 { + left: 25%; + position: relative + } + + .el-col-lg-7 { + flex: 0 0 29.1666666667%; + max-width: 29.1666666667% + } + + .el-col-lg-7, + .el-col-lg-7.is-guttered { + display: block + } + + .el-col-lg-offset-7 { + margin-left: 29.1666666667% + } + + .el-col-lg-pull-7 { + position: relative; + right: 29.1666666667% + } + + .el-col-lg-push-7 { + left: 29.1666666667%; + position: relative + } + + .el-col-lg-8 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .el-col-lg-8, + .el-col-lg-8.is-guttered { + display: block + } + + .el-col-lg-offset-8 { + margin-left: 33.3333333333% + } + + .el-col-lg-pull-8 { + position: relative; + right: 33.3333333333% + } + + .el-col-lg-push-8 { + left: 33.3333333333%; + position: relative + } + + .el-col-lg-9 { + flex: 0 0 37.5%; + max-width: 37.5% + } + + .el-col-lg-9, + .el-col-lg-9.is-guttered { + display: block + } + + .el-col-lg-offset-9 { + margin-left: 37.5% + } + + .el-col-lg-pull-9 { + position: relative; + right: 37.5% + } + + .el-col-lg-push-9 { + left: 37.5%; + position: relative + } + + .el-col-lg-10 { + display: block; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .el-col-lg-10.is-guttered { + display: block + } + + .el-col-lg-offset-10 { + margin-left: 41.6666666667% + } + + .el-col-lg-pull-10 { + position: relative; + right: 41.6666666667% + } + + .el-col-lg-push-10 { + left: 41.6666666667%; + position: relative + } + + .el-col-lg-11 { + display: block; + flex: 0 0 45.8333333333%; + max-width: 45.8333333333% + } + + .el-col-lg-11.is-guttered { + display: block + } + + .el-col-lg-offset-11 { + margin-left: 45.8333333333% + } + + .el-col-lg-pull-11 { + position: relative; + right: 45.8333333333% + } + + .el-col-lg-push-11 { + left: 45.8333333333%; + position: relative + } + + .el-col-lg-12 { + display: block; + flex: 0 0 50%; + max-width: 50% + } + + .el-col-lg-12.is-guttered { + display: block + } + + .el-col-lg-offset-12 { + margin-left: 50% + } + + .el-col-lg-pull-12 { + position: relative; + right: 50% + } + + .el-col-lg-push-12 { + left: 50%; + position: relative + } + + .el-col-lg-13 { + display: block; + flex: 0 0 54.1666666667%; + max-width: 54.1666666667% + } + + .el-col-lg-13.is-guttered { + display: block + } + + .el-col-lg-offset-13 { + margin-left: 54.1666666667% + } + + .el-col-lg-pull-13 { + position: relative; + right: 54.1666666667% + } + + .el-col-lg-push-13 { + left: 54.1666666667%; + position: relative + } + + .el-col-lg-14 { + display: block; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .el-col-lg-14.is-guttered { + display: block + } + + .el-col-lg-offset-14 { + margin-left: 58.3333333333% + } + + .el-col-lg-pull-14 { + position: relative; + right: 58.3333333333% + } + + .el-col-lg-push-14 { + left: 58.3333333333%; + position: relative + } + + .el-col-lg-15 { + display: block; + flex: 0 0 62.5%; + max-width: 62.5% + } + + .el-col-lg-15.is-guttered { + display: block + } + + .el-col-lg-offset-15 { + margin-left: 62.5% + } + + .el-col-lg-pull-15 { + position: relative; + right: 62.5% + } + + .el-col-lg-push-15 { + left: 62.5%; + position: relative + } + + .el-col-lg-16 { + display: block; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .el-col-lg-16.is-guttered { + display: block + } + + .el-col-lg-offset-16 { + margin-left: 66.6666666667% + } + + .el-col-lg-pull-16 { + position: relative; + right: 66.6666666667% + } + + .el-col-lg-push-16 { + left: 66.6666666667%; + position: relative + } + + .el-col-lg-17 { + display: block; + flex: 0 0 70.8333333333%; + max-width: 70.8333333333% + } + + .el-col-lg-17.is-guttered { + display: block + } + + .el-col-lg-offset-17 { + margin-left: 70.8333333333% + } + + .el-col-lg-pull-17 { + position: relative; + right: 70.8333333333% + } + + .el-col-lg-push-17 { + left: 70.8333333333%; + position: relative + } + + .el-col-lg-18 { + display: block; + flex: 0 0 75%; + max-width: 75% + } + + .el-col-lg-18.is-guttered { + display: block + } + + .el-col-lg-offset-18 { + margin-left: 75% + } + + .el-col-lg-pull-18 { + position: relative; + right: 75% + } + + .el-col-lg-push-18 { + left: 75%; + position: relative + } + + .el-col-lg-19 { + display: block; + flex: 0 0 79.1666666667%; + max-width: 79.1666666667% + } + + .el-col-lg-19.is-guttered { + display: block + } + + .el-col-lg-offset-19 { + margin-left: 79.1666666667% + } + + .el-col-lg-pull-19 { + position: relative; + right: 79.1666666667% + } + + .el-col-lg-push-19 { + left: 79.1666666667%; + position: relative + } + + .el-col-lg-20 { + display: block; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .el-col-lg-20.is-guttered { + display: block + } + + .el-col-lg-offset-20 { + margin-left: 83.3333333333% + } + + .el-col-lg-pull-20 { + position: relative; + right: 83.3333333333% + } + + .el-col-lg-push-20 { + left: 83.3333333333%; + position: relative + } + + .el-col-lg-21 { + display: block; + flex: 0 0 87.5%; + max-width: 87.5% + } + + .el-col-lg-21.is-guttered { + display: block + } + + .el-col-lg-offset-21 { + margin-left: 87.5% + } + + .el-col-lg-pull-21 { + position: relative; + right: 87.5% + } + + .el-col-lg-push-21 { + left: 87.5%; + position: relative + } + + .el-col-lg-22 { + display: block; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .el-col-lg-22.is-guttered { + display: block + } + + .el-col-lg-offset-22 { + margin-left: 91.6666666667% + } + + .el-col-lg-pull-22 { + position: relative; + right: 91.6666666667% + } + + .el-col-lg-push-22 { + left: 91.6666666667%; + position: relative + } + + .el-col-lg-23 { + display: block; + flex: 0 0 95.8333333333%; + max-width: 95.8333333333% + } + + .el-col-lg-23.is-guttered { + display: block + } + + .el-col-lg-offset-23 { + margin-left: 95.8333333333% + } + + .el-col-lg-pull-23 { + position: relative; + right: 95.8333333333% + } + + .el-col-lg-push-23 { + left: 95.8333333333%; + position: relative + } + + .el-col-lg-24 { + display: block; + flex: 0 0 100%; + max-width: 100% + } + + .el-col-lg-24.is-guttered { + display: block + } + + .el-col-lg-offset-24 { + margin-left: 100% + } + + .el-col-lg-pull-24 { + position: relative; + right: 100% + } + + .el-col-lg-push-24 { + left: 100%; + position: relative + } +} + +@media only screen and (min-width:1920px) { + .el-col-xl-0 { + display: none; + flex: 0 0 0%; + max-width: 0 + } + + .el-col-xl-0.is-guttered { + display: none + } + + .el-col-xl-offset-0 { + margin-left: 0 + } + + .el-col-xl-pull-0 { + position: relative; + right: 0 + } + + .el-col-xl-push-0 { + left: 0; + position: relative + } + + .el-col-xl-1 { + flex: 0 0 4.1666666667%; + max-width: 4.1666666667% + } + + .el-col-xl-1, + .el-col-xl-1.is-guttered { + display: block + } + + .el-col-xl-offset-1 { + margin-left: 4.1666666667% + } + + .el-col-xl-pull-1 { + position: relative; + right: 4.1666666667% + } + + .el-col-xl-push-1 { + left: 4.1666666667%; + position: relative + } + + .el-col-xl-2 { + flex: 0 0 8.3333333333%; + max-width: 8.3333333333% + } + + .el-col-xl-2, + .el-col-xl-2.is-guttered { + display: block + } + + .el-col-xl-offset-2 { + margin-left: 8.3333333333% + } + + .el-col-xl-pull-2 { + position: relative; + right: 8.3333333333% + } + + .el-col-xl-push-2 { + left: 8.3333333333%; + position: relative + } + + .el-col-xl-3 { + flex: 0 0 12.5%; + max-width: 12.5% + } + + .el-col-xl-3, + .el-col-xl-3.is-guttered { + display: block + } + + .el-col-xl-offset-3 { + margin-left: 12.5% + } + + .el-col-xl-pull-3 { + position: relative; + right: 12.5% + } + + .el-col-xl-push-3 { + left: 12.5%; + position: relative + } + + .el-col-xl-4 { + flex: 0 0 16.6666666667%; + max-width: 16.6666666667% + } + + .el-col-xl-4, + .el-col-xl-4.is-guttered { + display: block + } + + .el-col-xl-offset-4 { + margin-left: 16.6666666667% + } + + .el-col-xl-pull-4 { + position: relative; + right: 16.6666666667% + } + + .el-col-xl-push-4 { + left: 16.6666666667%; + position: relative + } + + .el-col-xl-5 { + flex: 0 0 20.8333333333%; + max-width: 20.8333333333% + } + + .el-col-xl-5, + .el-col-xl-5.is-guttered { + display: block + } + + .el-col-xl-offset-5 { + margin-left: 20.8333333333% + } + + .el-col-xl-pull-5 { + position: relative; + right: 20.8333333333% + } + + .el-col-xl-push-5 { + left: 20.8333333333%; + position: relative + } + + .el-col-xl-6 { + flex: 0 0 25%; + max-width: 25% + } + + .el-col-xl-6, + .el-col-xl-6.is-guttered { + display: block + } + + .el-col-xl-offset-6 { + margin-left: 25% + } + + .el-col-xl-pull-6 { + position: relative; + right: 25% + } + + .el-col-xl-push-6 { + left: 25%; + position: relative + } + + .el-col-xl-7 { + flex: 0 0 29.1666666667%; + max-width: 29.1666666667% + } + + .el-col-xl-7, + .el-col-xl-7.is-guttered { + display: block + } + + .el-col-xl-offset-7 { + margin-left: 29.1666666667% + } + + .el-col-xl-pull-7 { + position: relative; + right: 29.1666666667% + } + + .el-col-xl-push-7 { + left: 29.1666666667%; + position: relative + } + + .el-col-xl-8 { + flex: 0 0 33.3333333333%; + max-width: 33.3333333333% + } + + .el-col-xl-8, + .el-col-xl-8.is-guttered { + display: block + } + + .el-col-xl-offset-8 { + margin-left: 33.3333333333% + } + + .el-col-xl-pull-8 { + position: relative; + right: 33.3333333333% + } + + .el-col-xl-push-8 { + left: 33.3333333333%; + position: relative + } + + .el-col-xl-9 { + flex: 0 0 37.5%; + max-width: 37.5% + } + + .el-col-xl-9, + .el-col-xl-9.is-guttered { + display: block + } + + .el-col-xl-offset-9 { + margin-left: 37.5% + } + + .el-col-xl-pull-9 { + position: relative; + right: 37.5% + } + + .el-col-xl-push-9 { + left: 37.5%; + position: relative + } + + .el-col-xl-10 { + display: block; + flex: 0 0 41.6666666667%; + max-width: 41.6666666667% + } + + .el-col-xl-10.is-guttered { + display: block + } + + .el-col-xl-offset-10 { + margin-left: 41.6666666667% + } + + .el-col-xl-pull-10 { + position: relative; + right: 41.6666666667% + } + + .el-col-xl-push-10 { + left: 41.6666666667%; + position: relative + } + + .el-col-xl-11 { + display: block; + flex: 0 0 45.8333333333%; + max-width: 45.8333333333% + } + + .el-col-xl-11.is-guttered { + display: block + } + + .el-col-xl-offset-11 { + margin-left: 45.8333333333% + } + + .el-col-xl-pull-11 { + position: relative; + right: 45.8333333333% + } + + .el-col-xl-push-11 { + left: 45.8333333333%; + position: relative + } + + .el-col-xl-12 { + display: block; + flex: 0 0 50%; + max-width: 50% + } + + .el-col-xl-12.is-guttered { + display: block + } + + .el-col-xl-offset-12 { + margin-left: 50% + } + + .el-col-xl-pull-12 { + position: relative; + right: 50% + } + + .el-col-xl-push-12 { + left: 50%; + position: relative + } + + .el-col-xl-13 { + display: block; + flex: 0 0 54.1666666667%; + max-width: 54.1666666667% + } + + .el-col-xl-13.is-guttered { + display: block + } + + .el-col-xl-offset-13 { + margin-left: 54.1666666667% + } + + .el-col-xl-pull-13 { + position: relative; + right: 54.1666666667% + } + + .el-col-xl-push-13 { + left: 54.1666666667%; + position: relative + } + + .el-col-xl-14 { + display: block; + flex: 0 0 58.3333333333%; + max-width: 58.3333333333% + } + + .el-col-xl-14.is-guttered { + display: block + } + + .el-col-xl-offset-14 { + margin-left: 58.3333333333% + } + + .el-col-xl-pull-14 { + position: relative; + right: 58.3333333333% + } + + .el-col-xl-push-14 { + left: 58.3333333333%; + position: relative + } + + .el-col-xl-15 { + display: block; + flex: 0 0 62.5%; + max-width: 62.5% + } + + .el-col-xl-15.is-guttered { + display: block + } + + .el-col-xl-offset-15 { + margin-left: 62.5% + } + + .el-col-xl-pull-15 { + position: relative; + right: 62.5% + } + + .el-col-xl-push-15 { + left: 62.5%; + position: relative + } + + .el-col-xl-16 { + display: block; + flex: 0 0 66.6666666667%; + max-width: 66.6666666667% + } + + .el-col-xl-16.is-guttered { + display: block + } + + .el-col-xl-offset-16 { + margin-left: 66.6666666667% + } + + .el-col-xl-pull-16 { + position: relative; + right: 66.6666666667% + } + + .el-col-xl-push-16 { + left: 66.6666666667%; + position: relative + } + + .el-col-xl-17 { + display: block; + flex: 0 0 70.8333333333%; + max-width: 70.8333333333% + } + + .el-col-xl-17.is-guttered { + display: block + } + + .el-col-xl-offset-17 { + margin-left: 70.8333333333% + } + + .el-col-xl-pull-17 { + position: relative; + right: 70.8333333333% + } + + .el-col-xl-push-17 { + left: 70.8333333333%; + position: relative + } + + .el-col-xl-18 { + display: block; + flex: 0 0 75%; + max-width: 75% + } + + .el-col-xl-18.is-guttered { + display: block + } + + .el-col-xl-offset-18 { + margin-left: 75% + } + + .el-col-xl-pull-18 { + position: relative; + right: 75% + } + + .el-col-xl-push-18 { + left: 75%; + position: relative + } + + .el-col-xl-19 { + display: block; + flex: 0 0 79.1666666667%; + max-width: 79.1666666667% + } + + .el-col-xl-19.is-guttered { + display: block + } + + .el-col-xl-offset-19 { + margin-left: 79.1666666667% + } + + .el-col-xl-pull-19 { + position: relative; + right: 79.1666666667% + } + + .el-col-xl-push-19 { + left: 79.1666666667%; + position: relative + } + + .el-col-xl-20 { + display: block; + flex: 0 0 83.3333333333%; + max-width: 83.3333333333% + } + + .el-col-xl-20.is-guttered { + display: block + } + + .el-col-xl-offset-20 { + margin-left: 83.3333333333% + } + + .el-col-xl-pull-20 { + position: relative; + right: 83.3333333333% + } + + .el-col-xl-push-20 { + left: 83.3333333333%; + position: relative + } + + .el-col-xl-21 { + display: block; + flex: 0 0 87.5%; + max-width: 87.5% + } + + .el-col-xl-21.is-guttered { + display: block + } + + .el-col-xl-offset-21 { + margin-left: 87.5% + } + + .el-col-xl-pull-21 { + position: relative; + right: 87.5% + } + + .el-col-xl-push-21 { + left: 87.5%; + position: relative + } + + .el-col-xl-22 { + display: block; + flex: 0 0 91.6666666667%; + max-width: 91.6666666667% + } + + .el-col-xl-22.is-guttered { + display: block + } + + .el-col-xl-offset-22 { + margin-left: 91.6666666667% + } + + .el-col-xl-pull-22 { + position: relative; + right: 91.6666666667% + } + + .el-col-xl-push-22 { + left: 91.6666666667%; + position: relative + } + + .el-col-xl-23 { + display: block; + flex: 0 0 95.8333333333%; + max-width: 95.8333333333% + } + + .el-col-xl-23.is-guttered { + display: block + } + + .el-col-xl-offset-23 { + margin-left: 95.8333333333% + } + + .el-col-xl-pull-23 { + position: relative; + right: 95.8333333333% + } + + .el-col-xl-push-23 { + left: 95.8333333333%; + position: relative + } + + .el-col-xl-24 { + display: block; + flex: 0 0 100%; + max-width: 100% + } + + .el-col-xl-24.is-guttered { + display: block + } + + .el-col-xl-offset-24 { + margin-left: 100% + } + + .el-col-xl-pull-24 { + position: relative; + right: 100% + } + + .el-col-xl-push-24 { + left: 100%; + position: relative + } +} + +.el-collapse { + --el-collapse-border-color: var(--el-border-color-lighter); + --el-collapse-header-height: 48px; + --el-collapse-header-bg-color: var(--el-fill-color-blank); + --el-collapse-header-text-color: var(--el-text-color-primary); + --el-collapse-header-font-size: 13px; + --el-collapse-content-bg-color: var(--el-fill-color-blank); + --el-collapse-content-font-size: 13px; + --el-collapse-content-text-color: var(--el-text-color-primary); + border-bottom: 1px solid var(--el-collapse-border-color); + border-top: 1px solid var(--el-collapse-border-color) +} + +.el-collapse-item.is-disabled .el-collapse-item__header { + color: var(--el-text-color-disabled); + cursor: not-allowed +} + +.el-collapse-item__header { + align-items: center; + background-color: var(--el-collapse-header-bg-color); + border: none; + border-bottom: 1px solid var(--el-collapse-border-color); + color: var(--el-collapse-header-text-color); + cursor: pointer; + display: flex; + font-size: var(--el-collapse-header-font-size); + font-weight: 500; + height: var(--el-collapse-header-height); + line-height: var(--el-collapse-header-height); + outline: none; + padding: 0; + transition: border-bottom-color var(--el-transition-duration); + width: 100% +} + +.el-collapse-item__arrow { + font-weight: 300; + margin: 0 8px 0 auto; + transition: transform var(--el-transition-duration) +} + +.el-collapse-item__arrow.is-active { + transform: rotate(90deg) +} + +.el-collapse-item__header.focusing:focus:not(:hover) { + color: var(--el-color-primary) +} + +.el-collapse-item__header.is-active { + border-bottom-color: transparent +} + +.el-collapse-item__wrap { + background-color: var(--el-collapse-content-bg-color); + border-bottom: 1px solid var(--el-collapse-border-color); + box-sizing: border-box; + overflow: hidden; + will-change: height +} + +.el-collapse-item__content { + color: var(--el-collapse-content-text-color); + font-size: var(--el-collapse-content-font-size); + line-height: 1.7692307692; + padding-bottom: 25px +} + +.el-collapse-item:last-child { + margin-bottom: -1px +} + +.el-color-predefine { + display: flex; + font-size: 12px; + margin-top: 8px; + width: 280px +} + +.el-color-predefine__colors { + display: flex; + flex: 1; + flex-wrap: wrap +} + +.el-color-predefine__color-selector { + border-radius: 4px; + cursor: pointer; + height: 20px; + margin: 0 0 8px 8px; + width: 20px +} + +.el-color-predefine__color-selector:nth-child(10n+1) { + margin-left: 0 +} + +.el-color-predefine__color-selector.selected { + box-shadow: 0 0 3px 2px var(--el-color-primary) +} + +.el-color-predefine__color-selector>div { + border-radius: 3px; + display: flex; + height: 100% +} + +.el-color-predefine__color-selector.is-alpha { + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==) +} + +.el-color-hue-slider { + background-color: red; + box-sizing: border-box; + float: right; + height: 12px; + padding: 0 2px; + position: relative; + width: 280px +} + +.el-color-hue-slider__bar { + background: linear-gradient(90deg, red 0, #ff0 17%, #0f0 33%, #0ff, #00f 67%, #f0f 83%, red); + height: 100%; + position: relative +} + +.el-color-hue-slider__thumb { + background: #fff; + border: 1px solid var(--el-border-color-lighter); + border-radius: 1px; + box-shadow: 0 0 2px #0009; + box-sizing: border-box; + cursor: pointer; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 4px; + z-index: 1 +} + +.el-color-hue-slider__thumb:focus-visible { + outline: 2px solid var(--el-color-primary); + outline-offset: 1px +} + +.el-color-hue-slider.is-vertical { + height: 180px; + padding: 2px 0; + width: 12px +} + +.el-color-hue-slider.is-vertical .el-color-hue-slider__bar { + background: linear-gradient(180deg, red 0, #ff0 17%, #0f0 33%, #0ff, #00f 67%, #f0f 83%, red) +} + +.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb { + height: 4px; + left: 0; + top: 0; + width: 100% +} + +.el-color-svpanel { + height: 180px; + position: relative; + width: 280px +} + +.el-color-svpanel__black, +.el-color-svpanel__white { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0 +} + +.el-color-svpanel__white { + background: linear-gradient(90deg, #fff, #fff0) +} + +.el-color-svpanel__black { + background: linear-gradient(0deg, #000, #0000) +} + +.el-color-svpanel__cursor { + position: absolute +} + +.el-color-svpanel__cursor>div { + border-radius: 50%; + box-shadow: 0 0 0 1.5px #fff, inset 0 0 1px 1px #0000004d, 0 0 1px 2px #0006; + cursor: head; + height: 4px; + transform: translate(-2px, -2px); + width: 4px +} + +.el-color-alpha-slider { + background-image: linear-gradient(45deg, var(--el-color-picker-alpha-bg-a) 25%, var(--el-color-picker-alpha-bg-b) 25%), linear-gradient(135deg, var(--el-color-picker-alpha-bg-a) 25%, var(--el-color-picker-alpha-bg-b) 25%), linear-gradient(45deg, var(--el-color-picker-alpha-bg-b) 75%, var(--el-color-picker-alpha-bg-a) 75%), linear-gradient(135deg, var(--el-color-picker-alpha-bg-b) 75%, var(--el-color-picker-alpha-bg-a) 75%); + background-position: 0 0, 6px 0, 6px -6px, 0 6px; + background-size: 12px 12px; + box-sizing: border-box; + height: 12px; + position: relative; + width: 280px +} + +.el-color-alpha-slider__bar { + background: linear-gradient(to right, rgba(255, 255, 255, 0) 0, var(--el-bg-color) 100%); + height: 100%; + position: relative +} + +.el-color-alpha-slider__thumb { + background: #fff; + border: 1px solid var(--el-border-color-lighter); + border-radius: 1px; + box-shadow: 0 0 2px #0009; + box-sizing: border-box; + cursor: pointer; + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 4px; + z-index: 1 +} + +.el-color-alpha-slider__thumb:focus-visible { + outline: 2px solid var(--el-color-primary); + outline-offset: 1px +} + +.el-color-alpha-slider.is-vertical { + height: 180px; + width: 20px +} + +.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar { + background: linear-gradient(180deg, #fff0 0, #fff) +} + +.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb { + height: 4px; + left: 0; + top: 0; + width: 100% +} + +.el-color-dropdown { + width: 300px +} + +.el-color-dropdown__main-wrapper { + margin-bottom: 6px +} + +.el-color-dropdown__main-wrapper:after { + clear: both; + content: ""; + display: table +} + +.el-color-dropdown__btns { + margin-top: 12px; + text-align: right +} + +.el-color-dropdown__value { + color: #000; + float: left; + font-size: 12px; + line-height: 26px; + width: 160px +} + +.el-color-picker { + display: inline-block; + line-height: normal; + outline: none; + position: relative +} + +.el-color-picker:hover:not(.is-disabled, .is-focused) .el-color-picker__trigger { + border-color: var(--el-border-color-hover) +} + +.el-color-picker:focus-visible:not(.is-disabled) .el-color-picker__trigger { + outline: 2px solid var(--el-color-primary); + outline-offset: 1px +} + +.el-color-picker.is-focused .el-color-picker__trigger { + border-color: var(--el-color-primary) +} + +.el-color-picker.is-disabled .el-color-picker__trigger { + cursor: not-allowed +} + +.el-color-picker--large { + height: 40px +} + +.el-color-picker--large .el-color-picker__trigger { + height: 40px; + width: 40px +} + +.el-color-picker--large .el-color-picker__mask { + height: 38px; + width: 38px +} + +.el-color-picker--small { + height: 24px +} + +.el-color-picker--small .el-color-picker__trigger { + height: 24px; + width: 24px +} + +.el-color-picker--small .el-color-picker__mask { + height: 22px; + width: 22px +} + +.el-color-picker--small .el-color-picker__empty, +.el-color-picker--small .el-color-picker__icon { + transform: scale(.8) +} + +.el-color-picker__mask { + background-color: #ffffffb3; + border-radius: 4px; + cursor: not-allowed; + height: 30px; + left: 1px; + position: absolute; + top: 1px; + width: 30px; + z-index: 1 +} + +.el-color-picker__trigger { + align-items: center; + border: 1px solid var(--el-border-color); + border-radius: 4px; + box-sizing: border-box; + cursor: pointer; + display: inline-flex; + font-size: 0; + height: 32px; + justify-content: center; + padding: 4px; + position: relative; + width: 32px +} + +.el-color-picker__color { + border: 1px solid var(--el-text-color-secondary); + border-radius: var(--el-border-radius-small); + box-sizing: border-box; + display: block; + height: 100%; + position: relative; + text-align: center; + width: 100% +} + +.el-color-picker__color.is-alpha { + background-image: linear-gradient(45deg, var(--el-color-picker-alpha-bg-a) 25%, var(--el-color-picker-alpha-bg-b) 25%), linear-gradient(135deg, var(--el-color-picker-alpha-bg-a) 25%, var(--el-color-picker-alpha-bg-b) 25%), linear-gradient(45deg, var(--el-color-picker-alpha-bg-b) 75%, var(--el-color-picker-alpha-bg-a) 75%), linear-gradient(135deg, var(--el-color-picker-alpha-bg-b) 75%, var(--el-color-picker-alpha-bg-a) 75%); + background-position: 0 0, 6px 0, 6px -6px, 0 6px; + background-size: 12px 12px +} + +.el-color-picker__color-inner { + align-items: center; + display: inline-flex; + height: 100%; + justify-content: center; + width: 100% +} + +.el-color-picker .el-color-picker__empty { + color: var(--el-text-color-secondary); + font-size: 12px +} + +.el-color-picker .el-color-picker__icon { + align-items: center; + color: #fff; + display: inline-flex; + font-size: 12px; + justify-content: center +} + +.el-color-picker__panel { + background-color: #fff; + border-radius: var(--el-border-radius-base); + box-shadow: var(--el-box-shadow-light); + box-sizing: content-box; + padding: 6px; + position: absolute; + z-index: 10 +} + +.el-color-picker__panel.el-popper { + border: 1px solid var(--el-border-color-lighter) +} + +.el-color-picker, +.el-color-picker__panel { + --el-color-picker-alpha-bg-a: #ccc; + --el-color-picker-alpha-bg-b: transparent +} + +.dark .el-color-picker, +.dark .el-color-picker__panel { + --el-color-picker-alpha-bg-a: #333333 +} + +.el-container { + box-sizing: border-box; + display: flex; + flex: 1; + flex-basis: auto; + flex-direction: row; + min-width: 0 +} + +.el-container.is-vertical { + flex-direction: column +} + +.el-date-table { + font-size: 12px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-date-table.is-week-mode .el-date-table__row:hover .el-date-table-cell { + background-color: var(--el-datepicker-inrange-bg-color) +} + +.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover { + color: var(--el-datepicker-text-color) +} + +.el-date-table.is-week-mode .el-date-table__row:hover td:first-child .el-date-table-cell { + border-bottom-left-radius: 15px; + border-top-left-radius: 15px; + margin-left: 5px +} + +.el-date-table.is-week-mode .el-date-table__row:hover td:last-child .el-date-table-cell { + border-bottom-right-radius: 15px; + border-top-right-radius: 15px; + margin-right: 5px +} + +.el-date-table.is-week-mode .el-date-table__row.current .el-date-table-cell { + background-color: var(--el-datepicker-inrange-bg-color) +} + +.el-date-table td { + box-sizing: border-box; + cursor: pointer; + height: 30px; + padding: 4px 0; + position: relative; + text-align: center; + width: 32px +} + +.el-date-table td .el-date-table-cell { + box-sizing: border-box; + height: 30px; + padding: 3px 0 +} + +.el-date-table td .el-date-table-cell .el-date-table-cell__text { + border-radius: 50%; + display: block; + height: 24px; + left: 50%; + line-height: 24px; + margin: 0 auto; + position: absolute; + transform: translate(-50%); + width: 24px +} + +.el-date-table td.next-month, +.el-date-table td.prev-month { + color: var(--el-datepicker-off-text-color) +} + +.el-date-table td.today { + position: relative +} + +.el-date-table td.today .el-date-table-cell__text { + color: var(--el-color-primary); + font-weight: 700 +} + +.el-date-table td.today.end-date .el-date-table-cell__text, +.el-date-table td.today.start-date .el-date-table-cell__text { + color: #fff +} + +.el-date-table td.available:hover { + color: var(--el-datepicker-hover-text-color) +} + +.el-date-table td.in-range .el-date-table-cell { + background-color: var(--el-datepicker-inrange-bg-color) +} + +.el-date-table td.in-range .el-date-table-cell:hover { + background-color: var(--el-datepicker-inrange-hover-bg-color) +} + +.el-date-table td.current:not(.disabled) .el-date-table-cell__text { + background-color: var(--el-datepicker-active-color); + color: #fff +} + +.el-date-table td.current:not(.disabled):focus-visible .el-date-table-cell__text { + outline: 2px solid var(--el-datepicker-active-color); + outline-offset: 1px +} + +.el-date-table td.end-date .el-date-table-cell, +.el-date-table td.start-date .el-date-table-cell { + color: #fff +} + +.el-date-table td.end-date .el-date-table-cell__text, +.el-date-table td.start-date .el-date-table-cell__text { + background-color: var(--el-datepicker-active-color) +} + +.el-date-table td.start-date .el-date-table-cell { + border-bottom-left-radius: 15px; + border-top-left-radius: 15px; + margin-left: 5px +} + +.el-date-table td.end-date .el-date-table-cell { + border-bottom-right-radius: 15px; + border-top-right-radius: 15px; + margin-right: 5px +} + +.el-date-table td.disabled .el-date-table-cell { + background-color: var(--el-fill-color-light); + color: var(--el-text-color-placeholder); + cursor: not-allowed; + opacity: 1 +} + +.el-date-table td.selected .el-date-table-cell { + border-radius: 15px; + margin-left: 5px; + margin-right: 5px +} + +.el-date-table td.selected .el-date-table-cell__text { + background-color: var(--el-datepicker-active-color); + border-radius: 15px; + color: #fff +} + +.el-date-table td.week { + color: var(--el-datepicker-header-text-color); + font-size: 80% +} + +.el-date-table td:focus { + outline: none +} + +.el-date-table th { + border-bottom: 1px solid var(--el-border-color-lighter); + color: var(--el-datepicker-header-text-color); + font-weight: 400; + padding: 5px +} + +.el-month-table { + border-collapse: collapse; + font-size: 12px; + margin: -1px +} + +.el-month-table td { + cursor: pointer; + padding: 8px 0; + position: relative; + text-align: center; + width: 68px +} + +.el-month-table td .el-date-table-cell { + box-sizing: border-box; + height: 48px; + padding: 6px 0 +} + +.el-month-table td.today .el-date-table-cell__text { + color: var(--el-color-primary); + font-weight: 700 +} + +.el-month-table td.today.end-date .el-date-table-cell__text, +.el-month-table td.today.start-date .el-date-table-cell__text { + color: #fff +} + +.el-month-table td.disabled .el-date-table-cell__text { + background-color: var(--el-fill-color-light); + color: var(--el-text-color-placeholder); + cursor: not-allowed +} + +.el-month-table td.disabled .el-date-table-cell__text:hover { + color: var(--el-text-color-placeholder) +} + +.el-month-table td .el-date-table-cell__text { + border-radius: 18px; + color: var(--el-datepicker-text-color); + display: block; + height: 36px; + left: 50%; + line-height: 36px; + margin: 0 auto; + position: absolute; + transform: translate(-50%); + width: 54px +} + +.el-month-table td .el-date-table-cell__text:hover { + color: var(--el-datepicker-hover-text-color) +} + +.el-month-table td.in-range .el-date-table-cell { + background-color: var(--el-datepicker-inrange-bg-color) +} + +.el-month-table td.in-range .el-date-table-cell:hover { + background-color: var(--el-datepicker-inrange-hover-bg-color) +} + +.el-month-table td.end-date .el-date-table-cell, +.el-month-table td.start-date .el-date-table-cell { + color: #fff +} + +.el-month-table td.end-date .el-date-table-cell__text, +.el-month-table td.start-date .el-date-table-cell__text { + background-color: var(--el-datepicker-active-color); + color: #fff +} + +.el-month-table td.start-date .el-date-table-cell { + border-bottom-left-radius: 24px; + border-top-left-radius: 24px; + margin-left: 3px +} + +.el-month-table td.end-date .el-date-table-cell { + border-bottom-right-radius: 24px; + border-top-right-radius: 24px; + margin-right: 3px +} + +.el-month-table td.current:not(.disabled) .el-date-table-cell { + border-radius: 24px; + margin-left: 3px; + margin-right: 3px +} + +.el-month-table td.current:not(.disabled) .el-date-table-cell__text { + background-color: var(--el-datepicker-active-color); + color: #fff +} + +.el-month-table td:focus-visible { + outline: none +} + +.el-month-table td:focus-visible .el-date-table-cell__text { + outline: 2px solid var(--el-datepicker-active-color); + outline-offset: 1px +} + +.el-year-table { + border-collapse: collapse; + font-size: 12px; + margin: -1px +} + +.el-year-table .el-icon { + color: var(--el-datepicker-icon-color) +} + +.el-year-table td { + cursor: pointer; + padding: 8px 0; + position: relative; + text-align: center; + width: 68px +} + +.el-year-table td .el-date-table-cell { + box-sizing: border-box; + height: 48px; + padding: 6px 0 +} + +.el-year-table td.today .el-date-table-cell__text { + color: var(--el-color-primary); + font-weight: 700 +} + +.el-year-table td.today.end-date .el-date-table-cell__text, +.el-year-table td.today.start-date .el-date-table-cell__text { + color: #fff +} + +.el-year-table td.disabled .el-date-table-cell__text { + background-color: var(--el-fill-color-light); + color: var(--el-text-color-placeholder); + cursor: not-allowed +} + +.el-year-table td.disabled .el-date-table-cell__text:hover { + color: var(--el-text-color-placeholder) +} + +.el-year-table td .el-date-table-cell__text { + border-radius: 18px; + color: var(--el-datepicker-text-color); + display: block; + height: 36px; + left: 50%; + line-height: 36px; + margin: 0 auto; + position: absolute; + transform: translate(-50%); + width: 60px +} + +.el-year-table td .el-date-table-cell__text:hover { + color: var(--el-datepicker-hover-text-color) +} + +.el-year-table td.in-range .el-date-table-cell { + background-color: var(--el-datepicker-inrange-bg-color) +} + +.el-year-table td.in-range .el-date-table-cell:hover { + background-color: var(--el-datepicker-inrange-hover-bg-color) +} + +.el-year-table td.end-date .el-date-table-cell, +.el-year-table td.start-date .el-date-table-cell { + color: #fff +} + +.el-year-table td.end-date .el-date-table-cell__text, +.el-year-table td.start-date .el-date-table-cell__text { + background-color: var(--el-datepicker-active-color); + color: #fff +} + +.el-year-table td.start-date .el-date-table-cell { + border-bottom-left-radius: 24px; + border-top-left-radius: 24px +} + +.el-year-table td.end-date .el-date-table-cell { + border-bottom-right-radius: 24px; + border-top-right-radius: 24px +} + +.el-year-table td.current:not(.disabled) .el-date-table-cell__text { + background-color: var(--el-datepicker-active-color); + color: #fff +} + +.el-year-table td:focus-visible { + outline: none +} + +.el-year-table td:focus-visible .el-date-table-cell__text { + outline: 2px solid var(--el-datepicker-active-color); + outline-offset: 1px +} + +.el-time-spinner.has-seconds .el-time-spinner__wrapper { + width: 33.3% +} + +.el-time-spinner__wrapper { + display: inline-block; + max-height: 192px; + overflow: auto; + position: relative; + vertical-align: top; + width: 50% +} + +.el-time-spinner__wrapper.el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default) { + padding-bottom: 15px +} + +.el-time-spinner__wrapper.is-arrow { + box-sizing: border-box; + overflow: hidden; + text-align: center +} + +.el-time-spinner__wrapper.is-arrow .el-time-spinner__list { + transform: translateY(-32px) +} + +.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.is-disabled):not(.is-active) { + background: var(--el-fill-color-light); + cursor: default +} + +.el-time-spinner__arrow { + color: var(--el-text-color-secondary); + cursor: pointer; + font-size: 12px; + height: 30px; + left: 0; + line-height: 30px; + position: absolute; + text-align: center; + width: 100%; + z-index: var(--el-index-normal) +} + +.el-time-spinner__arrow:hover { + color: var(--el-color-primary) +} + +.el-time-spinner__arrow.arrow-up { + top: 10px +} + +.el-time-spinner__arrow.arrow-down { + bottom: 10px +} + +.el-time-spinner__input.el-input { + width: 70% +} + +.el-time-spinner__input.el-input .el-input__inner, +.el-time-spinner__list { + padding: 0; + text-align: center +} + +.el-time-spinner__list { + list-style: none; + margin: 0 +} + +.el-time-spinner__list:after, +.el-time-spinner__list:before { + content: ""; + display: block; + height: 80px; + width: 100% +} + +.el-time-spinner__item { + color: var(--el-text-color-regular); + font-size: 12px; + height: 32px; + line-height: 32px +} + +.el-time-spinner__item:hover:not(.is-disabled):not(.is-active) { + background: var(--el-fill-color-light); + cursor: pointer +} + +.el-time-spinner__item.is-active:not(.is-disabled) { + color: var(--el-text-color-primary); + font-weight: 700 +} + +.el-time-spinner__item.is-disabled { + color: var(--el-text-color-placeholder); + cursor: not-allowed +} + +.el-picker__popper { + --el-datepicker-border-color: var(--el-disabled-border-color) +} + +.el-picker__popper.el-popper { + background: var(--el-bg-color-overlay); + box-shadow: var(--el-box-shadow-light) +} + +.el-picker__popper.el-popper, +.el-picker__popper.el-popper .el-popper__arrow:before { + border: 1px solid var(--el-datepicker-border-color) +} + +.el-picker__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before { + border-left-color: transparent; + border-top-color: transparent +} + +.el-picker__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before { + border-bottom-color: transparent; + border-right-color: transparent +} + +.el-picker__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before { + border-bottom-color: transparent; + border-left-color: transparent +} + +.el-picker__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before { + border-right-color: transparent; + border-top-color: transparent +} + +.el-date-editor { + --el-date-editor-width: 220px; + --el-date-editor-monthrange-width: 300px; + --el-date-editor-daterange-width: 350px; + --el-date-editor-datetimerange-width: 400px; + --el-input-text-color: var(--el-text-color-regular); + --el-input-border: var(--el-border); + --el-input-hover-border: var(--el-border-color-hover); + --el-input-focus-border: var(--el-color-primary); + --el-input-transparent-border: 0 0 0 1px transparent inset; + --el-input-border-color: var(--el-border-color); + --el-input-border-radius: var(--el-border-radius-base); + --el-input-bg-color: var(--el-fill-color-blank); + --el-input-icon-color: var(--el-text-color-placeholder); + --el-input-placeholder-color: var(--el-text-color-placeholder); + --el-input-hover-border-color: var(--el-border-color-hover); + --el-input-clear-hover-color: var(--el-text-color-secondary); + --el-input-focus-border-color: var(--el-color-primary); + --el-input-width: 100%; + position: relative; + text-align: left; + vertical-align: middle +} + +.el-date-editor.el-input__wrapper { + box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset +} + +.el-date-editor.el-input__wrapper:hover { + box-shadow: 0 0 0 1px var(--el-input-hover-border-color) inset +} + +.el-date-editor.el-input, +.el-date-editor.el-input__wrapper { + height: var(--el-input-height, var(--el-component-size)); + width: var(--el-date-editor-width) +} + +.el-date-editor--monthrange { + --el-date-editor-width: var(--el-date-editor-monthrange-width) +} + +.el-date-editor--daterange, +.el-date-editor--timerange { + --el-date-editor-width: var(--el-date-editor-daterange-width) +} + +.el-date-editor--datetimerange { + --el-date-editor-width: var(--el-date-editor-datetimerange-width) +} + +.el-date-editor--dates .el-input__wrapper { + text-overflow: ellipsis; + white-space: nowrap +} + +.el-date-editor .clear-icon, +.el-date-editor .close-icon { + cursor: pointer +} + +.el-date-editor .clear-icon:hover { + color: var(--el-text-color-secondary) +} + +.el-date-editor .el-range__icon { + color: var(--el-text-color-placeholder); + float: left; + font-size: 14px; + height: inherit +} + +.el-date-editor .el-range__icon svg { + vertical-align: middle +} + +.el-date-editor .el-range-input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; + border: none; + color: var(--el-text-color-regular); + display: inline-block; + font-size: var(--el-font-size-base); + height: 30px; + line-height: 30px; + margin: 0; + outline: none; + padding: 0; + text-align: center; + width: 39% +} + +.el-date-editor .el-range-input::-moz-placeholder { + color: var(--el-text-color-placeholder) +} + +.el-date-editor .el-range-input::placeholder { + color: var(--el-text-color-placeholder) +} + +.el-date-editor .el-range-separator { + align-items: center; + color: var(--el-text-color-primary); + display: inline-flex; + flex: 1; + font-size: 14px; + height: 100%; + justify-content: center; + margin: 0; + overflow-wrap: break-word; + padding: 0 5px +} + +.el-date-editor .el-range__close-icon { + color: var(--el-text-color-placeholder); + cursor: pointer; + font-size: 14px; + height: inherit; + width: unset +} + +.el-date-editor .el-range__close-icon:hover { + color: var(--el-text-color-secondary) +} + +.el-date-editor .el-range__close-icon svg { + vertical-align: middle +} + +.el-date-editor .el-range__close-icon--hidden { + opacity: 0; + visibility: hidden +} + +.el-range-editor.el-input__wrapper { + align-items: center; + display: inline-flex; + padding: 0 10px; + vertical-align: middle +} + +.el-range-editor.is-active, +.el-range-editor.is-active:hover { + box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset +} + +.el-range-editor--large { + line-height: var(--el-component-size-large) +} + +.el-range-editor--large.el-input__wrapper { + height: var(--el-component-size-large) +} + +.el-range-editor--large .el-range-separator { + font-size: 14px; + line-height: 40px +} + +.el-range-editor--large .el-range-input { + font-size: 14px; + height: 38px; + line-height: 38px +} + +.el-range-editor--small { + line-height: var(--el-component-size-small) +} + +.el-range-editor--small.el-input__wrapper { + height: var(--el-component-size-small) +} + +.el-range-editor--small .el-range-separator { + font-size: 12px; + line-height: 24px +} + +.el-range-editor--small .el-range-input { + font-size: 12px; + height: 22px; + line-height: 22px +} + +.el-range-editor.is-disabled { + background-color: var(--el-disabled-bg-color); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-range-editor.is-disabled, +.el-range-editor.is-disabled:focus, +.el-range-editor.is-disabled:hover { + border-color: var(--el-disabled-border-color) +} + +.el-range-editor.is-disabled input { + background-color: var(--el-disabled-bg-color); + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-range-editor.is-disabled input::-moz-placeholder { + color: var(--el-text-color-placeholder) +} + +.el-range-editor.is-disabled input::placeholder { + color: var(--el-text-color-placeholder) +} + +.el-range-editor.is-disabled .el-range-separator { + color: var(--el-disabled-text-color) +} + +.el-picker-panel { + background: var(--el-bg-color-overlay); + border-radius: var(--el-border-radius-base); + color: var(--el-text-color-regular); + line-height: 30px +} + +.el-picker-panel .el-time-panel { + background-color: var(--el-bg-color-overlay); + border: 1px solid var(--el-datepicker-border-color); + box-shadow: var(--el-box-shadow-light); + margin: 5px 0 +} + +.el-picker-panel__body-wrapper:after, +.el-picker-panel__body:after { + clear: both; + content: ""; + display: table +} + +.el-picker-panel__content { + margin: 15px; + position: relative +} + +.el-picker-panel__footer { + background-color: var(--el-bg-color-overlay); + border-top: 1px solid var(--el-datepicker-inner-border-color); + font-size: 0; + padding: 4px 12px; + position: relative; + text-align: right +} + +.el-picker-panel__shortcut { + background-color: transparent; + border: 0; + color: var(--el-datepicker-text-color); + cursor: pointer; + display: block; + font-size: 14px; + line-height: 28px; + outline: none; + padding-left: 12px; + text-align: left; + width: 100% +} + +.el-picker-panel__shortcut:hover { + color: var(--el-datepicker-hover-text-color) +} + +.el-picker-panel__shortcut.active { + background-color: #e6f1fe; + color: var(--el-datepicker-active-color) +} + +.el-picker-panel__btn { + background-color: transparent; + border: 1px solid var(--el-fill-color-darker); + border-radius: 2px; + color: var(--el-text-color-primary); + cursor: pointer; + font-size: 12px; + line-height: 24px; + outline: none; + padding: 0 20px +} + +.el-picker-panel__btn[disabled] { + color: var(--el-text-color-disabled); + cursor: not-allowed +} + +.el-picker-panel__icon-btn { + background: transparent; + border: 0; + color: var(--el-datepicker-icon-color); + cursor: pointer; + font-size: 12px; + margin-top: 8px; + outline: none +} + +.el-picker-panel__icon-btn:hover { + color: var(--el-datepicker-hover-text-color) +} + +.el-picker-panel__icon-btn:focus-visible { + color: var(--el-datepicker-hover-text-color) +} + +.el-picker-panel__icon-btn.is-disabled { + color: var(--el-text-color-disabled) +} + +.el-picker-panel__icon-btn.is-disabled:hover { + cursor: not-allowed +} + +.el-picker-panel__icon-btn .el-icon { + cursor: pointer; + font-size: inherit +} + +.el-picker-panel__link-btn { + vertical-align: middle +} + +.el-picker-panel [slot=sidebar], +.el-picker-panel__sidebar { + background-color: var(--el-bg-color-overlay); + border-right: 1px solid var(--el-datepicker-inner-border-color); + bottom: 0; + box-sizing: border-box; + overflow: auto; + padding-top: 6px; + position: absolute; + top: 0; + width: 110px +} + +.el-picker-panel [slot=sidebar]+.el-picker-panel__body, +.el-picker-panel__sidebar+.el-picker-panel__body { + margin-left: 110px +} + +.el-date-picker { + --el-datepicker-text-color: var(--el-text-color-regular); + --el-datepicker-off-text-color: var(--el-text-color-placeholder); + --el-datepicker-header-text-color: var(--el-text-color-regular); + --el-datepicker-icon-color: var(--el-text-color-primary); + --el-datepicker-border-color: var(--el-disabled-border-color); + --el-datepicker-inner-border-color: var(--el-border-color-light); + --el-datepicker-inrange-bg-color: var(--el-border-color-extra-light); + --el-datepicker-inrange-hover-bg-color: var(--el-border-color-extra-light); + --el-datepicker-active-color: var(--el-color-primary); + --el-datepicker-hover-text-color: var(--el-color-primary); + width: 322px +} + +.el-date-picker.has-sidebar.has-time { + width: 434px +} + +.el-date-picker.has-sidebar { + width: 438px +} + +.el-date-picker.has-time .el-picker-panel__body-wrapper { + position: relative +} + +.el-date-picker .el-picker-panel__content { + width: 292px +} + +.el-date-picker table { + table-layout: fixed; + width: 100% +} + +.el-date-picker__editor-wrap { + display: table-cell; + padding: 0 5px; + position: relative +} + +.el-date-picker__time-header { + border-bottom: 1px solid var(--el-datepicker-inner-border-color); + box-sizing: border-box; + display: table; + font-size: 12px; + padding: 8px 5px 5px; + position: relative; + width: 100% +} + +.el-date-picker__header { + padding: 12px 12px 0; + text-align: center +} + +.el-date-picker__header--bordered { + border-bottom: 1px solid var(--el-border-color-lighter); + margin-bottom: 0; + padding-bottom: 12px +} + +.el-date-picker__header--bordered+.el-picker-panel__content { + margin-top: 0 +} + +.el-date-picker__header-label { + color: var(--el-text-color-regular); + cursor: pointer; + font-size: 16px; + font-weight: 500; + line-height: 22px; + padding: 0 5px; + text-align: center +} + +.el-date-picker__header-label:hover { + color: var(--el-datepicker-hover-text-color) +} + +.el-date-picker__header-label:focus-visible { + color: var(--el-datepicker-hover-text-color); + outline: none +} + +.el-date-picker__header-label.active { + color: var(--el-datepicker-active-color) +} + +.el-date-picker__prev-btn { + float: left +} + +.el-date-picker__next-btn { + float: right +} + +.el-date-picker__time-wrap { + padding: 10px; + text-align: center +} + +.el-date-picker__time-label { + cursor: pointer; + float: left; + line-height: 30px; + margin-left: 10px +} + +.el-date-picker .el-time-panel { + position: absolute +} + +.el-date-range-picker { + --el-datepicker-text-color: var(--el-text-color-regular); + --el-datepicker-off-text-color: var(--el-text-color-placeholder); + --el-datepicker-header-text-color: var(--el-text-color-regular); + --el-datepicker-icon-color: var(--el-text-color-primary); + --el-datepicker-border-color: var(--el-disabled-border-color); + --el-datepicker-inner-border-color: var(--el-border-color-light); + --el-datepicker-inrange-bg-color: var(--el-border-color-extra-light); + --el-datepicker-inrange-hover-bg-color: var(--el-border-color-extra-light); + --el-datepicker-active-color: var(--el-color-primary); + --el-datepicker-hover-text-color: var(--el-color-primary); + width: 646px +} + +.el-date-range-picker.has-sidebar { + width: 756px +} + +.el-date-range-picker.has-time .el-picker-panel__body-wrapper { + position: relative +} + +.el-date-range-picker table { + table-layout: fixed; + width: 100% +} + +.el-date-range-picker .el-picker-panel__body { + min-width: 513px +} + +.el-date-range-picker .el-picker-panel__content { + margin: 0 +} + +.el-date-range-picker__header { + height: 28px; + position: relative; + text-align: center +} + +.el-date-range-picker__header [class*=arrow-left] { + float: left +} + +.el-date-range-picker__header [class*=arrow-right] { + float: right +} + +.el-date-range-picker__header div { + font-size: 16px; + font-weight: 500; + margin-right: 50px +} + +.el-date-range-picker__content { + box-sizing: border-box; + float: left; + margin: 0; + padding: 16px; + width: 50% +} + +.el-date-range-picker__content.is-left { + border-right: 1px solid var(--el-datepicker-inner-border-color) +} + +.el-date-range-picker__content .el-date-range-picker__header div { + margin-left: 50px; + margin-right: 50px +} + +.el-date-range-picker__editors-wrap { + box-sizing: border-box; + display: table-cell +} + +.el-date-range-picker__editors-wrap.is-right { + text-align: right +} + +.el-date-range-picker__time-header { + border-bottom: 1px solid var(--el-datepicker-inner-border-color); + box-sizing: border-box; + display: table; + font-size: 12px; + padding: 8px 5px 5px; + position: relative; + width: 100% +} + +.el-date-range-picker__time-header>.el-icon-arrow-right { + color: var(--el-datepicker-icon-color); + display: table-cell; + font-size: 20px; + vertical-align: middle +} + +.el-date-range-picker__time-picker-wrap { + display: table-cell; + padding: 0 5px; + position: relative +} + +.el-date-range-picker__time-picker-wrap .el-picker-panel { + background: #fff; + position: absolute; + right: 0; + top: 13px; + z-index: 1 +} + +.el-date-range-picker__time-picker-wrap .el-time-panel { + position: absolute +} + +.el-time-range-picker { + overflow: visible; + width: 354px +} + +.el-time-range-picker__content { + padding: 10px; + position: relative; + text-align: center; + z-index: 1 +} + +.el-time-range-picker__cell { + box-sizing: border-box; + display: inline-block; + margin: 0; + padding: 4px 7px 7px; + width: 50% +} + +.el-time-range-picker__header { + font-size: 14px; + margin-bottom: 5px; + text-align: center +} + +.el-time-range-picker__body { + border: 1px solid var(--el-datepicker-border-color); + border-radius: 2px +} + +.el-time-panel { + border-radius: 2px; + box-sizing: content-box; + left: 0; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + width: 180px; + z-index: var(--el-index-top) +} + +.el-time-panel__content { + font-size: 0; + overflow: hidden; + position: relative +} + +.el-time-panel__content:after, +.el-time-panel__content:before { + box-sizing: border-box; + content: ""; + height: 32px; + left: 0; + margin-top: -16px; + padding-top: 6px; + position: absolute; + right: 0; + text-align: left; + top: 50%; + z-index: -1 +} + +.el-time-panel__content:after { + left: 50%; + margin-left: 12%; + margin-right: 12% +} + +.el-time-panel__content:before { + border-bottom: 1px solid var(--el-border-color-light); + border-top: 1px solid var(--el-border-color-light); + margin-left: 12%; + margin-right: 12%; + padding-left: 50% +} + +.el-time-panel__content.has-seconds:after { + left: 66.6666666667% +} + +.el-time-panel__content.has-seconds:before { + padding-left: 33.3333333333% +} + +.el-time-panel__footer { + border-top: 1px solid var(--el-timepicker-inner-border-color, var(--el-border-color-light)); + box-sizing: border-box; + height: 36px; + line-height: 25px; + padding: 4px; + text-align: right +} + +.el-time-panel__btn { + background-color: transparent; + border: none; + color: var(--el-text-color-primary); + cursor: pointer; + font-size: 12px; + line-height: 28px; + margin: 0 5px; + outline: none; + padding: 0 5px +} + +.el-time-panel__btn.confirm { + color: var(--el-timepicker-active-color, var(--el-color-primary)); + font-weight: 800 +} + +.el-descriptions { + --el-descriptions-table-border: 1px solid var(--el-border-color-lighter); + --el-descriptions-item-bordered-label-background: var(--el-fill-color-light); + box-sizing: border-box; + color: var(--el-text-color-primary); + font-size: var(--el-font-size-base) +} + +.el-descriptions__header { + align-items: center; + display: flex; + justify-content: space-between; + margin-bottom: 16px +} + +.el-descriptions__title { + color: var(--el-text-color-primary); + font-size: 16px; + font-weight: 700 +} + +.el-descriptions__body { + background-color: var(--el-fill-color-blank) +} + +.el-descriptions__body .el-descriptions__table { + border-collapse: collapse; + width: 100% +} + +.el-descriptions__body .el-descriptions__table .el-descriptions__cell { + box-sizing: border-box; + font-size: 14px; + font-weight: 400; + line-height: 23px; + text-align: left +} + +.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left { + text-align: left +} + +.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center { + text-align: center +} + +.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right { + text-align: right +} + +.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell { + border: var(--el-descriptions-table-border); + padding: 8px 11px +} + +.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell { + padding-bottom: 12px +} + +.el-descriptions--large { + font-size: 14px +} + +.el-descriptions--large .el-descriptions__header { + margin-bottom: 20px +} + +.el-descriptions--large .el-descriptions__header .el-descriptions__title { + font-size: 16px +} + +.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell { + font-size: 14px +} + +.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell { + padding: 12px 15px +} + +.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell { + padding-bottom: 16px +} + +.el-descriptions--small { + font-size: 12px +} + +.el-descriptions--small .el-descriptions__header { + margin-bottom: 12px +} + +.el-descriptions--small .el-descriptions__header .el-descriptions__title { + font-size: 14px +} + +.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell { + font-size: 12px +} + +.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell { + padding: 4px 7px +} + +.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell { + padding-bottom: 8px +} + +.el-descriptions__label.el-descriptions__cell.is-bordered-label { + background: var(--el-descriptions-item-bordered-label-background); + color: var(--el-text-color-regular); + font-weight: 700 +} + +.el-descriptions__label:not(.is-bordered-label) { + color: var(--el-text-color-primary); + margin-right: 16px +} + +.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label { + padding-bottom: 6px +} + +.el-descriptions__content.el-descriptions__cell.is-bordered-content { + color: var(--el-text-color-primary) +} + +.el-descriptions__content:not(.is-bordered-label) { + color: var(--el-text-color-regular) +} + +.el-descriptions--large .el-descriptions__label:not(.is-bordered-label) { + margin-right: 16px +} + +.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label { + padding-bottom: 8px +} + +.el-descriptions--small .el-descriptions__label:not(.is-bordered-label) { + margin-right: 12px +} + +.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label { + padding-bottom: 4px +} + +:root { + --el-popup-modal-bg-color: var(--el-color-black); + --el-popup-modal-opacity: .5 +} + +.v-modal-enter { + animation: v-modal-in var(--el-transition-duration-fast) ease +} + +.v-modal-leave { + animation: v-modal-out var(--el-transition-duration-fast) ease forwards +} + +@keyframes v-modal-in { + 0% { + opacity: 0 + } +} + +@keyframes v-modal-out { + to { + opacity: 0 + } +} + +.v-modal { + background: var(--el-popup-modal-bg-color); + height: 100%; + left: 0; + opacity: var(--el-popup-modal-opacity); + position: fixed; + top: 0; + width: 100% +} + +.el-popup-parent--hidden { + overflow: hidden +} + +.el-dialog { + --el-dialog-width: 50%; + --el-dialog-margin-top: 15vh; + --el-dialog-bg-color: var(--el-bg-color); + --el-dialog-box-shadow: var(--el-box-shadow); + --el-dialog-title-font-size: var(--el-font-size-large); + --el-dialog-content-font-size: 14px; + --el-dialog-font-line-height: var(--el-font-line-height-primary); + --el-dialog-padding-primary: 16px; + --el-dialog-border-radius: var(--el-border-radius-base); + background: var(--el-dialog-bg-color); + border-radius: var(--el-dialog-border-radius); + box-shadow: var(--el-dialog-box-shadow); + box-sizing: border-box; + margin: var(--el-dialog-margin-top, 15vh) auto 50px; + overflow-wrap: break-word; + padding: var(--el-dialog-padding-primary); + position: relative; + width: var(--el-dialog-width, 50%) +} + +.el-dialog:focus { + outline: none !important +} + +.el-dialog.is-align-center { + margin: auto +} + +.el-dialog.is-fullscreen { + --el-dialog-width: 100%; + --el-dialog-margin-top: 0; + height: 100%; + margin-bottom: 0; + overflow: auto +} + +.el-dialog__wrapper { + bottom: 0; + left: 0; + margin: 0; + overflow: auto; + position: fixed; + right: 0; + top: 0 +} + +.el-dialog.is-draggable .el-dialog__header { + cursor: move; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-dialog__header { + padding-bottom: var(--el-dialog-padding-primary) +} + +.el-dialog__header.show-close { + padding-right: calc(var(--el-dialog-padding-primary) + var(--el-message-close-size, 16px)) +} + +.el-dialog__headerbtn { + background: transparent; + border: none; + cursor: pointer; + font-size: var(--el-message-close-size, 16px); + height: 48px; + outline: none; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 48px +} + +.el-dialog__headerbtn .el-dialog__close { + color: var(--el-color-info); + font-size: inherit +} + +.el-dialog__headerbtn:focus .el-dialog__close, +.el-dialog__headerbtn:hover .el-dialog__close { + color: var(--el-color-primary) +} + +.el-dialog__title { + color: var(--el-text-color-primary); + font-size: var(--el-dialog-title-font-size); + line-height: var(--el-dialog-font-line-height) +} + +.el-dialog__body { + color: var(--el-text-color-regular); + font-size: var(--el-dialog-content-font-size) +} + +.el-dialog__footer { + box-sizing: border-box; + padding-top: var(--el-dialog-padding-primary); + text-align: right +} + +.el-dialog--center { + text-align: center +} + +.el-dialog--center .el-dialog__body { + text-align: initial +} + +.el-dialog--center .el-dialog__footer { + text-align: inherit +} + +.el-overlay-dialog { + bottom: 0; + left: 0; + overflow: auto; + position: fixed; + right: 0; + top: 0 +} + +.dialog-fade-enter-active { + animation: modal-fade-in var(--el-transition-duration) +} + +.dialog-fade-enter-active .el-overlay-dialog { + animation: dialog-fade-in var(--el-transition-duration) +} + +.dialog-fade-leave-active { + animation: modal-fade-out var(--el-transition-duration) +} + +.dialog-fade-leave-active .el-overlay-dialog { + animation: dialog-fade-out var(--el-transition-duration) +} + +@keyframes dialog-fade-in { + 0% { + opacity: 0; + transform: translate3d(0, -20px, 0) + } + + to { + opacity: 1; + transform: translateZ(0) + } +} + +@keyframes dialog-fade-out { + 0% { + opacity: 1; + transform: translateZ(0) + } + + to { + opacity: 0; + transform: translate3d(0, -20px, 0) + } +} + +@keyframes modal-fade-in { + 0% { + opacity: 0 + } + + to { + opacity: 1 + } +} + +@keyframes modal-fade-out { + 0% { + opacity: 1 + } + + to { + opacity: 0 + } +} + +.el-divider { + position: relative +} + +.el-divider--horizontal { + border-top: 1px var(--el-border-color) var(--el-border-style); + display: block; + height: 1px; + margin: 24px 0; + width: 100% +} + +.el-divider--vertical { + border-left: 1px var(--el-border-color) var(--el-border-style); + display: inline-block; + height: 1em; + margin: 0 8px; + position: relative; + vertical-align: middle; + width: 1px +} + +.el-divider__text { + background-color: var(--el-bg-color); + color: var(--el-text-color-primary); + font-size: 14px; + font-weight: 500; + padding: 0 20px; + position: absolute +} + +.el-divider__text.is-left { + left: 20px; + transform: translateY(-50%) +} + +.el-divider__text.is-center { + left: 50%; + transform: translate(-50%) translateY(-50%) +} + +.el-divider__text.is-right { + right: 20px; + transform: translateY(-50%) +} + +.el-drawer { + --el-drawer-bg-color: var(--el-dialog-bg-color, var(--el-bg-color)); + --el-drawer-padding-primary: var(--el-dialog-padding-primary, 20px); + background-color: var(--el-drawer-bg-color); + box-shadow: var(--el-box-shadow-dark); + box-sizing: border-box; + display: flex; + flex-direction: column; + overflow: hidden; + position: absolute; + transition: all var(--el-transition-duration) +} + +.el-drawer .btt, +.el-drawer .ltr, +.el-drawer .rtl, +.el-drawer .ttb { + transform: translate(0) +} + +.el-drawer__sr-focus:focus { + outline: none !important +} + +.el-drawer__header { + align-items: center; + color: #72767b; + display: flex; + margin-bottom: 32px; + padding: var(--el-drawer-padding-primary); + padding-bottom: 0 +} + +.el-drawer__header>:first-child { + flex: 1 +} + +.el-drawer__title { + flex: 1; + font-size: 16px; + line-height: inherit; + margin: 0 +} + +.el-drawer__footer { + padding: var(--el-drawer-padding-primary); + padding-top: 10px; + text-align: right +} + +.el-drawer__close-btn { + background-color: transparent; + border: none; + color: inherit; + cursor: pointer; + display: inline-flex; + font-size: var(--el-font-size-extra-large); + outline: none +} + +.el-drawer__close-btn:focus i, +.el-drawer__close-btn:hover i { + color: var(--el-color-primary) +} + +.el-drawer__body { + flex: 1; + overflow: auto; + padding: var(--el-drawer-padding-primary) +} + +.el-drawer__body>* { + box-sizing: border-box +} + +.el-drawer.ltr, +.el-drawer.rtl { + bottom: 0; + height: 100%; + top: 0 +} + +.el-drawer.btt, +.el-drawer.ttb { + left: 0; + right: 0; + width: 100% +} + +.el-drawer.ltr { + left: 0 +} + +.el-drawer.rtl { + right: 0 +} + +.el-drawer.ttb { + top: 0 +} + +.el-drawer.btt { + bottom: 0 +} + +.el-drawer-fade-enter-active, +.el-drawer-fade-leave-active { + transition: all var(--el-transition-duration) +} + +.el-drawer-fade-enter-active, +.el-drawer-fade-enter-from, +.el-drawer-fade-enter-to, +.el-drawer-fade-leave-active, +.el-drawer-fade-leave-from, +.el-drawer-fade-leave-to { + overflow: hidden !important +} + +.el-drawer-fade-enter-from, +.el-drawer-fade-leave-to { + background-color: transparent !important +} + +.el-drawer-fade-enter-from .rtl, +.el-drawer-fade-leave-to .rtl { + transform: translate(100%) +} + +.el-drawer-fade-enter-from .ltr, +.el-drawer-fade-leave-to .ltr { + transform: translate(-100%) +} + +.el-drawer-fade-enter-from .ttb, +.el-drawer-fade-leave-to .ttb { + transform: translateY(-100%) +} + +.el-drawer-fade-enter-from .btt, +.el-drawer-fade-leave-to .btt { + transform: translateY(100%) +} + +.el-dropdown { + --el-dropdown-menu-box-shadow: var(--el-box-shadow-light); + --el-dropdown-menuItem-hover-fill: var(--el-color-primary-light-9); + --el-dropdown-menuItem-hover-color: var(--el-color-primary); + --el-dropdown-menu-index: 10; + color: var(--el-text-color-regular); + display: inline-flex; + font-size: var(--el-font-size-base); + line-height: 1; + position: relative; + vertical-align: top +} + +.el-dropdown.is-disabled { + color: var(--el-text-color-placeholder); + cursor: not-allowed +} + +.el-dropdown__popper { + --el-dropdown-menu-box-shadow: var(--el-box-shadow-light); + --el-dropdown-menuItem-hover-fill: var(--el-color-primary-light-9); + --el-dropdown-menuItem-hover-color: var(--el-color-primary); + --el-dropdown-menu-index: 10 +} + +.el-dropdown__popper.el-popper { + background: var(--el-bg-color-overlay); + box-shadow: var(--el-dropdown-menu-box-shadow) +} + +.el-dropdown__popper.el-popper, +.el-dropdown__popper.el-popper .el-popper__arrow:before { + border: 1px solid var(--el-border-color-light) +} + +.el-dropdown__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before { + border-left-color: transparent; + border-top-color: transparent +} + +.el-dropdown__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before { + border-bottom-color: transparent; + border-right-color: transparent +} + +.el-dropdown__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before { + border-bottom-color: transparent; + border-left-color: transparent +} + +.el-dropdown__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before { + border-right-color: transparent; + border-top-color: transparent +} + +.el-dropdown__popper .el-dropdown-menu { + border: none +} + +.el-dropdown__popper .el-dropdown__popper-selfdefine { + outline: none +} + +.el-dropdown__popper .el-scrollbar__bar { + z-index: calc(var(--el-dropdown-menu-index) + 1) +} + +.el-dropdown__popper .el-dropdown__list { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 0 +} + +.el-dropdown .el-dropdown__caret-button { + align-items: center; + border-left: none; + display: inline-flex; + justify-content: center; + padding-left: 0; + padding-right: 0; + width: 32px +} + +.el-dropdown .el-dropdown__caret-button>span { + display: inline-flex +} + +.el-dropdown .el-dropdown__caret-button:before { + background: var(--el-overlay-color-lighter); + bottom: -1px; + content: ""; + display: block; + left: 0; + position: absolute; + top: -1px; + width: 1px +} + +.el-dropdown .el-dropdown__caret-button.el-button:before { + background: var(--el-border-color); + opacity: .5 +} + +.el-dropdown .el-dropdown__caret-button .el-dropdown__icon { + font-size: inherit; + padding-left: 0 +} + +.el-dropdown .el-dropdown-selfdefine { + outline: none +} + +.el-dropdown--large .el-dropdown__caret-button { + width: 40px +} + +.el-dropdown--small .el-dropdown__caret-button { + width: 24px +} + +.el-dropdown-menu { + background-color: var(--el-bg-color-overlay); + border: none; + border-radius: var(--el-border-radius-base); + box-shadow: none; + left: 0; + list-style: none; + margin: 0; + padding: 5px 0; + position: relative; + top: 0; + z-index: var(--el-dropdown-menu-index) +} + +.el-dropdown-menu__item { + align-items: center; + color: var(--el-text-color-regular); + cursor: pointer; + display: flex; + font-size: var(--el-font-size-base); + line-height: 22px; + list-style: none; + margin: 0; + outline: none; + padding: 5px 16px; + white-space: nowrap +} + +.el-dropdown-menu__item:not(.is-disabled):focus, +.el-dropdown-menu__item:not(.is-disabled):hover { + background-color: var(--el-dropdown-menuItem-hover-fill); + color: var(--el-dropdown-menuItem-hover-color) +} + +.el-dropdown-menu__item i { + margin-right: 5px +} + +.el-dropdown-menu__item--divided { + border-top: 1px solid var(--el-border-color-lighter); + margin: 6px 0 +} + +.el-dropdown-menu__item.is-disabled { + color: var(--el-text-color-disabled); + cursor: not-allowed +} + +.el-dropdown-menu--large { + padding: 7px 0 +} + +.el-dropdown-menu--large .el-dropdown-menu__item { + font-size: 14px; + line-height: 22px; + padding: 7px 20px +} + +.el-dropdown-menu--large .el-dropdown-menu__item--divided { + margin: 8px 0 +} + +.el-dropdown-menu--small { + padding: 3px 0 +} + +.el-dropdown-menu--small .el-dropdown-menu__item { + font-size: 12px; + line-height: 20px; + padding: 2px 12px +} + +.el-dropdown-menu--small .el-dropdown-menu__item--divided { + margin: 4px 0 +} + +.el-empty { + --el-empty-padding: 40px 0; + --el-empty-image-width: 160px; + --el-empty-description-margin-top: 20px; + --el-empty-bottom-margin-top: 20px; + --el-empty-fill-color-0: var(--el-color-white); + --el-empty-fill-color-1: #fcfcfd; + --el-empty-fill-color-2: #f8f9fb; + --el-empty-fill-color-3: #f7f8fc; + --el-empty-fill-color-4: #eeeff3; + --el-empty-fill-color-5: #edeef2; + --el-empty-fill-color-6: #e9ebef; + --el-empty-fill-color-7: #e5e7e9; + --el-empty-fill-color-8: #e0e3e9; + --el-empty-fill-color-9: #d5d7de; + align-items: center; + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: center; + padding: var(--el-empty-padding); + text-align: center +} + +.el-empty__image { + width: var(--el-empty-image-width) +} + +.el-empty__image img { + height: 100%; + -o-object-fit: contain; + object-fit: contain; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + vertical-align: top; + width: 100% +} + +.el-empty__image svg { + color: var(--el-svg-monochrome-grey); + fill: currentColor; + height: 100%; + vertical-align: top; + width: 100% +} + +.el-empty__description { + margin-top: var(--el-empty-description-margin-top) +} + +.el-empty__description p { + color: var(--el-text-color-secondary); + font-size: var(--el-font-size-base); + margin: 0 +} + +.el-empty__bottom { + margin-top: var(--el-empty-bottom-margin-top) +} + +.el-footer { + --el-footer-padding: 0 20px; + --el-footer-height: 60px; + box-sizing: border-box; + flex-shrink: 0; + height: var(--el-footer-height); + padding: var(--el-footer-padding) +} + +.el-form { + --el-form-label-font-size: var(--el-font-size-base); + --el-form-inline-content-width: 220px +} + +.el-form--inline .el-form-item { + display: inline-flex; + margin-right: 32px; + vertical-align: middle +} + +.el-form--inline.el-form--label-top { + display: flex; + flex-wrap: wrap +} + +.el-form--inline.el-form--label-top .el-form-item { + display: block +} + +.el-form-item { + display: flex; + --font-size: 14px; + margin-bottom: 18px +} + +.el-form-item .el-form-item { + margin-bottom: 0 +} + +.el-form-item .el-input__validateIcon { + display: none +} + +.el-form-item--large { + --font-size: 14px; + --el-form-label-font-size: var(--font-size); + margin-bottom: 22px +} + +.el-form-item--large .el-form-item__label { + height: 40px; + line-height: 40px +} + +.el-form-item--large .el-form-item__content { + line-height: 40px +} + +.el-form-item--large .el-form-item__error { + padding-top: 4px +} + +.el-form-item--default { + --font-size: 14px; + --el-form-label-font-size: var(--font-size); + margin-bottom: 18px +} + +.el-form-item--default .el-form-item__label { + height: 32px; + line-height: 32px +} + +.el-form-item--default .el-form-item__content { + line-height: 32px +} + +.el-form-item--default .el-form-item__error { + padding-top: 2px +} + +.el-form-item--small { + --font-size: 12px; + --el-form-label-font-size: var(--font-size); + margin-bottom: 18px +} + +.el-form-item--small .el-form-item__label { + height: 24px; + line-height: 24px +} + +.el-form-item--small .el-form-item__content { + line-height: 24px +} + +.el-form-item--small .el-form-item__error { + padding-top: 2px +} + +.el-form-item--label-left .el-form-item__label { + justify-content: flex-start +} + +.el-form-item--label-top { + display: block +} + +.el-form-item--label-top .el-form-item__label { + display: inline-block; + height: auto; + line-height: 22px; + margin-bottom: 8px; + text-align: left; + vertical-align: middle +} + +.el-form-item__label-wrap { + display: flex +} + +.el-form-item__label { + align-items: flex-start; + box-sizing: border-box; + color: var(--el-text-color-regular); + display: inline-flex; + flex: 0 0 auto; + font-size: var(--el-form-label-font-size); + height: 32px; + justify-content: flex-end; + line-height: 32px; + padding: 0 12px 0 0 +} + +.el-form-item__content { + align-items: center; + display: flex; + flex: 1; + flex-wrap: wrap; + font-size: var(--font-size); + line-height: 32px; + min-width: 0; + position: relative +} + +.el-form-item__content .el-input-group { + vertical-align: top +} + +.el-form-item__error { + color: var(--el-color-danger); + font-size: 12px; + left: 0; + line-height: 1; + padding-top: 2px; + position: absolute; + top: 100% +} + +.el-form-item__error--inline { + display: inline-block; + left: auto; + margin-left: 10px; + position: relative; + top: auto +} + +.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before, +.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before { + color: var(--el-color-danger); + content: "*"; + margin-right: 4px +} + +.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after, +.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after { + color: var(--el-color-danger); + content: "*"; + margin-left: 4px +} + +.el-form-item.is-error .el-input-tag__wrapper, +.el-form-item.is-error .el-input-tag__wrapper.is-focus, +.el-form-item.is-error .el-input-tag__wrapper:focus, +.el-form-item.is-error .el-input-tag__wrapper:hover, +.el-form-item.is-error .el-input__wrapper, +.el-form-item.is-error .el-input__wrapper.is-focus, +.el-form-item.is-error .el-input__wrapper:focus, +.el-form-item.is-error .el-input__wrapper:hover, +.el-form-item.is-error .el-select__wrapper, +.el-form-item.is-error .el-select__wrapper.is-focus, +.el-form-item.is-error .el-select__wrapper:focus, +.el-form-item.is-error .el-select__wrapper:hover, +.el-form-item.is-error .el-textarea__inner, +.el-form-item.is-error .el-textarea__inner.is-focus, +.el-form-item.is-error .el-textarea__inner:focus, +.el-form-item.is-error .el-textarea__inner:hover { + box-shadow: 0 0 0 1px var(--el-color-danger) inset +} + +.el-form-item.is-error .el-input-group__append .el-input__wrapper, +.el-form-item.is-error .el-input-group__prepend .el-input__wrapper { + box-shadow: inset 0 0 0 1px transparent +} + +.el-form-item.is-error .el-input-group__append .el-input__validateIcon, +.el-form-item.is-error .el-input-group__prepend .el-input__validateIcon { + display: none +} + +.el-form-item.is-error .el-input__validateIcon { + color: var(--el-color-danger) +} + +.el-form-item--feedback .el-input__validateIcon { + display: inline-flex +} + +.el-header { + --el-header-padding: 0 20px; + --el-header-height: 60px; + box-sizing: border-box; + flex-shrink: 0; + height: var(--el-header-height); + padding: var(--el-header-padding) +} + +.el-image-viewer__wrapper { + bottom: 0; + left: 0; + position: fixed; + right: 0; + top: 0 +} + +.el-image-viewer__wrapper:focus { + outline: none !important +} + +.el-image-viewer__btn { + align-items: center; + border-radius: 50%; + box-sizing: border-box; + cursor: pointer; + display: flex; + justify-content: center; + opacity: .8; + position: absolute; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + z-index: 1 +} + +.el-image-viewer__btn .el-icon { + cursor: pointer; + font-size: inherit +} + +.el-image-viewer__close { + font-size: 40px; + height: 40px; + right: 40px; + top: 40px; + width: 40px +} + +.el-image-viewer__canvas { + align-items: center; + display: flex; + height: 100%; + justify-content: center; + position: static; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + width: 100% +} + +.el-image-viewer__actions { + background-color: var(--el-text-color-regular); + border-color: #fff; + border-radius: 22px; + bottom: 30px; + height: 44px; + left: 50%; + padding: 0 23px; + transform: translate(-50%); + width: 282px +} + +.el-image-viewer__actions__inner { + align-items: center; + color: #fff; + cursor: default; + display: flex; + font-size: 23px; + height: 100%; + justify-content: space-around; + width: 100% +} + +.el-image-viewer__prev { + left: 40px +} + +.el-image-viewer__next, +.el-image-viewer__prev { + background-color: var(--el-text-color-regular); + border-color: #fff; + color: #fff; + font-size: 24px; + height: 44px; + top: 50%; + transform: translateY(-50%); + width: 44px +} + +.el-image-viewer__next { + right: 40px; + text-indent: 2px +} + +.el-image-viewer__close { + background-color: var(--el-text-color-regular); + border-color: #fff; + color: #fff; + font-size: 24px; + height: 44px; + width: 44px +} + +.el-image-viewer__mask { + background: #000; + height: 100%; + left: 0; + opacity: .5; + position: absolute; + top: 0; + width: 100% +} + +.viewer-fade-enter-active { + animation: viewer-fade-in var(--el-transition-duration) +} + +.viewer-fade-leave-active { + animation: viewer-fade-out var(--el-transition-duration) +} + +@keyframes viewer-fade-in { + 0% { + opacity: 0; + transform: translate3d(0, -20px, 0) + } + + to { + opacity: 1; + transform: translateZ(0) + } +} + +@keyframes viewer-fade-out { + 0% { + opacity: 1; + transform: translateZ(0) + } + + to { + opacity: 0; + transform: translate3d(0, -20px, 0) + } +} + +.el-image__error, +.el-image__inner, +.el-image__placeholder, +.el-image__wrapper { + height: 100%; + width: 100% +} + +.el-image { + display: inline-block; + overflow: hidden; + position: relative +} + +.el-image__inner { + opacity: 1; + vertical-align: top +} + +.el-image__inner.is-loading { + opacity: 0 +} + +.el-image__wrapper { + left: 0; + position: absolute; + top: 0 +} + +.el-image__error, +.el-image__placeholder { + background: var(--el-fill-color-light) +} + +.el-image__error { + align-items: center; + color: var(--el-text-color-placeholder); + display: flex; + font-size: 14px; + justify-content: center; + vertical-align: middle +} + +.el-image__preview { + cursor: pointer +} + +.el-textarea { + --el-input-text-color: var(--el-text-color-regular); + --el-input-border: var(--el-border); + --el-input-hover-border: var(--el-border-color-hover); + --el-input-focus-border: var(--el-color-primary); + --el-input-transparent-border: 0 0 0 1px transparent inset; + --el-input-border-color: var(--el-border-color); + --el-input-border-radius: var(--el-border-radius-base); + --el-input-bg-color: var(--el-fill-color-blank); + --el-input-icon-color: var(--el-text-color-placeholder); + --el-input-placeholder-color: var(--el-text-color-placeholder); + --el-input-hover-border-color: var(--el-border-color-hover); + --el-input-clear-hover-color: var(--el-text-color-secondary); + --el-input-focus-border-color: var(--el-color-primary); + --el-input-width: 100%; + display: inline-block; + font-size: var(--el-font-size-base); + position: relative; + vertical-align: bottom; + width: 100% +} + +.el-textarea__inner { + -webkit-appearance: none; + background-color: var(--el-input-bg-color, var(--el-fill-color-blank)); + background-image: none; + border: none; + border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); + box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset; + box-sizing: border-box; + color: var(--el-input-text-color, var(--el-text-color-regular)); + display: block; + font-family: inherit; + font-size: inherit; + line-height: 1.5; + padding: 5px 11px; + position: relative; + resize: vertical; + transition: var(--el-transition-box-shadow); + width: 100% +} + +.el-textarea__inner::-moz-placeholder { + color: var(--el-input-placeholder-color, var(--el-text-color-placeholder)) +} + +.el-textarea__inner::placeholder { + color: var(--el-input-placeholder-color, var(--el-text-color-placeholder)) +} + +.el-textarea__inner:hover { + box-shadow: 0 0 0 1px var(--el-input-hover-border-color) inset +} + +.el-textarea__inner:focus { + box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset; + outline: none +} + +.el-textarea .el-input__count { + background: var(--el-fill-color-blank); + bottom: 5px; + color: var(--el-color-info); + font-size: 12px; + line-height: 14px; + position: absolute; + right: 10px +} + +.el-textarea.is-disabled .el-textarea__inner { + background-color: var(--el-disabled-bg-color); + box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset; + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder { + color: var(--el-text-color-placeholder) +} + +.el-textarea.is-disabled .el-textarea__inner::placeholder { + color: var(--el-text-color-placeholder) +} + +.el-textarea.is-exceed .el-textarea__inner { + box-shadow: 0 0 0 1px var(--el-color-danger) inset +} + +.el-textarea.is-exceed .el-input__count { + color: var(--el-color-danger) +} + +.el-input { + --el-input-text-color: var(--el-text-color-regular); + --el-input-border: var(--el-border); + --el-input-hover-border: var(--el-border-color-hover); + --el-input-focus-border: var(--el-color-primary); + --el-input-transparent-border: 0 0 0 1px transparent inset; + --el-input-border-color: var(--el-border-color); + --el-input-border-radius: var(--el-border-radius-base); + --el-input-bg-color: var(--el-fill-color-blank); + --el-input-icon-color: var(--el-text-color-placeholder); + --el-input-placeholder-color: var(--el-text-color-placeholder); + --el-input-hover-border-color: var(--el-border-color-hover); + --el-input-clear-hover-color: var(--el-text-color-secondary); + --el-input-focus-border-color: var(--el-color-primary); + --el-input-width: 100%; + --el-input-height: var(--el-component-size); + box-sizing: border-box; + display: inline-flex; + font-size: var(--el-font-size-base); + line-height: var(--el-input-height); + position: relative; + vertical-align: middle; + width: var(--el-input-width) +} + +.el-input::-webkit-scrollbar { + width: 6px; + z-index: 11 +} + +.el-input::-webkit-scrollbar:horizontal { + height: 6px +} + +.el-input::-webkit-scrollbar-thumb { + background: var(--el-text-color-disabled); + border-radius: 5px; + width: 6px +} + +.el-input::-webkit-scrollbar-corner, +.el-input::-webkit-scrollbar-track { + background: var(--el-fill-color-blank) +} + +.el-input::-webkit-scrollbar-track-piece { + background: var(--el-fill-color-blank); + width: 6px +} + +.el-input .el-input__clear, +.el-input .el-input__password { + color: var(--el-input-icon-color); + cursor: pointer; + font-size: 14px +} + +.el-input .el-input__clear:hover, +.el-input .el-input__password:hover { + color: var(--el-input-clear-hover-color) +} + +.el-input .el-input__count { + align-items: center; + color: var(--el-color-info); + display: inline-flex; + font-size: 12px; + height: 100% +} + +.el-input .el-input__count .el-input__count-inner { + background: var(--el-fill-color-blank); + display: inline-block; + line-height: normal; + padding-left: 8px +} + +.el-input__wrapper { + align-items: center; + background-color: var(--el-input-bg-color, var(--el-fill-color-blank)); + background-image: none; + border-radius: var(--el-input-border-radius, var(--el-border-radius-base)); + box-shadow: 0 0 0 1px var(--el-input-border-color, var(--el-border-color)) inset; + cursor: text; + display: inline-flex; + flex-grow: 1; + justify-content: center; + padding: 1px 11px; + transform: translateZ(0); + transition: var(--el-transition-box-shadow) +} + +.el-input__wrapper:hover { + box-shadow: 0 0 0 1px var(--el-input-hover-border-color) inset +} + +.el-input__wrapper.is-focus { + box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset +} + +.el-input__inner { + --el-input-inner-height: calc(var(--el-input-height, 32px) - 2px); + -webkit-appearance: none; + background: none; + border: none; + box-sizing: border-box; + color: var(--el-input-text-color, var(--el-text-color-regular)); + flex-grow: 1; + font-size: inherit; + height: var(--el-input-inner-height); + line-height: var(--el-input-inner-height); + outline: none; + padding: 0; + width: 100% +} + +.el-input__inner:focus { + outline: none +} + +.el-input__inner::-moz-placeholder { + color: var(--el-input-placeholder-color, var(--el-text-color-placeholder)) +} + +.el-input__inner::placeholder { + color: var(--el-input-placeholder-color, var(--el-text-color-placeholder)) +} + +.el-input__inner[type=password]::-ms-reveal { + display: none +} + +.el-input__inner[type=number] { + line-height: 1 +} + +.el-input__prefix { + color: var(--el-input-icon-color, var(--el-text-color-placeholder)); + display: inline-flex; + flex-shrink: 0; + flex-wrap: nowrap; + height: 100%; + pointer-events: none; + text-align: center; + transition: all var(--el-transition-duration); + white-space: nowrap +} + +.el-input__prefix-inner { + align-items: center; + display: inline-flex; + justify-content: center; + pointer-events: all +} + +.el-input__prefix-inner>:last-child { + margin-right: 8px +} + +.el-input__prefix-inner>:first-child, +.el-input__prefix-inner>:first-child.el-input__icon { + margin-left: 0 +} + +.el-input__suffix { + color: var(--el-input-icon-color, var(--el-text-color-placeholder)); + display: inline-flex; + flex-shrink: 0; + flex-wrap: nowrap; + height: 100%; + pointer-events: none; + text-align: center; + transition: all var(--el-transition-duration); + white-space: nowrap +} + +.el-input__suffix-inner { + align-items: center; + display: inline-flex; + justify-content: center; + pointer-events: all +} + +.el-input__suffix-inner>:first-child { + margin-left: 8px +} + +.el-input .el-input__icon { + align-items: center; + display: flex; + height: inherit; + justify-content: center; + line-height: inherit; + margin-left: 8px; + transition: all var(--el-transition-duration) +} + +.el-input__validateIcon { + pointer-events: none +} + +.el-input.is-active .el-input__wrapper { + box-shadow: 0 0 0 1px var(--el-input-focus-color, ) inset +} + +.el-input.is-disabled { + cursor: not-allowed +} + +.el-input.is-disabled .el-input__wrapper { + background-color: var(--el-disabled-bg-color); + box-shadow: 0 0 0 1px var(--el-disabled-border-color) inset +} + +.el-input.is-disabled .el-input__inner { + color: var(--el-disabled-text-color); + -webkit-text-fill-color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-input.is-disabled .el-input__inner::-moz-placeholder { + color: var(--el-text-color-placeholder) +} + +.el-input.is-disabled .el-input__inner::placeholder { + color: var(--el-text-color-placeholder) +} + +.el-input.is-disabled .el-input__icon { + cursor: not-allowed +} + +.el-input.is-exceed .el-input__wrapper { + box-shadow: 0 0 0 1px var(--el-color-danger) inset +} + +.el-input.is-exceed .el-input__suffix .el-input__count { + color: var(--el-color-danger) +} + +.el-input--large { + --el-input-height: var(--el-component-size-large); + font-size: 14px +} + +.el-input--large .el-input__wrapper { + padding: 1px 15px +} + +.el-input--large .el-input__inner { + --el-input-inner-height: calc(var(--el-input-height, 40px) - 2px) +} + +.el-input--small { + --el-input-height: var(--el-component-size-small); + font-size: 12px +} + +.el-input--small .el-input__wrapper { + padding: 1px 7px +} + +.el-input--small .el-input__inner { + --el-input-inner-height: calc(var(--el-input-height, 24px) - 2px) +} + +.el-input-group { + align-items: stretch; + display: inline-flex; + width: 100% +} + +.el-input-group__append, +.el-input-group__prepend { + align-items: center; + background-color: var(--el-fill-color-light); + border-radius: var(--el-input-border-radius); + color: var(--el-color-info); + display: inline-flex; + justify-content: center; + min-height: 100%; + padding: 0 20px; + position: relative; + white-space: nowrap +} + +.el-input-group__append:focus, +.el-input-group__prepend:focus { + outline: none +} + +.el-input-group__append .el-button, +.el-input-group__append .el-select, +.el-input-group__prepend .el-button, +.el-input-group__prepend .el-select { + display: inline-block; + margin: 0 -20px +} + +.el-input-group__append button.el-button, +.el-input-group__append button.el-button:hover, +.el-input-group__append div.el-select .el-select__wrapper, +.el-input-group__append div.el-select:hover .el-select__wrapper, +.el-input-group__prepend button.el-button, +.el-input-group__prepend button.el-button:hover, +.el-input-group__prepend div.el-select .el-select__wrapper, +.el-input-group__prepend div.el-select:hover .el-select__wrapper { + background-color: transparent; + border-color: transparent; + color: inherit +} + +.el-input-group__append .el-button, +.el-input-group__append .el-input, +.el-input-group__prepend .el-button, +.el-input-group__prepend .el-input { + font-size: inherit +} + +.el-input-group__prepend { + border-bottom-right-radius: 0; + border-right: 0; + border-top-right-radius: 0; + box-shadow: 1px 0 0 0 var(--el-input-border-color) inset, 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset +} + +.el-input-group__append { + border-left: 0; + box-shadow: 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset, -1px 0 0 0 var(--el-input-border-color) inset +} + +.el-input-group--prepend>.el-input__wrapper, +.el-input-group__append { + border-bottom-left-radius: 0; + border-top-left-radius: 0 +} + +.el-input-group--prepend .el-input-group__prepend .el-select .el-select__wrapper { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + box-shadow: 1px 0 0 0 var(--el-input-border-color) inset, 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset +} + +.el-input-group--append>.el-input__wrapper { + border-bottom-right-radius: 0; + border-top-right-radius: 0 +} + +.el-input-group--append .el-input-group__append .el-select .el-select__wrapper { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + box-shadow: 0 1px 0 0 var(--el-input-border-color) inset, 0 -1px 0 0 var(--el-input-border-color) inset, -1px 0 0 0 var(--el-input-border-color) inset +} + +.el-input-hidden { + display: none !important +} + +.el-input-number { + display: inline-flex; + line-height: 30px; + position: relative; + vertical-align: middle; + width: 150px +} + +.el-input-number .el-input__wrapper { + padding-left: 42px; + padding-right: 42px +} + +.el-input-number .el-input__inner { + -webkit-appearance: none; + -moz-appearance: textfield; + line-height: 1; + text-align: center +} + +.el-input-number .el-input__inner::-webkit-inner-spin-button, +.el-input-number .el-input__inner::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0 +} + +.el-input-number__decrease, +.el-input-number__increase { + align-items: center; + background: var(--el-fill-color-light); + bottom: 1px; + color: var(--el-text-color-regular); + cursor: pointer; + display: flex; + font-size: 13px; + height: auto; + justify-content: center; + position: absolute; + top: 1px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + width: 32px; + z-index: 1 +} + +.el-input-number__decrease:hover, +.el-input-number__increase:hover { + color: var(--el-color-primary) +} + +.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input__wrapper, +.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input__wrapper { + box-shadow: 0 0 0 1px var(--el-input-focus-border-color, var(--el-color-primary)) inset +} + +.el-input-number__decrease.is-disabled, +.el-input-number__increase.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-input-number__increase { + border-left: var(--el-border); + border-radius: 0 var(--el-border-radius-base) var(--el-border-radius-base) 0; + right: 1px +} + +.el-input-number__decrease { + border-radius: var(--el-border-radius-base) 0 0 var(--el-border-radius-base); + border-right: var(--el-border); + left: 1px +} + +.el-input-number.is-disabled .el-input-number__decrease, +.el-input-number.is-disabled .el-input-number__increase { + border-color: var(--el-disabled-border-color); + color: var(--el-disabled-border-color) +} + +.el-input-number.is-disabled .el-input-number__decrease:hover, +.el-input-number.is-disabled .el-input-number__increase:hover { + color: var(--el-disabled-border-color); + cursor: not-allowed +} + +.el-input-number--large { + line-height: 38px; + width: 180px +} + +.el-input-number--large .el-input-number__decrease, +.el-input-number--large .el-input-number__increase { + font-size: 14px; + width: 40px +} + +.el-input-number--large .el-input--large .el-input__wrapper { + padding-left: 47px; + padding-right: 47px +} + +.el-input-number--small { + line-height: 22px; + width: 120px +} + +.el-input-number--small .el-input-number__decrease, +.el-input-number--small .el-input-number__increase { + font-size: 12px; + width: 24px +} + +.el-input-number--small .el-input--small .el-input__wrapper { + padding-left: 31px; + padding-right: 31px +} + +.el-input-number--small .el-input-number__decrease [class*=el-icon], +.el-input-number--small .el-input-number__increase [class*=el-icon] { + transform: scale(.9) +} + +.el-input-number.is-without-controls .el-input__wrapper { + padding-left: 15px; + padding-right: 15px +} + +.el-input-number.is-controls-right .el-input__wrapper { + padding-left: 15px; + padding-right: 42px +} + +.el-input-number.is-controls-right .el-input-number__decrease, +.el-input-number.is-controls-right .el-input-number__increase { + --el-input-number-controls-height: 15px; + height: var(--el-input-number-controls-height); + line-height: var(--el-input-number-controls-height) +} + +.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon], +.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon] { + transform: scale(.8) +} + +.el-input-number.is-controls-right .el-input-number__increase { + border-bottom: var(--el-border); + border-radius: 0 var(--el-border-radius-base) 0 0; + bottom: auto; + left: auto +} + +.el-input-number.is-controls-right .el-input-number__decrease { + border-left: var(--el-border); + border-radius: 0 0 var(--el-border-radius-base) 0; + border-right: none; + left: auto; + right: 1px; + top: auto +} + +.el-input-number.is-controls-right[class*=large] [class*=decrease], +.el-input-number.is-controls-right[class*=large] [class*=increase] { + --el-input-number-controls-height: 19px +} + +.el-input-number.is-controls-right[class*=small] [class*=decrease], +.el-input-number.is-controls-right[class*=small] [class*=increase] { + --el-input-number-controls-height: 11px +} + +.el-input-tag { + --el-input-tag-border-color-hover: var(--el-border-color-hover); + --el-input-tag-disabled-color: var(--el-disabled-text-color); + --el-input-tag-disabled-border: var(--el-disabled-border-color); + --el-input-tag-font-size: var(--el-font-size-base); + --el-input-tag-close-hover-color: var(--el-text-color-secondary); + --el-input-tag-text-color: var(--el-text-color-regular); + --el-input-tag-input-focus-border-color: var(--el-color-primary); + --el-input-tag-width: 100%; + --el-input-tag-mini-height: var(--el-component-size); + --el-input-tag-gap: 6px; + --el-input-tag-padding: 4px; + --el-input-tag-inner-padding: 8px; + --el-input-tag-line-height: 24px; + align-items: center; + background-color: var(--el-fill-color-blank); + border-radius: var(--el-border-radius-base); + box-shadow: 0 0 0 1px var(--el-border-color) inset; + box-sizing: border-box; + cursor: pointer; + display: flex; + font-size: var(--el-input-tag-font-size); + line-height: var(--el-input-tag-line-height); + min-height: var(--el-input-tag-mini-height); + padding: var(--el-input-tag-padding); + transform: translateZ(0); + transition: var(--el-transition-duration); + width: var(--el-input-tag-width) +} + +.el-input-tag.is-focused { + box-shadow: 0 0 0 1px var(--el-color-primary) inset +} + +.el-input-tag.is-hovering:not(.is-focused) { + box-shadow: 0 0 0 1px var(--el-border-color-hover) inset +} + +.el-input-tag.is-disabled { + background-color: var(--el-fill-color-light); + cursor: not-allowed +} + +.el-input-tag.is-disabled, +.el-input-tag.is-disabled:hover { + box-shadow: 0 0 0 1px var(--el-input-tag-disabled-border) inset +} + +.el-input-tag.is-disabled.is-focus { + box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset +} + +.el-input-tag.is-disabled .el-input-tag__inner .el-input-tag__input, +.el-input-tag.is-disabled .el-input-tag__inner .el-tag { + cursor: not-allowed +} + +.el-input-tag__prefix, +.el-input-tag__suffix { + align-items: center; + color: var(--el-input-icon-color, var(--el-text-color-placeholder)); + display: flex; + flex-shrink: 0; + padding: 0 var(--el-input-tag-inner-padding) +} + +.el-input-tag__suffix { + gap: 8px +} + +.el-input-tag__inner { + align-items: center; + display: flex; + flex: 1; + flex-wrap: wrap; + gap: var(--el-input-tag-gap); + max-width: 100%; + min-width: 0; + position: relative +} + +.el-input-tag__inner.is-left-space { + margin-left: var(--el-input-tag-inner-padding) +} + +.el-input-tag__inner.is-right-space { + margin-right: var(--el-input-tag-inner-padding) +} + +.el-input-tag__inner.is-draggable .el-tag { + cursor: move; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-input-tag__drop-indicator { + background-color: var(--el-color-primary); + height: var(--el-input-tag-line-height); + position: absolute; + top: 0; + width: 1px +} + +.el-input-tag__inner .el-tag { + border-color: transparent; + cursor: pointer; + max-width: 100% +} + +.el-input-tag__inner .el-tag.el-tag--plain { + border-color: var(--el-tag-border-color) +} + +.el-input-tag__inner .el-tag .el-tag__content { + line-height: normal; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-input-tag__input-wrapper { + flex: 1 +} + +.el-input-tag__input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; + border: none; + color: var(--el-input-tag-text-color); + font-family: inherit; + font-size: inherit; + line-height: inherit; + outline: none; + padding: 0; + width: 100% +} + +.el-input-tag__input-calculator { + left: 0; + max-width: 100%; + overflow: hidden; + position: absolute; + top: 0; + visibility: hidden; + white-space: pre +} + +.el-input-tag--large { + --el-input-tag-gap: 6px; + --el-input-tag-padding: 8px; + --el-input-tag-padding-left: 8px; + --el-input-tag-font-size: 14px +} + +.el-input-tag--small { + --el-input-tag-gap: 4px; + --el-input-tag-padding: 2px; + --el-input-tag-padding-left: 6px; + --el-input-tag-font-size: 12px; + --el-input-tag-line-height: 20px; + --el-input-tag-mini-height: var(--el-component-size-small) +} + +.el-link { + --el-link-font-size: var(--el-font-size-base); + --el-link-font-weight: var(--el-font-weight-primary); + --el-link-text-color: var(--el-text-color-regular); + --el-link-hover-text-color: var(--el-color-primary); + --el-link-disabled-text-color: var(--el-text-color-placeholder); + align-items: center; + color: var(--el-link-text-color); + cursor: pointer; + display: inline-flex; + flex-direction: row; + font-size: var(--el-link-font-size); + font-weight: var(--el-link-font-weight); + justify-content: center; + outline: none; + padding: 0; + position: relative; + text-decoration: none; + vertical-align: middle +} + +.el-link:hover { + color: var(--el-link-hover-text-color) +} + +.el-link.is-underline:hover:after { + border-bottom: 1px solid var(--el-link-hover-text-color); + bottom: 0; + content: ""; + height: 0; + left: 0; + position: absolute; + right: 0 +} + +.el-link.is-disabled { + color: var(--el-link-disabled-text-color); + cursor: not-allowed +} + +.el-link [class*=el-icon-]+span { + margin-left: 5px +} + +.el-link.el-link--default:after { + border-color: var(--el-link-hover-text-color) +} + +.el-link__inner { + align-items: center; + display: inline-flex; + justify-content: center +} + +.el-link.el-link--primary { + --el-link-text-color: var(--el-color-primary); + --el-link-hover-text-color: var(--el-color-primary-light-3); + --el-link-disabled-text-color: var(--el-color-primary-light-5) +} + +.el-link.el-link--primary.is-underline:hover:after, +.el-link.el-link--primary:after { + border-color: var(--el-link-text-color) +} + +.el-link.el-link--success { + --el-link-text-color: var(--el-color-success); + --el-link-hover-text-color: var(--el-color-success-light-3); + --el-link-disabled-text-color: var(--el-color-success-light-5) +} + +.el-link.el-link--success.is-underline:hover:after, +.el-link.el-link--success:after { + border-color: var(--el-link-text-color) +} + +.el-link.el-link--warning { + --el-link-text-color: var(--el-color-warning); + --el-link-hover-text-color: var(--el-color-warning-light-3); + --el-link-disabled-text-color: var(--el-color-warning-light-5) +} + +.el-link.el-link--warning.is-underline:hover:after, +.el-link.el-link--warning:after { + border-color: var(--el-link-text-color) +} + +.el-link.el-link--danger { + --el-link-text-color: var(--el-color-danger); + --el-link-hover-text-color: var(--el-color-danger-light-3); + --el-link-disabled-text-color: var(--el-color-danger-light-5) +} + +.el-link.el-link--danger.is-underline:hover:after, +.el-link.el-link--danger:after { + border-color: var(--el-link-text-color) +} + +.el-link.el-link--error { + --el-link-text-color: var(--el-color-error); + --el-link-hover-text-color: var(--el-color-error-light-3); + --el-link-disabled-text-color: var(--el-color-error-light-5) +} + +.el-link.el-link--error.is-underline:hover:after, +.el-link.el-link--error:after { + border-color: var(--el-link-text-color) +} + +.el-link.el-link--info { + --el-link-text-color: var(--el-color-info); + --el-link-hover-text-color: var(--el-color-info-light-3); + --el-link-disabled-text-color: var(--el-color-info-light-5) +} + +.el-link.el-link--info.is-underline:hover:after, +.el-link.el-link--info:after { + border-color: var(--el-link-text-color) +} + +:root { + --el-loading-spinner-size: 42px; + --el-loading-fullscreen-spinner-size: 50px +} + +.el-loading-parent--relative { + position: relative !important +} + +.el-loading-parent--hidden { + overflow: hidden !important +} + +.el-loading-mask { + background-color: var(--el-mask-color); + bottom: 0; + left: 0; + margin: 0; + position: absolute; + right: 0; + top: 0; + transition: opacity var(--el-transition-duration); + z-index: 2000 +} + +.el-loading-mask.is-fullscreen { + position: fixed +} + +.el-loading-mask.is-fullscreen .el-loading-spinner { + margin-top: calc((0px - var(--el-loading-fullscreen-spinner-size))/2) +} + +.el-loading-mask.is-fullscreen .el-loading-spinner .circular { + height: var(--el-loading-fullscreen-spinner-size); + width: var(--el-loading-fullscreen-spinner-size) +} + +.el-loading-spinner { + margin-top: calc((0px - var(--el-loading-spinner-size))/2); + position: absolute; + text-align: center; + top: 50%; + width: 100% +} + +.el-loading-spinner .el-loading-text { + color: var(--el-color-primary); + font-size: 14px; + margin: 3px 0 +} + +.el-loading-spinner .circular { + animation: loading-rotate 2s linear infinite; + display: inline; + height: var(--el-loading-spinner-size); + width: var(--el-loading-spinner-size) +} + +.el-loading-spinner .path { + animation: loading-dash 1.5s ease-in-out infinite; + stroke-dasharray: 90, 150; + stroke-dashoffset: 0; + stroke-width: 2; + stroke: var(--el-color-primary); + stroke-linecap: round +} + +.el-loading-spinner i { + color: var(--el-color-primary) +} + +.el-loading-fade-enter-from, +.el-loading-fade-leave-to { + opacity: 0 +} + +@keyframes loading-rotate { + to { + transform: rotate(1turn) + } +} + +@keyframes loading-dash { + 0% { + stroke-dasharray: 1, 200; + stroke-dashoffset: 0 + } + + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -40px + } + + to { + stroke-dasharray: 90, 150; + stroke-dashoffset: -120px + } +} + +.el-main { + --el-main-padding: 20px; + box-sizing: border-box; + display: block; + flex: 1; + flex-basis: auto; + overflow: auto; + padding: var(--el-main-padding) +} + +:root { + --el-menu-active-color: var(--el-color-primary); + --el-menu-text-color: var(--el-text-color-primary); + --el-menu-hover-text-color: var(--el-color-primary); + --el-menu-bg-color: var(--el-fill-color-blank); + --el-menu-hover-bg-color: var(--el-color-primary-light-9); + --el-menu-item-height: 56px; + --el-menu-sub-item-height: calc(var(--el-menu-item-height) - 6px); + --el-menu-horizontal-height: 60px; + --el-menu-horizontal-sub-item-height: 36px; + --el-menu-item-font-size: var(--el-font-size-base); + --el-menu-item-hover-fill: var(--el-color-primary-light-9); + --el-menu-border-color: var(--el-border-color); + --el-menu-base-level-padding: 20px; + --el-menu-level-padding: 20px; + --el-menu-icon-width: 24px +} + +.el-menu { + background-color: var(--el-menu-bg-color); + border-right: 1px solid var(--el-menu-border-color); + box-sizing: border-box; + list-style: none; + margin: 0; + padding-left: 0; + position: relative +} + +.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item, +.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item-group__title, +.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title { + padding-left: calc(var(--el-menu-base-level-padding) + var(--el-menu-level)*var(--el-menu-level-padding)); + white-space: nowrap +} + +.el-menu:not(.el-menu--collapse) .el-sub-menu__title { + padding-right: calc(var(--el-menu-base-level-padding) + var(--el-menu-icon-width)) +} + +.el-menu--horizontal { + border-right: none; + display: flex; + flex-wrap: nowrap; + height: var(--el-menu-horizontal-height) +} + +.el-menu--horizontal.el-menu--popup-container { + height: unset +} + +.el-menu--horizontal.el-menu { + border-bottom: 1px solid var(--el-menu-border-color) +} + +.el-menu--horizontal>.el-menu-item { + align-items: center; + border-bottom: 2px solid transparent; + color: var(--el-menu-text-color); + display: inline-flex; + height: 100%; + justify-content: center; + margin: 0 +} + +.el-menu--horizontal>.el-menu-item a, +.el-menu--horizontal>.el-menu-item a:hover { + color: inherit +} + +.el-menu--horizontal>.el-sub-menu:focus, +.el-menu--horizontal>.el-sub-menu:hover { + outline: none +} + +.el-menu--horizontal>.el-sub-menu:hover .el-sub-menu__title { + color: var(--el-menu-hover-text-color) +} + +.el-menu--horizontal>.el-sub-menu.is-active .el-sub-menu__title { + border-bottom: 2px solid var(--el-menu-active-color); + color: var(--el-menu-active-color) +} + +.el-menu--horizontal>.el-sub-menu .el-sub-menu__title { + border-bottom: 2px solid transparent; + color: var(--el-menu-text-color); + height: 100% +} + +.el-menu--horizontal>.el-sub-menu .el-sub-menu__title:hover { + background-color: var(--el-menu-bg-color) +} + +.el-menu--horizontal .el-menu .el-menu-item, +.el-menu--horizontal .el-menu .el-sub-menu__title { + align-items: center; + background-color: var(--el-menu-bg-color); + color: var(--el-menu-text-color); + display: flex; + height: var(--el-menu-horizontal-sub-item-height); + line-height: var(--el-menu-horizontal-sub-item-height); + padding: 0 10px +} + +.el-menu--horizontal .el-menu .el-sub-menu__title { + padding-right: 40px +} + +.el-menu--horizontal .el-menu .el-menu-item.is-active, +.el-menu--horizontal .el-menu .el-sub-menu.is-active>.el-sub-menu__title { + color: var(--el-menu-active-color) +} + +.el-menu--horizontal .el-menu-item:not(.is-disabled):focus, +.el-menu--horizontal .el-menu-item:not(.is-disabled):hover { + background-color: var(--el-menu-hover-bg-color); + color: var(--el-menu-hover-text-color); + outline: none +} + +.el-menu--horizontal>.el-menu-item.is-active { + border-bottom: 2px solid var(--el-menu-active-color); + color: var(--el-menu-active-color) !important +} + +.el-menu--collapse { + width: calc(var(--el-menu-icon-width) + var(--el-menu-base-level-padding)*2) +} + +.el-menu--collapse>.el-menu-item [class^=el-icon], +.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title [class^=el-icon], +.el-menu--collapse>.el-sub-menu>.el-sub-menu__title [class^=el-icon] { + margin: 0; + text-align: center; + vertical-align: middle; + width: var(--el-menu-icon-width) +} + +.el-menu--collapse>.el-menu-item .el-sub-menu__icon-arrow, +.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title .el-sub-menu__icon-arrow, +.el-menu--collapse>.el-sub-menu>.el-sub-menu__title .el-sub-menu__icon-arrow { + display: none +} + +.el-menu--collapse>.el-menu-item-group>ul>.el-sub-menu>.el-sub-menu__title>span, +.el-menu--collapse>.el-menu-item>span, +.el-menu--collapse>.el-sub-menu>.el-sub-menu__title>span { + display: inline-block; + height: 0; + overflow: hidden; + visibility: hidden; + width: 0 +} + +.el-menu--collapse>.el-menu-item.is-active i { + color: inherit +} + +.el-menu--collapse .el-menu .el-sub-menu { + min-width: 200px +} + +.el-menu--collapse .el-sub-menu.is-active .el-sub-menu__title { + color: var(--el-menu-active-color) +} + +.el-menu--popup { + border: none; + border-radius: var(--el-border-radius-small); + box-shadow: var(--el-box-shadow-light); + min-width: 200px; + padding: 5px 0; + z-index: 100 +} + +.el-menu .el-icon { + flex-shrink: 0 +} + +.el-menu-item { + align-items: center; + box-sizing: border-box; + color: var(--el-menu-text-color); + cursor: pointer; + display: flex; + font-size: var(--el-menu-item-font-size); + height: var(--el-menu-item-height); + line-height: var(--el-menu-item-height); + list-style: none; + padding: 0 var(--el-menu-base-level-padding); + position: relative; + transition: border-color var(--el-transition-duration), background-color var(--el-transition-duration), color var(--el-transition-duration); + white-space: nowrap +} + +.el-menu-item * { + vertical-align: bottom +} + +.el-menu-item i { + color: inherit +} + +.el-menu-item:focus, +.el-menu-item:hover { + outline: none +} + +.el-menu-item:hover { + background-color: var(--el-menu-hover-bg-color) +} + +.el-menu-item.is-disabled { + background: none !important; + cursor: not-allowed; + opacity: .25 +} + +.el-menu-item [class^=el-icon] { + font-size: 18px; + margin-right: 5px; + text-align: center; + vertical-align: middle; + width: var(--el-menu-icon-width) +} + +.el-menu-item.is-active { + color: var(--el-menu-active-color) +} + +.el-menu-item.is-active i { + color: inherit +} + +.el-menu-item .el-menu-tooltip__trigger { + align-items: center; + box-sizing: border-box; + display: inline-flex; + height: 100%; + left: 0; + padding: 0 var(--el-menu-base-level-padding); + position: absolute; + top: 0; + width: 100% +} + +.el-sub-menu { + list-style: none; + margin: 0; + padding-left: 0 +} + +.el-sub-menu__title { + align-items: center; + box-sizing: border-box; + color: var(--el-menu-text-color); + cursor: pointer; + display: flex; + font-size: var(--el-menu-item-font-size); + height: var(--el-menu-item-height); + line-height: var(--el-menu-item-height); + list-style: none; + padding: 0 var(--el-menu-base-level-padding); + position: relative; + transition: border-color var(--el-transition-duration), background-color var(--el-transition-duration), color var(--el-transition-duration); + white-space: nowrap +} + +.el-sub-menu__title * { + vertical-align: bottom +} + +.el-sub-menu__title i { + color: inherit +} + +.el-sub-menu__title:focus, +.el-sub-menu__title:hover { + outline: none +} + +.el-sub-menu__title.is-disabled { + background: none !important; + cursor: not-allowed; + opacity: .25 +} + +.el-sub-menu__title:hover { + background-color: var(--el-menu-hover-bg-color) +} + +.el-sub-menu .el-menu { + border: none +} + +.el-sub-menu .el-menu-item { + height: var(--el-menu-sub-item-height); + line-height: var(--el-menu-sub-item-height) +} + +.el-sub-menu__hide-arrow .el-sub-menu__icon-arrow { + display: none !important +} + +.el-sub-menu.is-active .el-sub-menu__title { + border-bottom-color: var(--el-menu-active-color) +} + +.el-sub-menu.is-disabled .el-menu-item, +.el-sub-menu.is-disabled .el-sub-menu__title { + background: none !important; + cursor: not-allowed; + opacity: .25 +} + +.el-sub-menu .el-icon { + font-size: 18px; + margin-right: 5px; + text-align: center; + vertical-align: middle; + width: var(--el-menu-icon-width) +} + +.el-sub-menu .el-icon.el-sub-menu__icon-more { + margin-right: 0 !important +} + +.el-sub-menu .el-sub-menu__icon-arrow { + font-size: 12px; + margin-right: 0; + margin-top: -6px; + position: absolute; + right: var(--el-menu-base-level-padding); + top: 50%; + transition: transform var(--el-transition-duration); + width: inherit +} + +.el-menu-item-group>ul { + padding: 0 +} + +.el-menu-item-group__title { + color: var(--el-text-color-secondary); + font-size: 12px; + line-height: normal; + padding: 7px 0 7px var(--el-menu-base-level-padding) +} + +.horizontal-collapse-transition .el-sub-menu__title .el-sub-menu__icon-arrow { + opacity: 0; + transition: var(--el-transition-duration-fast) +} + +.el-message-box { + --el-messagebox-title-color: var(--el-text-color-primary); + --el-messagebox-width: 420px; + --el-messagebox-border-radius: 4px; + --el-messagebox-box-shadow: var(--el-box-shadow); + --el-messagebox-font-size: var(--el-font-size-large); + --el-messagebox-content-font-size: var(--el-font-size-base); + --el-messagebox-content-color: var(--el-text-color-regular); + --el-messagebox-error-font-size: 12px; + --el-messagebox-padding-primary: 12px; + --el-messagebox-font-line-height: var(--el-font-line-height-primary); + backface-visibility: hidden; + background-color: var(--el-bg-color); + border-radius: var(--el-messagebox-border-radius); + box-shadow: var(--el-messagebox-box-shadow); + box-sizing: border-box; + display: inline-block; + font-size: var(--el-messagebox-font-size); + max-width: var(--el-messagebox-width); + overflow: hidden; + overflow-wrap: break-word; + padding: var(--el-messagebox-padding-primary); + position: relative; + text-align: left; + vertical-align: middle; + width: 100% +} + +.el-message-box:focus { + outline: none !important +} + +.el-overlay.is-message-box .el-overlay-message-box { + bottom: 0; + left: 0; + overflow: auto; + padding: 16px; + position: fixed; + right: 0; + text-align: center; + top: 0 +} + +.el-overlay.is-message-box .el-overlay-message-box:after { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle; + width: 0 +} + +.el-message-box.is-draggable .el-message-box__header { + cursor: move; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-message-box__header { + padding-bottom: var(--el-messagebox-padding-primary) +} + +.el-message-box__header.show-close { + padding-right: calc(var(--el-messagebox-padding-primary) + var(--el-message-close-size, 16px)) +} + +.el-message-box__title { + color: var(--el-messagebox-title-color); + font-size: var(--el-messagebox-font-size); + line-height: var(--el-messagebox-font-line-height) +} + +.el-message-box__headerbtn { + background: transparent; + border: none; + cursor: pointer; + font-size: var(--el-message-close-size, 16px); + height: 40px; + outline: none; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 40px +} + +.el-message-box__headerbtn .el-message-box__close { + color: var(--el-color-info); + font-size: inherit +} + +.el-message-box__headerbtn:focus .el-message-box__close, +.el-message-box__headerbtn:hover .el-message-box__close { + color: var(--el-color-primary) +} + +.el-message-box__content { + color: var(--el-messagebox-content-color); + font-size: var(--el-messagebox-content-font-size) +} + +.el-message-box__container { + align-items: center; + display: flex; + gap: 12px +} + +.el-message-box__input { + padding-top: 12px +} + +.el-message-box__input div.invalid>input, +.el-message-box__input div.invalid>input:focus { + border-color: var(--el-color-error) +} + +.el-message-box__status { + font-size: 24px +} + +.el-message-box__status.el-message-box-icon--success { + --el-messagebox-color: var(--el-color-success); + color: var(--el-messagebox-color) +} + +.el-message-box__status.el-message-box-icon--info { + --el-messagebox-color: var(--el-color-info); + color: var(--el-messagebox-color) +} + +.el-message-box__status.el-message-box-icon--warning { + --el-messagebox-color: var(--el-color-warning); + color: var(--el-messagebox-color) +} + +.el-message-box__status.el-message-box-icon--error { + --el-messagebox-color: var(--el-color-error); + color: var(--el-messagebox-color) +} + +.el-message-box__message { + margin: 0 +} + +.el-message-box__message p { + line-height: var(--el-messagebox-font-line-height); + margin: 0 +} + +.el-message-box__errormsg { + color: var(--el-color-error); + font-size: var(--el-messagebox-error-font-size); + line-height: var(--el-messagebox-font-line-height) +} + +.el-message-box__btns { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-end; + padding-top: var(--el-messagebox-padding-primary) +} + +.el-message-box--center .el-message-box__title { + align-items: center; + display: flex; + gap: 6px; + justify-content: center +} + +.el-message-box--center .el-message-box__status { + font-size: inherit +} + +.el-message-box--center .el-message-box__btns, +.el-message-box--center .el-message-box__container { + justify-content: center +} + +.fade-in-linear-enter-active .el-overlay-message-box { + animation: msgbox-fade-in var(--el-transition-duration) +} + +.fade-in-linear-leave-active .el-overlay-message-box { + animation: msgbox-fade-in var(--el-transition-duration) reverse +} + +@keyframes msgbox-fade-in { + 0% { + opacity: 0; + transform: translate3d(0, -20px, 0) + } + + to { + opacity: 1; + transform: translateZ(0) + } +} + +.el-message { + --el-message-bg-color: var(--el-color-info-light-9); + --el-message-border-color: var(--el-border-color-lighter); + --el-message-padding: 11px 15px; + --el-message-close-size: 16px; + --el-message-close-icon-color: var(--el-text-color-placeholder); + --el-message-close-hover-color: var(--el-text-color-secondary); + align-items: center; + background-color: var(--el-message-bg-color); + border-color: var(--el-message-border-color); + border-radius: var(--el-border-radius-base); + border-style: var(--el-border-style); + border-width: var(--el-border-width); + box-sizing: border-box; + display: flex; + gap: 8px; + left: 50%; + max-width: calc(100% - 32px); + padding: var(--el-message-padding); + position: fixed; + top: 20px; + transform: translate(-50%); + transition: opacity var(--el-transition-duration), transform .4s, top .4s; + width: -moz-fit-content; + width: fit-content +} + +.el-message.is-center { + justify-content: center +} + +.el-message.is-plain { + background-color: var(--el-bg-color-overlay); + border-color: var(--el-bg-color-overlay); + box-shadow: var(--el-box-shadow-light) +} + +.el-message p { + margin: 0 +} + +.el-message--success { + --el-message-bg-color: var(--el-color-success-light-9); + --el-message-border-color: var(--el-color-success-light-8); + --el-message-text-color: var(--el-color-success) +} + +.el-message--success .el-message__content { + color: var(--el-message-text-color); + overflow-wrap: break-word +} + +.el-message .el-message-icon--success { + color: var(--el-message-text-color) +} + +.el-message--info { + --el-message-bg-color: var(--el-color-info-light-9); + --el-message-border-color: var(--el-color-info-light-8); + --el-message-text-color: var(--el-color-info) +} + +.el-message--info .el-message__content { + color: var(--el-message-text-color); + overflow-wrap: break-word +} + +.el-message .el-message-icon--info { + color: var(--el-message-text-color) +} + +.el-message--warning { + --el-message-bg-color: var(--el-color-warning-light-9); + --el-message-border-color: var(--el-color-warning-light-8); + --el-message-text-color: var(--el-color-warning) +} + +.el-message--warning .el-message__content { + color: var(--el-message-text-color); + overflow-wrap: break-word +} + +.el-message .el-message-icon--warning { + color: var(--el-message-text-color) +} + +.el-message--error { + --el-message-bg-color: var(--el-color-error-light-9); + --el-message-border-color: var(--el-color-error-light-8); + --el-message-text-color: var(--el-color-error) +} + +.el-message--error .el-message__content { + color: var(--el-message-text-color); + overflow-wrap: break-word +} + +.el-message .el-message-icon--error { + color: var(--el-message-text-color) +} + +.el-message .el-message__badge { + position: absolute; + right: -8px; + top: -8px +} + +.el-message__content { + font-size: 14px; + line-height: 1; + padding: 0 +} + +.el-message__content:focus { + outline-width: 0 +} + +.el-message .el-message__closeBtn { + color: var(--el-message-close-icon-color); + cursor: pointer; + font-size: var(--el-message-close-size) +} + +.el-message .el-message__closeBtn:focus { + outline-width: 0 +} + +.el-message .el-message__closeBtn:hover { + color: var(--el-message-close-hover-color) +} + +.el-message-fade-enter-from, +.el-message-fade-leave-to { + opacity: 0; + transform: translate(-50%, -100%) +} + +.el-notification { + --el-notification-width: 330px; + --el-notification-padding: 14px 26px 14px 13px; + --el-notification-radius: 8px; + --el-notification-shadow: var(--el-box-shadow-light); + --el-notification-border-color: var(--el-border-color-lighter); + --el-notification-icon-size: 24px; + --el-notification-close-font-size: var(--el-message-close-size, 16px); + --el-notification-group-margin-left: 13px; + --el-notification-group-margin-right: 8px; + --el-notification-content-font-size: var(--el-font-size-base); + --el-notification-content-color: var(--el-text-color-regular); + --el-notification-title-font-size: 16px; + --el-notification-title-color: var(--el-text-color-primary); + --el-notification-close-color: var(--el-text-color-secondary); + --el-notification-close-hover-color: var(--el-text-color-regular); + background-color: var(--el-bg-color-overlay); + border: 1px solid var(--el-notification-border-color); + border-radius: var(--el-notification-radius); + box-shadow: var(--el-notification-shadow); + box-sizing: border-box; + display: flex; + overflow: hidden; + overflow-wrap: break-word; + padding: var(--el-notification-padding); + position: fixed; + transition: opacity var(--el-transition-duration), transform var(--el-transition-duration), left var(--el-transition-duration), right var(--el-transition-duration), top .4s, bottom var(--el-transition-duration); + width: var(--el-notification-width); + z-index: 9999 +} + +.el-notification.right { + right: 16px +} + +.el-notification.left { + left: 16px +} + +.el-notification__group { + margin-left: var(--el-notification-group-margin-left); + margin-right: var(--el-notification-group-margin-right) +} + +.el-notification__title { + color: var(--el-notification-title-color); + font-size: var(--el-notification-title-font-size); + font-weight: 700; + line-height: var(--el-notification-icon-size); + margin: 0 +} + +.el-notification__content { + color: var(--el-notification-content-color); + font-size: var(--el-notification-content-font-size); + line-height: 24px; + margin: 6px 0 0 +} + +.el-notification__content p { + margin: 0 +} + +.el-notification .el-notification__icon { + font-size: var(--el-notification-icon-size); + height: var(--el-notification-icon-size); + width: var(--el-notification-icon-size) +} + +.el-notification .el-notification__closeBtn { + color: var(--el-notification-close-color); + cursor: pointer; + font-size: var(--el-notification-close-font-size); + position: absolute; + right: 15px; + top: 18px +} + +.el-notification .el-notification__closeBtn:hover { + color: var(--el-notification-close-hover-color) +} + +.el-notification .el-notification--success { + --el-notification-icon-color: var(--el-color-success); + color: var(--el-notification-icon-color) +} + +.el-notification .el-notification--info { + --el-notification-icon-color: var(--el-color-info); + color: var(--el-notification-icon-color) +} + +.el-notification .el-notification--warning { + --el-notification-icon-color: var(--el-color-warning); + color: var(--el-notification-icon-color) +} + +.el-notification .el-notification--error { + --el-notification-icon-color: var(--el-color-error); + color: var(--el-notification-icon-color) +} + +.el-notification-fade-enter-from.right { + right: 0; + transform: translate(100%) +} + +.el-notification-fade-enter-from.left { + left: 0; + transform: translate(-100%) +} + +.el-notification-fade-leave-to { + opacity: 0 +} + +.el-overlay { + background-color: var(--el-overlay-color-lighter); + bottom: 0; + height: 100%; + left: 0; + overflow: auto; + position: fixed; + right: 0; + top: 0; + z-index: 2000 +} + +.el-overlay .el-overlay-root { + height: 0 +} + +.el-page-header.is-contentful .el-page-header__main { + border-top: 1px solid var(--el-border-color-light); + margin-top: 16px +} + +.el-page-header__header { + align-items: center; + display: flex; + justify-content: space-between; + line-height: 24px +} + +.el-page-header__left { + align-items: center; + display: flex; + margin-right: 40px; + position: relative +} + +.el-page-header__back { + align-items: center; + cursor: pointer; + display: flex +} + +.el-page-header__left .el-divider--vertical { + margin: 0 16px +} + +.el-page-header__icon { + align-items: center; + display: flex; + font-size: 16px; + margin-right: 10px +} + +.el-page-header__icon .el-icon { + font-size: inherit +} + +.el-page-header__title { + font-size: 14px; + font-weight: 500 +} + +.el-page-header__content { + color: var(--el-text-color-primary); + font-size: 18px +} + +.el-page-header__breadcrumb { + margin-bottom: 16px +} + +.el-pagination { + --el-pagination-font-size: 14px; + --el-pagination-bg-color: var(--el-fill-color-blank); + --el-pagination-text-color: var(--el-text-color-primary); + --el-pagination-border-radius: 2px; + --el-pagination-button-color: var(--el-text-color-primary); + --el-pagination-button-width: 32px; + --el-pagination-button-height: 32px; + --el-pagination-button-disabled-color: var(--el-text-color-placeholder); + --el-pagination-button-disabled-bg-color: var(--el-fill-color-blank); + --el-pagination-button-bg-color: var(--el-fill-color); + --el-pagination-hover-color: var(--el-color-primary); + --el-pagination-font-size-small: 12px; + --el-pagination-button-width-small: 24px; + --el-pagination-button-height-small: 24px; + --el-pagination-button-width-large: 40px; + --el-pagination-button-height-large: 40px; + --el-pagination-item-gap: 16px; + align-items: center; + color: var(--el-pagination-text-color); + display: flex; + font-size: var(--el-pagination-font-size); + font-weight: 400; + white-space: nowrap +} + +.el-pagination .el-input__inner { + -moz-appearance: textfield; + text-align: center +} + +.el-pagination .el-select { + width: 128px +} + +.el-pagination button { + align-items: center; + background: var(--el-pagination-bg-color); + border: none; + border-radius: var(--el-pagination-border-radius); + box-sizing: border-box; + color: var(--el-pagination-button-color); + cursor: pointer; + display: flex; + font-size: var(--el-pagination-font-size); + height: var(--el-pagination-button-height); + justify-content: center; + line-height: var(--el-pagination-button-height); + min-width: var(--el-pagination-button-width); + padding: 0 4px; + text-align: center +} + +.el-pagination button * { + pointer-events: none +} + +.el-pagination button:focus { + outline: none +} + +.el-pagination button.is-active, +.el-pagination button:hover { + color: var(--el-pagination-hover-color) +} + +.el-pagination button.is-active { + cursor: default; + font-weight: 700 +} + +.el-pagination button.is-active.is-disabled { + color: var(--el-text-color-secondary); + font-weight: 700 +} + +.el-pagination button.is-disabled, +.el-pagination button:disabled { + background-color: var(--el-pagination-button-disabled-bg-color); + color: var(--el-pagination-button-disabled-color); + cursor: not-allowed +} + +.el-pagination button:focus-visible { + outline: 1px solid var(--el-pagination-hover-color); + outline-offset: -1px +} + +.el-pagination .btn-next .el-icon, +.el-pagination .btn-prev .el-icon { + display: block; + font-size: 12px; + font-weight: 700; + width: inherit +} + +.el-pagination>.is-first { + margin-left: 0 !important +} + +.el-pagination>.is-last { + margin-right: 0 !important +} + +.el-pagination .btn-prev { + margin-left: var(--el-pagination-item-gap) +} + +.el-pagination__sizes, +.el-pagination__total { + color: var(--el-text-color-regular); + font-weight: 400; + margin-left: var(--el-pagination-item-gap) +} + +.el-pagination__total[disabled=true] { + color: var(--el-text-color-placeholder) +} + +.el-pagination__jump { + align-items: center; + color: var(--el-text-color-regular); + display: flex; + font-weight: 400; + margin-left: var(--el-pagination-item-gap) +} + +.el-pagination__jump[disabled=true] { + color: var(--el-text-color-placeholder) +} + +.el-pagination__goto { + margin-right: 8px +} + +.el-pagination__editor { + box-sizing: border-box; + text-align: center +} + +.el-pagination__editor.el-input { + width: 56px +} + +.el-pagination__editor .el-input__inner::-webkit-inner-spin-button, +.el-pagination__editor .el-input__inner::-webkit-outer-spin-button { + -webkit-appearance: none; + margin: 0 +} + +.el-pagination__classifier { + margin-left: 8px +} + +.el-pagination__rightwrapper { + align-items: center; + display: flex; + flex: 1; + justify-content: flex-end +} + +.el-pagination.is-background .btn-next, +.el-pagination.is-background .btn-prev, +.el-pagination.is-background .el-pager li { + background-color: var(--el-pagination-button-bg-color); + margin: 0 4px +} + +.el-pagination.is-background .btn-next.is-active, +.el-pagination.is-background .btn-prev.is-active, +.el-pagination.is-background .el-pager li.is-active { + background-color: var(--el-color-primary); + color: var(--el-color-white) +} + +.el-pagination.is-background .btn-next.is-disabled, +.el-pagination.is-background .btn-next:disabled, +.el-pagination.is-background .btn-prev.is-disabled, +.el-pagination.is-background .btn-prev:disabled, +.el-pagination.is-background .el-pager li.is-disabled, +.el-pagination.is-background .el-pager li:disabled { + background-color: var(--el-disabled-bg-color); + color: var(--el-text-color-placeholder) +} + +.el-pagination.is-background .btn-next.is-disabled.is-active, +.el-pagination.is-background .btn-next:disabled.is-active, +.el-pagination.is-background .btn-prev.is-disabled.is-active, +.el-pagination.is-background .btn-prev:disabled.is-active, +.el-pagination.is-background .el-pager li.is-disabled.is-active, +.el-pagination.is-background .el-pager li:disabled.is-active { + background-color: var(--el-fill-color-dark); + color: var(--el-text-color-secondary) +} + +.el-pagination.is-background .btn-prev { + margin-left: var(--el-pagination-item-gap) +} + +.el-pagination--small .btn-next, +.el-pagination--small .btn-prev, +.el-pagination--small .el-pager li { + font-size: var(--el-pagination-font-size-small); + height: var(--el-pagination-button-height-small); + line-height: var(--el-pagination-button-height-small); + min-width: var(--el-pagination-button-width-small) +} + +.el-pagination--small button, +.el-pagination--small span:not([class*=suffix]) { + font-size: var(--el-pagination-font-size-small) +} + +.el-pagination--small .el-select { + width: 100px +} + +.el-pagination--large .btn-next, +.el-pagination--large .btn-prev, +.el-pagination--large .el-pager li { + height: var(--el-pagination-button-height-large); + line-height: var(--el-pagination-button-height-large); + min-width: var(--el-pagination-button-width-large) +} + +.el-pagination--large .el-select .el-input { + width: 160px +} + +.el-pager { + font-size: 0; + list-style: none; + margin: 0; + padding: 0; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-pager, +.el-pager li { + align-items: center; + display: flex +} + +.el-pager li { + background: var(--el-pagination-bg-color); + border: none; + border-radius: var(--el-pagination-border-radius); + box-sizing: border-box; + color: var(--el-pagination-button-color); + cursor: pointer; + font-size: var(--el-pagination-font-size); + height: var(--el-pagination-button-height); + justify-content: center; + line-height: var(--el-pagination-button-height); + min-width: var(--el-pagination-button-width); + padding: 0 4px; + text-align: center +} + +.el-pager li * { + pointer-events: none +} + +.el-pager li:focus { + outline: none +} + +.el-pager li.is-active, +.el-pager li:hover { + color: var(--el-pagination-hover-color) +} + +.el-pager li.is-active { + cursor: default; + font-weight: 700 +} + +.el-pager li.is-active.is-disabled { + color: var(--el-text-color-secondary); + font-weight: 700 +} + +.el-pager li.is-disabled, +.el-pager li:disabled { + background-color: var(--el-pagination-button-disabled-bg-color); + color: var(--el-pagination-button-disabled-color); + cursor: not-allowed +} + +.el-pager li:focus-visible { + outline: 1px solid var(--el-pagination-hover-color); + outline-offset: -1px +} + +.el-popconfirm__main { + align-items: center; + display: flex +} + +.el-popconfirm__icon { + margin-right: 5px +} + +.el-popconfirm__action { + margin-top: 8px; + text-align: right +} + +.el-popover { + --el-popover-bg-color: var(--el-bg-color-overlay); + --el-popover-font-size: var(--el-font-size-base); + --el-popover-border-color: var(--el-border-color-lighter); + --el-popover-padding: 12px; + --el-popover-padding-large: 18px 20px; + --el-popover-title-font-size: 16px; + --el-popover-title-text-color: var(--el-text-color-primary); + --el-popover-border-radius: 4px +} + +.el-popover.el-popper { + background: var(--el-popover-bg-color); + border: 1px solid var(--el-popover-border-color); + border-radius: var(--el-popover-border-radius); + box-shadow: var(--el-box-shadow-light); + box-sizing: border-box; + color: var(--el-text-color-regular); + font-size: var(--el-popover-font-size); + line-height: 1.4; + min-width: 150px; + overflow-wrap: break-word; + padding: var(--el-popover-padding); + z-index: var(--el-index-popper) +} + +.el-popover.el-popper--plain { + padding: var(--el-popover-padding-large) +} + +.el-popover__title { + color: var(--el-popover-title-text-color); + font-size: var(--el-popover-title-font-size); + line-height: 1; + margin-bottom: 12px +} + +.el-popover__reference:focus:hover, +.el-popover__reference:focus:not(.focusing) { + outline-width: 0 +} + +.el-popover.el-popper.is-dark { + --el-popover-bg-color: var(--el-text-color-primary); + --el-popover-border-color: var(--el-text-color-primary); + --el-popover-title-text-color: var(--el-bg-color); + color: var(--el-bg-color) +} + +.el-popover.el-popper:focus, +.el-popover.el-popper:focus:active { + outline-width: 0 +} + +.el-progress { + align-items: center; + display: flex; + line-height: 1; + position: relative +} + +.el-progress__text { + color: var(--el-text-color-regular); + font-size: 14px; + line-height: 1; + margin-left: 5px; + min-width: 50px +} + +.el-progress__text i { + display: block; + vertical-align: middle +} + +.el-progress--circle, +.el-progress--dashboard { + display: inline-block +} + +.el-progress--circle .el-progress__text, +.el-progress--dashboard .el-progress__text { + left: 0; + margin: 0; + position: absolute; + text-align: center; + top: 50%; + transform: translateY(-50%); + width: 100% +} + +.el-progress--circle .el-progress__text i, +.el-progress--dashboard .el-progress__text i { + display: inline-block; + vertical-align: middle +} + +.el-progress--without-text .el-progress__text { + display: none +} + +.el-progress--without-text .el-progress-bar { + display: block; + margin-right: 0; + padding-right: 0 +} + +.el-progress--text-inside .el-progress-bar { + margin-right: 0; + padding-right: 0 +} + +.el-progress.is-success .el-progress-bar__inner { + background-color: var(--el-color-success) +} + +.el-progress.is-success .el-progress__text { + color: var(--el-color-success) +} + +.el-progress.is-warning .el-progress-bar__inner { + background-color: var(--el-color-warning) +} + +.el-progress.is-warning .el-progress__text { + color: var(--el-color-warning) +} + +.el-progress.is-exception .el-progress-bar__inner { + background-color: var(--el-color-danger) +} + +.el-progress.is-exception .el-progress__text { + color: var(--el-color-danger) +} + +.el-progress-bar { + box-sizing: border-box; + flex-grow: 1 +} + +.el-progress-bar__outer { + background-color: var(--el-border-color-lighter); + border-radius: 100px; + height: 6px; + overflow: hidden; + position: relative; + vertical-align: middle +} + +.el-progress-bar__inner { + background-color: var(--el-color-primary); + border-radius: 100px; + height: 100%; + left: 0; + line-height: 1; + position: absolute; + text-align: right; + top: 0; + transition: width .6s ease; + white-space: nowrap +} + +.el-progress-bar__inner:after { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle +} + +.el-progress-bar__inner--indeterminate { + animation: indeterminate 3s infinite; + transform: translateZ(0) +} + +.el-progress-bar__inner--striped { + background-image: linear-gradient(45deg, rgba(0, 0, 0, .1) 25%, transparent 0, transparent 50%, rgba(0, 0, 0, .1) 0, rgba(0, 0, 0, .1) 75%, transparent 0, transparent); + background-size: 1.25em 1.25em +} + +.el-progress-bar__inner--striped.el-progress-bar__inner--striped-flow { + animation: striped-flow 3s linear infinite +} + +.el-progress-bar__innerText { + color: #fff; + display: inline-block; + font-size: 12px; + margin: 0 5px; + vertical-align: middle +} + +@keyframes progress { + 0% { + background-position: 0 0 + } + + to { + background-position: 32px 0 + } +} + +@keyframes indeterminate { + 0% { + left: -100% + } + + to { + left: 100% + } +} + +@keyframes striped-flow { + 0% { + background-position: -100% + } + + to { + background-position: 100% + } +} + +.el-radio-button { + --el-radio-button-checked-bg-color: var(--el-color-primary); + --el-radio-button-checked-text-color: var(--el-color-white); + --el-radio-button-checked-border-color: var(--el-color-primary); + --el-radio-button-disabled-checked-fill: var(--el-border-color-extra-light) +} + +.el-radio-button, +.el-radio-button__inner { + display: inline-block; + outline: none; + position: relative +} + +.el-radio-button__inner { + -webkit-appearance: none; + background: var(--el-button-bg-color, var(--el-fill-color-blank)); + border: var(--el-border); + border-left: 0; + border-radius: 0; + box-sizing: border-box; + color: var(--el-button-text-color, var(--el-text-color-regular)); + cursor: pointer; + font-size: var(--el-font-size-base); + font-weight: var(--el-button-font-weight, var(--el-font-weight-primary)); + line-height: 1; + margin: 0; + padding: 8px 15px; + text-align: center; + transition: var(--el-transition-all); + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + vertical-align: middle; + white-space: nowrap +} + +.el-radio-button__inner.is-round { + padding: 8px 15px +} + +.el-radio-button__inner:hover { + color: var(--el-color-primary) +} + +.el-radio-button__inner [class*=el-icon-] { + line-height: .9 +} + +.el-radio-button__inner [class*=el-icon-]+span { + margin-left: 5px +} + +.el-radio-button:first-child .el-radio-button__inner { + border-left: var(--el-border); + border-radius: var(--el-border-radius-base) 0 0 var(--el-border-radius-base); + box-shadow: none !important +} + +.el-radio-button.is-active .el-radio-button__original-radio:not(:disabled)+.el-radio-button__inner { + background-color: var(--el-radio-button-checked-bg-color, var(--el-color-primary)); + border-color: var(--el-radio-button-checked-border-color, var(--el-color-primary)); + box-shadow: -1px 0 0 0 var(--el-radio-button-checked-border-color, var(--el-color-primary)); + color: var(--el-radio-button-checked-text-color, var(--el-color-white)) +} + +.el-radio-button__original-radio { + opacity: 0; + outline: none; + position: absolute; + z-index: -1 +} + +.el-radio-button__original-radio:focus-visible+.el-radio-button__inner { + border-left: var(--el-border); + border-left-color: var(--el-radio-button-checked-border-color, var(--el-color-primary)); + border-radius: var(--el-border-radius-base); + box-shadow: none; + outline: 2px solid var(--el-radio-button-checked-border-color); + outline-offset: 1px; + z-index: 2 +} + +.el-radio-button__original-radio:disabled+.el-radio-button__inner { + background-color: var(--el-button-disabled-bg-color, var(--el-fill-color-blank)); + background-image: none; + border-color: var(--el-button-disabled-border-color, var(--el-border-color-light)); + box-shadow: none; + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner { + background-color: var(--el-radio-button-disabled-checked-fill) +} + +.el-radio-button:last-child .el-radio-button__inner { + border-radius: 0 var(--el-border-radius-base) var(--el-border-radius-base) 0 +} + +.el-radio-button:first-child:last-child .el-radio-button__inner { + border-radius: var(--el-border-radius-base) +} + +.el-radio-button--large .el-radio-button__inner { + border-radius: 0; + font-size: var(--el-font-size-base); + padding: 12px 19px +} + +.el-radio-button--large .el-radio-button__inner.is-round { + padding: 12px 19px +} + +.el-radio-button--small .el-radio-button__inner { + border-radius: 0; + font-size: 12px; + padding: 5px 11px +} + +.el-radio-button--small .el-radio-button__inner.is-round { + padding: 5px 11px +} + +.el-radio-group { + align-items: center; + display: inline-flex; + flex-wrap: wrap; + font-size: 0 +} + +.el-radio { + --el-radio-font-size: var(--el-font-size-base); + --el-radio-text-color: var(--el-text-color-regular); + --el-radio-font-weight: var(--el-font-weight-primary); + --el-radio-input-height: 14px; + --el-radio-input-width: 14px; + --el-radio-input-border-radius: var(--el-border-radius-circle); + --el-radio-input-bg-color: var(--el-fill-color-blank); + --el-radio-input-border: var(--el-border); + --el-radio-input-border-color: var(--el-border-color); + --el-radio-input-border-color-hover: var(--el-color-primary); + align-items: center; + color: var(--el-radio-text-color); + cursor: pointer; + display: inline-flex; + font-size: var(--el-font-size-base); + font-weight: var(--el-radio-font-weight); + height: 32px; + margin-right: 30px; + outline: none; + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + white-space: nowrap +} + +.el-radio.el-radio--large { + height: 40px +} + +.el-radio.el-radio--small { + height: 24px +} + +.el-radio.is-bordered { + border: var(--el-border); + border-radius: var(--el-border-radius-base); + box-sizing: border-box; + padding: 0 15px 0 9px +} + +.el-radio.is-bordered.is-checked { + border-color: var(--el-color-primary) +} + +.el-radio.is-bordered.is-disabled { + border-color: var(--el-border-color-lighter); + cursor: not-allowed +} + +.el-radio.is-bordered.el-radio--large { + border-radius: var(--el-border-radius-base); + padding: 0 19px 0 11px +} + +.el-radio.is-bordered.el-radio--large .el-radio__label { + font-size: var(--el-font-size-base) +} + +.el-radio.is-bordered.el-radio--large .el-radio__inner { + height: 14px; + width: 14px +} + +.el-radio.is-bordered.el-radio--small { + border-radius: var(--el-border-radius-base); + padding: 0 11px 0 7px +} + +.el-radio.is-bordered.el-radio--small .el-radio__label { + font-size: 12px +} + +.el-radio.is-bordered.el-radio--small .el-radio__inner { + height: 12px; + width: 12px +} + +.el-radio:last-child { + margin-right: 0 +} + +.el-radio__input { + cursor: pointer; + display: inline-flex; + outline: none; + position: relative; + vertical-align: middle; + white-space: nowrap +} + +.el-radio__input.is-disabled .el-radio__inner { + border-color: var(--el-disabled-border-color) +} + +.el-radio__input.is-disabled .el-radio__inner, +.el-radio__input.is-disabled .el-radio__inner:after { + background-color: var(--el-disabled-bg-color); + cursor: not-allowed +} + +.el-radio__input.is-disabled .el-radio__inner+.el-radio__label { + cursor: not-allowed +} + +.el-radio__input.is-disabled.is-checked .el-radio__inner { + background-color: var(--el-disabled-bg-color); + border-color: var(--el-disabled-border-color) +} + +.el-radio__input.is-disabled.is-checked .el-radio__inner:after { + background-color: var(--el-text-color-placeholder) +} + +.el-radio__input.is-disabled+span.el-radio__label { + color: var(--el-text-color-placeholder); + cursor: not-allowed +} + +.el-radio__input.is-checked .el-radio__inner { + background: var(--el-color-primary); + border-color: var(--el-color-primary) +} + +.el-radio__input.is-checked .el-radio__inner:after { + transform: translate(-50%, -50%) scale(1) +} + +.el-radio__input.is-checked+.el-radio__label { + color: var(--el-color-primary) +} + +.el-radio__input.is-focus .el-radio__inner { + border-color: var(--el-radio-input-border-color-hover) +} + +.el-radio__inner { + background-color: var(--el-radio-input-bg-color); + border: var(--el-radio-input-border); + border-radius: var(--el-radio-input-border-radius); + box-sizing: border-box; + cursor: pointer; + display: inline-block; + height: var(--el-radio-input-height); + position: relative; + width: var(--el-radio-input-width) +} + +.el-radio__inner:hover { + border-color: var(--el-radio-input-border-color-hover) +} + +.el-radio__inner:after { + background-color: var(--el-color-white); + border-radius: var(--el-radio-input-border-radius); + content: ""; + height: 4px; + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%) scale(0); + transition: transform .15s ease-in; + width: 4px +} + +.el-radio__original { + bottom: 0; + left: 0; + margin: 0; + opacity: 0; + outline: none; + position: absolute; + right: 0; + top: 0; + z-index: -1 +} + +.el-radio__original:focus-visible+.el-radio__inner { + border-radius: var(--el-radio-input-border-radius); + outline: 2px solid var(--el-radio-input-border-color-hover); + outline-offset: 1px +} + +.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner { + box-shadow: 0 0 2px 2px var(--el-radio-input-border-color-hover) +} + +.el-radio__label { + font-size: var(--el-radio-font-size); + padding-left: 8px +} + +.el-radio.el-radio--large .el-radio__label { + font-size: 14px +} + +.el-radio.el-radio--large .el-radio__inner { + height: 14px; + width: 14px +} + +.el-radio.el-radio--small .el-radio__label { + font-size: 12px +} + +.el-radio.el-radio--small .el-radio__inner { + height: 12px; + width: 12px +} + +.el-rate { + --el-rate-height: 20px; + --el-rate-font-size: var(--el-font-size-base); + --el-rate-icon-size: 18px; + --el-rate-icon-margin: 6px; + --el-rate-void-color: var(--el-border-color-darker); + --el-rate-fill-color: #f7ba2a; + --el-rate-disabled-void-color: var(--el-fill-color); + --el-rate-text-color: var(--el-text-color-primary); + align-items: center; + display: inline-flex; + height: 32px +} + +.el-rate:active, +.el-rate:focus { + outline: none +} + +.el-rate__item { + color: var(--el-rate-void-color); + cursor: pointer; + display: inline-block; + font-size: 0; + line-height: normal; + position: relative; + vertical-align: middle +} + +.el-rate .el-rate__icon { + display: inline-block; + font-size: var(--el-rate-icon-size); + margin-right: var(--el-rate-icon-margin); + position: relative; + transition: var(--el-transition-duration) +} + +.el-rate .el-rate__icon.hover { + transform: scale(1.15) +} + +.el-rate .el-rate__icon .path2 { + left: 0; + position: absolute; + top: 0 +} + +.el-rate .el-rate__icon.is-active { + color: var(--el-rate-fill-color) +} + +.el-rate__decimal { + color: var(--el-rate-fill-color); + display: inline-block; + overflow: hidden +} + +.el-rate__decimal, +.el-rate__decimal--box { + left: 0; + position: absolute; + top: 0 +} + +.el-rate__text { + color: var(--el-rate-text-color); + font-size: var(--el-rate-font-size); + vertical-align: middle +} + +.el-rate--large { + height: 40px +} + +.el-rate--small { + height: 24px +} + +.el-rate--small .el-rate__icon { + font-size: 14px +} + +.el-rate.is-disabled .el-rate__item { + color: var(--el-rate-disabled-void-color); + cursor: auto +} + +.el-result { + --el-result-padding: 40px 30px; + --el-result-icon-font-size: 64px; + --el-result-title-font-size: 20px; + --el-result-title-margin-top: 20px; + --el-result-subtitle-margin-top: 10px; + --el-result-extra-margin-top: 30px; + align-items: center; + box-sizing: border-box; + display: flex; + flex-direction: column; + justify-content: center; + padding: var(--el-result-padding); + text-align: center +} + +.el-result__icon svg { + height: var(--el-result-icon-font-size); + width: var(--el-result-icon-font-size) +} + +.el-result__title { + margin-top: var(--el-result-title-margin-top) +} + +.el-result__title p { + color: var(--el-text-color-primary); + font-size: var(--el-result-title-font-size); + line-height: 1.3; + margin: 0 +} + +.el-result__subtitle { + margin-top: var(--el-result-subtitle-margin-top) +} + +.el-result__subtitle p { + color: var(--el-text-color-regular); + font-size: var(--el-font-size-base); + line-height: 1.3; + margin: 0 +} + +.el-result__extra { + margin-top: var(--el-result-extra-margin-top) +} + +.el-result .icon-primary { + --el-result-color: var(--el-color-primary); + color: var(--el-result-color) +} + +.el-result .icon-success { + --el-result-color: var(--el-color-success); + color: var(--el-result-color) +} + +.el-result .icon-warning { + --el-result-color: var(--el-color-warning); + color: var(--el-result-color) +} + +.el-result .icon-danger { + --el-result-color: var(--el-color-danger); + color: var(--el-result-color) +} + +.el-result .icon-error { + --el-result-color: var(--el-color-error); + color: var(--el-result-color) +} + +.el-result .icon-info { + --el-result-color: var(--el-color-info); + color: var(--el-result-color) +} + +.el-row { + box-sizing: border-box; + display: flex; + flex-wrap: wrap; + position: relative +} + +.el-row.is-justify-center { + justify-content: center +} + +.el-row.is-justify-end { + justify-content: flex-end +} + +.el-row.is-justify-space-between { + justify-content: space-between +} + +.el-row.is-justify-space-around { + justify-content: space-around +} + +.el-row.is-justify-space-evenly { + justify-content: space-evenly +} + +.el-row.is-align-top { + align-items: flex-start +} + +.el-row.is-align-middle { + align-items: center +} + +.el-row.is-align-bottom { + align-items: flex-end +} + +.el-scrollbar { + --el-scrollbar-opacity: .3; + --el-scrollbar-bg-color: var(--el-text-color-secondary); + --el-scrollbar-hover-opacity: .5; + --el-scrollbar-hover-bg-color: var(--el-text-color-secondary); + height: 100%; + overflow: hidden; + position: relative +} + +.el-scrollbar__wrap { + height: 100%; + overflow: auto +} + +.el-scrollbar__wrap--hidden-default { + scrollbar-width: none +} + +.el-scrollbar__wrap--hidden-default::-webkit-scrollbar { + display: none +} + +.el-scrollbar__thumb { + background-color: var(--el-scrollbar-bg-color, var(--el-text-color-secondary)); + border-radius: inherit; + cursor: pointer; + display: block; + height: 0; + opacity: var(--el-scrollbar-opacity, .3); + position: relative; + transition: var(--el-transition-duration) background-color; + width: 0 +} + +.el-scrollbar__thumb:hover { + background-color: var(--el-scrollbar-hover-bg-color, var(--el-text-color-secondary)); + opacity: var(--el-scrollbar-hover-opacity, .5) +} + +.el-scrollbar__bar { + border-radius: 4px; + bottom: 2px; + position: absolute; + right: 2px; + z-index: 1 +} + +.el-scrollbar__bar.is-vertical { + top: 2px; + width: 6px +} + +.el-scrollbar__bar.is-vertical>div { + width: 100% +} + +.el-scrollbar__bar.is-horizontal { + height: 6px; + left: 2px +} + +.el-scrollbar__bar.is-horizontal>div { + height: 100% +} + +.el-scrollbar-fade-enter-active { + transition: opacity .34s ease-out +} + +.el-scrollbar-fade-leave-active { + transition: opacity .12s ease-out +} + +.el-scrollbar-fade-enter-from, +.el-scrollbar-fade-leave-active { + opacity: 0 +} + +.el-select-dropdown { + border-radius: var(--el-border-radius-base); + box-sizing: border-box; + z-index: calc(var(--el-index-top) + 1) +} + +.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list { + padding: 0 +} + +.el-select-dropdown__empty, +.el-select-dropdown__loading { + color: var(--el-text-color-secondary); + font-size: var(--el-select-font-size); + margin: 0; + padding: 10px 0; + text-align: center +} + +.el-select-dropdown__wrap { + max-height: 274px +} + +.el-select-dropdown__list { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: 6px 0 +} + +.el-select-dropdown__list.el-vl__window { + margin: 6px 0; + padding: 0 +} + +.el-select-dropdown__header { + border-bottom: 1px solid var(--el-border-color-light); + padding: 10px +} + +.el-select-dropdown__footer { + border-top: 1px solid var(--el-border-color-light); + padding: 10px +} + +.el-select-dropdown__item { + box-sizing: border-box; + color: var(--el-text-color-regular); + cursor: pointer; + font-size: var(--el-font-size-base); + height: 34px; + line-height: 34px; + overflow: hidden; + padding: 0 32px 0 20px; + position: relative; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-select-dropdown__item.is-hovering { + background-color: var(--el-fill-color-light) +} + +.el-select-dropdown__item.is-selected { + color: var(--el-color-primary); + font-weight: 700 +} + +.el-select-dropdown__item.is-disabled { + background-color: unset; + color: var(--el-text-color-placeholder); + cursor: not-allowed +} + +.el-select-dropdown.is-multiple .el-select-dropdown__item.is-selected:after { + background-color: var(--el-color-primary); + background-position: 50%; + background-repeat: no-repeat; + border-right: none; + border-top: none; + content: ""; + height: 12px; + mask: url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat; + mask-size: 100% 100%; + -webkit-mask: url("data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E") no-repeat; + -webkit-mask-size: 100% 100%; + position: absolute; + right: 20px; + top: 50%; + transform: translateY(-50%); + width: 12px +} + +.el-select-dropdown.is-multiple .el-select-dropdown__item.is-disabled:after { + background-color: var(--el-text-color-placeholder) +} + +.el-select-group { + margin: 0; + padding: 0 +} + +.el-select-group__wrap { + list-style: none; + margin: 0; + padding: 0; + position: relative +} + +.el-select-group__title { + box-sizing: border-box; + color: var(--el-color-info); + font-size: 12px; + line-height: 34px; + overflow: hidden; + padding: 0 20px; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-select-group .el-select-dropdown__item { + padding-left: 20px +} + +.el-select { + --el-select-border-color-hover: var(--el-border-color-hover); + --el-select-disabled-color: var(--el-disabled-text-color); + --el-select-disabled-border: var(--el-disabled-border-color); + --el-select-font-size: var(--el-font-size-base); + --el-select-close-hover-color: var(--el-text-color-secondary); + --el-select-input-color: var(--el-text-color-placeholder); + --el-select-multiple-input-color: var(--el-text-color-regular); + --el-select-input-focus-border-color: var(--el-color-primary); + --el-select-input-font-size: 14px; + --el-select-width: 100%; + display: inline-block; + position: relative; + vertical-align: middle; + width: var(--el-select-width) +} + +.el-select__wrapper { + align-items: center; + background-color: var(--el-fill-color-blank); + border-radius: var(--el-border-radius-base); + box-shadow: 0 0 0 1px var(--el-border-color) inset; + box-sizing: border-box; + cursor: pointer; + display: flex; + font-size: 14px; + gap: 6px; + line-height: 24px; + min-height: 32px; + padding: 4px 12px; + position: relative; + text-align: left; + transform: translateZ(0); + transition: var(--el-transition-duration) +} + +.el-select__wrapper.is-filterable { + cursor: text +} + +.el-select__wrapper.is-focused { + box-shadow: 0 0 0 1px var(--el-color-primary) inset +} + +.el-select__wrapper.is-hovering:not(.is-focused) { + box-shadow: 0 0 0 1px var(--el-border-color-hover) inset +} + +.el-select__wrapper.is-disabled { + background-color: var(--el-fill-color-light); + color: var(--el-text-color-placeholder); + cursor: not-allowed +} + +.el-select__wrapper.is-disabled, +.el-select__wrapper.is-disabled:hover { + box-shadow: 0 0 0 1px var(--el-select-disabled-border) inset +} + +.el-select__wrapper.is-disabled.is-focus { + box-shadow: 0 0 0 1px var(--el-input-focus-border-color) inset +} + +.el-select__wrapper.is-disabled .el-select__selected-item { + color: var(--el-select-disabled-color) +} + +.el-select__wrapper.is-disabled .el-select__caret, +.el-select__wrapper.is-disabled .el-tag { + cursor: not-allowed +} + +.el-select__prefix, +.el-select__suffix { + align-items: center; + color: var(--el-input-icon-color, var(--el-text-color-placeholder)); + display: flex; + flex-shrink: 0; + gap: 6px +} + +.el-select__caret { + color: var(--el-select-input-color); + cursor: pointer; + font-size: var(--el-select-input-font-size); + transform: rotate(0); + transition: var(--el-transition-duration) +} + +.el-select__caret.is-reverse { + transform: rotate(180deg) +} + +.el-select__selection { + align-items: center; + display: flex; + flex: 1; + flex-wrap: wrap; + gap: 6px; + min-width: 0; + position: relative +} + +.el-select__selection.is-near { + margin-left: -8px +} + +.el-select__selection .el-tag { + border-color: transparent; + cursor: pointer +} + +.el-select__selection .el-tag.el-tag--plain { + border-color: var(--el-tag-border-color) +} + +.el-select__selection .el-tag .el-tag__content { + min-width: 0 +} + +.el-select__selected-item { + display: flex; + flex-wrap: wrap; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-select__tags-text { + line-height: normal +} + +.el-select__placeholder, +.el-select__tags-text { + display: block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-select__placeholder { + color: var(--el-input-text-color, var(--el-text-color-regular)); + position: absolute; + top: 50%; + transform: translateY(-50%); + width: 100% +} + +.el-select__placeholder.is-transparent { + color: var(--el-text-color-placeholder); + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-select__popper.el-popper { + background: var(--el-bg-color-overlay); + box-shadow: var(--el-box-shadow-light) +} + +.el-select__popper.el-popper, +.el-select__popper.el-popper .el-popper__arrow:before { + border: 1px solid var(--el-border-color-light) +} + +.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before { + border-left-color: transparent; + border-top-color: transparent +} + +.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before { + border-bottom-color: transparent; + border-right-color: transparent +} + +.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before { + border-bottom-color: transparent; + border-left-color: transparent +} + +.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before { + border-right-color: transparent; + border-top-color: transparent +} + +.el-select__input-wrapper { + max-width: 100% +} + +.el-select__input-wrapper.is-hidden { + opacity: 0; + position: absolute +} + +.el-select__input { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; + border: none; + color: var(--el-select-multiple-input-color); + font-family: inherit; + font-size: inherit; + height: 24px; + max-width: 100%; + outline: none; + padding: 0 +} + +.el-select__input.is-disabled { + cursor: not-allowed +} + +.el-select__input-calculator { + left: 0; + max-width: 100%; + overflow: hidden; + position: absolute; + top: 0; + visibility: hidden; + white-space: pre +} + +.el-select--large .el-select__wrapper { + font-size: 14px; + gap: 6px; + line-height: 24px; + min-height: 40px; + padding: 8px 16px +} + +.el-select--large .el-select__selection { + gap: 6px +} + +.el-select--large .el-select__selection.is-near { + margin-left: -8px +} + +.el-select--large .el-select__prefix, +.el-select--large .el-select__suffix { + gap: 6px +} + +.el-select--large .el-select__input { + height: 24px +} + +.el-select--small .el-select__wrapper { + font-size: 12px; + gap: 4px; + line-height: 20px; + min-height: 24px; + padding: 2px 8px +} + +.el-select--small .el-select__selection { + gap: 4px +} + +.el-select--small .el-select__selection.is-near { + margin-left: -6px +} + +.el-select--small .el-select__prefix, +.el-select--small .el-select__suffix { + gap: 4px +} + +.el-select--small .el-select__input { + height: 20px +} + +.el-skeleton { + --el-skeleton-circle-size: var(--el-avatar-size) +} + +.el-skeleton__item { + background: var(--el-skeleton-color); + border-radius: var(--el-border-radius-base); + display: inline-block; + height: 16px; + width: 100% +} + +.el-skeleton__circle { + border-radius: 50%; + height: var(--el-skeleton-circle-size); + line-height: var(--el-skeleton-circle-size); + width: var(--el-skeleton-circle-size) +} + +.el-skeleton__button { + border-radius: 4px; + height: 40px; + width: 64px +} + +.el-skeleton__p { + width: 100% +} + +.el-skeleton__p.is-last { + width: 61% +} + +.el-skeleton__p.is-first { + width: 33% +} + +.el-skeleton__text { + height: var(--el-font-size-small); + width: 100% +} + +.el-skeleton__caption { + height: var(--el-font-size-extra-small) +} + +.el-skeleton__h1 { + height: var(--el-font-size-extra-large) +} + +.el-skeleton__h3 { + height: var(--el-font-size-large) +} + +.el-skeleton__h5 { + height: var(--el-font-size-medium) +} + +.el-skeleton__image { + align-items: center; + border-radius: 0; + display: flex; + justify-content: center; + width: unset +} + +.el-skeleton__image svg { + color: var(--el-svg-monochrome-grey); + fill: currentColor; + height: 22%; + width: 22% +} + +.el-skeleton { + --el-skeleton-color: var(--el-fill-color); + --el-skeleton-to-color: var(--el-fill-color-darker) +} + +@keyframes el-skeleton-loading { + 0% { + background-position: 100% 50% + } + + to { + background-position: 0 50% + } +} + +.el-skeleton { + width: 100% +} + +.el-skeleton__first-line, +.el-skeleton__paragraph { + background: var(--el-skeleton-color); + height: 16px; + margin-top: 16px +} + +.el-skeleton.is-animated .el-skeleton__item { + animation: el-skeleton-loading 1.4s ease infinite; + background: linear-gradient(90deg, var(--el-skeleton-color) 25%, var(--el-skeleton-to-color) 37%, var(--el-skeleton-color) 63%); + background-size: 400% 100% +} + +.el-slider { + --el-slider-main-bg-color: var(--el-color-primary); + --el-slider-runway-bg-color: var(--el-border-color-light); + --el-slider-stop-bg-color: var(--el-color-white); + --el-slider-disabled-color: var(--el-text-color-placeholder); + --el-slider-border-radius: 3px; + --el-slider-height: 6px; + --el-slider-button-size: 20px; + --el-slider-button-wrapper-size: 36px; + --el-slider-button-wrapper-offset: -15px; + align-items: center; + display: flex; + height: 32px; + width: 100% +} + +.el-slider__runway { + background-color: var(--el-slider-runway-bg-color); + border-radius: var(--el-slider-border-radius); + cursor: pointer; + flex: 1; + height: var(--el-slider-height); + position: relative +} + +.el-slider__runway.show-input { + margin-right: 30px; + width: auto +} + +.el-slider__runway.is-disabled { + cursor: default +} + +.el-slider__runway.is-disabled .el-slider__bar { + background-color: var(--el-slider-disabled-color) +} + +.el-slider__runway.is-disabled .el-slider__button { + border-color: var(--el-slider-disabled-color) +} + +.el-slider__runway.is-disabled .el-slider__button-wrapper.dragging, +.el-slider__runway.is-disabled .el-slider__button-wrapper.hover, +.el-slider__runway.is-disabled .el-slider__button-wrapper:hover { + cursor: not-allowed +} + +.el-slider__runway.is-disabled .el-slider__button.dragging, +.el-slider__runway.is-disabled .el-slider__button.hover, +.el-slider__runway.is-disabled .el-slider__button:hover { + transform: scale(1) +} + +.el-slider__runway.is-disabled .el-slider__button.dragging, +.el-slider__runway.is-disabled .el-slider__button.hover, +.el-slider__runway.is-disabled .el-slider__button:hover { + cursor: not-allowed +} + +.el-slider__input { + flex-shrink: 0; + width: 130px +} + +.el-slider__bar { + background-color: var(--el-slider-main-bg-color); + border-bottom-left-radius: var(--el-slider-border-radius); + border-top-left-radius: var(--el-slider-border-radius); + height: var(--el-slider-height); + position: absolute +} + +.el-slider__button-wrapper { + background-color: transparent; + height: var(--el-slider-button-wrapper-size); + line-height: normal; + outline: none; + position: absolute; + text-align: center; + top: var(--el-slider-button-wrapper-offset); + transform: translate(-50%); + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + width: var(--el-slider-button-wrapper-size); + z-index: 1 +} + +.el-slider__button-wrapper:after { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle +} + +.el-slider__button-wrapper.hover, +.el-slider__button-wrapper:hover { + cursor: grab +} + +.el-slider__button-wrapper.dragging { + cursor: grabbing +} + +.el-slider__button { + background-color: var(--el-color-white); + border: 2px solid var(--el-slider-main-bg-color); + border-radius: 50%; + box-sizing: border-box; + display: inline-block; + height: var(--el-slider-button-size); + transition: var(--el-transition-duration-fast); + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + vertical-align: middle; + width: var(--el-slider-button-size) +} + +.el-slider__button.dragging, +.el-slider__button.hover, +.el-slider__button:hover { + transform: scale(1.2) +} + +.el-slider__button.hover, +.el-slider__button:hover { + cursor: grab +} + +.el-slider__button.dragging { + cursor: grabbing +} + +.el-slider__stop { + background-color: var(--el-slider-stop-bg-color); + border-radius: var(--el-border-radius-circle); + height: var(--el-slider-height); + position: absolute; + transform: translate(-50%); + width: var(--el-slider-height) +} + +.el-slider__marks { + height: 100%; + left: 12px; + top: 0; + width: 18px +} + +.el-slider__marks-text { + color: var(--el-color-info); + font-size: 14px; + margin-top: 15px; + position: absolute; + transform: translate(-50%); + white-space: pre +} + +.el-slider.is-vertical { + display: inline-flex; + flex: 0; + height: 100%; + position: relative; + width: auto +} + +.el-slider.is-vertical .el-slider__runway { + height: 100%; + margin: 0 16px; + width: var(--el-slider-height) +} + +.el-slider.is-vertical .el-slider__bar { + border-radius: 0 0 3px 3px; + height: auto; + width: var(--el-slider-height) +} + +.el-slider.is-vertical .el-slider__button-wrapper { + left: var(--el-slider-button-wrapper-offset); + top: auto; + transform: translateY(50%) +} + +.el-slider.is-vertical .el-slider__stop { + transform: translateY(50%) +} + +.el-slider.is-vertical .el-slider__marks-text { + left: 15px; + margin-top: 0; + transform: translateY(50%) +} + +.el-slider--large { + height: 40px +} + +.el-slider--small { + height: 24px +} + +.el-space { + display: inline-flex; + vertical-align: top +} + +.el-space__item { + display: flex; + flex-wrap: wrap +} + +.el-space__item>* { + flex: 1 +} + +.el-space--vertical { + flex-direction: column +} + +.el-time-spinner { + white-space: nowrap; + width: 100% +} + +.el-spinner { + display: inline-block; + vertical-align: middle +} + +.el-spinner-inner { + animation: rotate 2s linear infinite; + height: 50px; + width: 50px +} + +.el-spinner-inner .path { + stroke: var(--el-border-color-lighter); + stroke-linecap: round; + animation: dash 1.5s ease-in-out infinite +} + +@keyframes rotate { + to { + transform: rotate(1turn) + } +} + +@keyframes dash { + 0% { + stroke-dasharray: 1, 150; + stroke-dashoffset: 0 + } + + 50% { + stroke-dasharray: 90, 150; + stroke-dashoffset: -35 + } + + to { + stroke-dasharray: 90, 150; + stroke-dashoffset: -124 + } +} + +.el-step { + flex-shrink: 1; + position: relative +} + +.el-step:last-of-type .el-step__line { + display: none +} + +.el-step:last-of-type.is-flex { + flex-basis: auto !important; + flex-grow: 0; + flex-shrink: 0 +} + +.el-step:last-of-type .el-step__description, +.el-step:last-of-type .el-step__main { + padding-right: 0 +} + +.el-step__head { + position: relative; + width: 100% +} + +.el-step__head.is-process { + border-color: var(--el-text-color-primary); + color: var(--el-text-color-primary) +} + +.el-step__head.is-wait { + border-color: var(--el-text-color-placeholder); + color: var(--el-text-color-placeholder) +} + +.el-step__head.is-success { + border-color: var(--el-color-success); + color: var(--el-color-success) +} + +.el-step__head.is-error { + border-color: var(--el-color-danger); + color: var(--el-color-danger) +} + +.el-step__head.is-finish { + border-color: var(--el-color-primary); + color: var(--el-color-primary) +} + +.el-step__icon { + align-items: center; + background: var(--el-bg-color); + box-sizing: border-box; + display: inline-flex; + font-size: 14px; + height: 24px; + justify-content: center; + position: relative; + transition: .15s ease-out; + width: 24px; + z-index: 1 +} + +.el-step__icon.is-text { + border: 2px solid; + border-color: inherit; + border-radius: 50% +} + +.el-step__icon.is-icon { + width: 40px +} + +.el-step__icon-inner { + color: inherit; + display: inline-block; + font-weight: 700; + line-height: 1; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-step__icon-inner[class*=el-icon]:not(.is-status) { + font-size: 25px; + font-weight: 400 +} + +.el-step__icon-inner.is-status { + transform: translateY(1px) +} + +.el-step__line { + background-color: var(--el-text-color-placeholder); + border-color: inherit; + position: absolute +} + +.el-step__line-inner { + border: 1px solid; + border-color: inherit; + box-sizing: border-box; + display: block; + height: 0; + transition: .15s ease-out; + width: 0 +} + +.el-step__main { + text-align: left; + white-space: normal +} + +.el-step__title { + font-size: 16px; + line-height: 38px +} + +.el-step__title.is-process { + color: var(--el-text-color-primary); + font-weight: 700 +} + +.el-step__title.is-wait { + color: var(--el-text-color-placeholder) +} + +.el-step__title.is-success { + color: var(--el-color-success) +} + +.el-step__title.is-error { + color: var(--el-color-danger) +} + +.el-step__title.is-finish { + color: var(--el-color-primary) +} + +.el-step__description { + font-size: 12px; + font-weight: 400; + line-height: 20px; + margin-top: -5px; + padding-right: 10% +} + +.el-step__description.is-process { + color: var(--el-text-color-primary) +} + +.el-step__description.is-wait { + color: var(--el-text-color-placeholder) +} + +.el-step__description.is-success { + color: var(--el-color-success) +} + +.el-step__description.is-error { + color: var(--el-color-danger) +} + +.el-step__description.is-finish { + color: var(--el-color-primary) +} + +.el-step.is-horizontal { + display: inline-block +} + +.el-step.is-horizontal .el-step__line { + height: 2px; + left: 0; + right: 0; + top: 11px +} + +.el-step.is-vertical { + display: flex +} + +.el-step.is-vertical .el-step__head { + flex-grow: 0; + width: 24px +} + +.el-step.is-vertical .el-step__main { + flex-grow: 1; + padding-left: 10px +} + +.el-step.is-vertical .el-step__title { + line-height: 24px; + padding-bottom: 8px +} + +.el-step.is-vertical .el-step__line { + bottom: 0; + left: 11px; + top: 0; + width: 2px +} + +.el-step.is-vertical .el-step__icon.is-icon { + width: 24px +} + +.el-step.is-center .el-step__head, +.el-step.is-center .el-step__main { + text-align: center +} + +.el-step.is-center .el-step__description { + padding-left: 20%; + padding-right: 20% +} + +.el-step.is-center .el-step__line { + left: 50%; + right: -50% +} + +.el-step.is-simple { + align-items: center; + display: flex +} + +.el-step.is-simple .el-step__head { + font-size: 0; + padding-right: 10px; + width: auto +} + +.el-step.is-simple .el-step__icon { + background: transparent; + font-size: 12px; + height: 16px; + width: 16px +} + +.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status) { + font-size: 18px +} + +.el-step.is-simple .el-step__icon-inner.is-status { + transform: scale(.8) translateY(1px) +} + +.el-step.is-simple .el-step__main { + align-items: stretch; + display: flex; + flex-grow: 1; + position: relative +} + +.el-step.is-simple .el-step__title { + font-size: 16px; + line-height: 20px +} + +.el-step.is-simple:not(:last-of-type) .el-step__title { + max-width: 50%; + overflow-wrap: break-word +} + +.el-step.is-simple .el-step__arrow { + align-items: center; + display: flex; + flex-grow: 1; + justify-content: center +} + +.el-step.is-simple .el-step__arrow:after, +.el-step.is-simple .el-step__arrow:before { + background: var(--el-text-color-placeholder); + content: ""; + display: inline-block; + height: 15px; + position: absolute; + width: 1px +} + +.el-step.is-simple .el-step__arrow:before { + transform: rotate(-45deg) translateY(-4px); + transform-origin: 0 0 +} + +.el-step.is-simple .el-step__arrow:after { + transform: rotate(45deg) translateY(4px); + transform-origin: 100% 100% +} + +.el-step.is-simple:last-of-type .el-step__arrow { + display: none +} + +.el-steps { + display: flex +} + +.el-steps--simple { + background: var(--el-fill-color-light); + border-radius: 4px; + padding: 13px 8% +} + +.el-steps--horizontal { + white-space: nowrap +} + +.el-steps--vertical { + flex-flow: column; + height: 100% +} + +.el-switch { + --el-switch-on-color: var(--el-color-primary); + --el-switch-off-color: var(--el-border-color); + align-items: center; + display: inline-flex; + font-size: 14px; + height: 32px; + line-height: 20px; + position: relative; + vertical-align: middle +} + +.el-switch.is-disabled .el-switch__core, +.el-switch.is-disabled .el-switch__label { + cursor: not-allowed +} + +.el-switch__label { + color: var(--el-text-color-primary); + cursor: pointer; + display: inline-block; + font-size: 14px; + font-weight: 500; + height: 20px; + transition: var(--el-transition-duration-fast); + vertical-align: middle +} + +.el-switch__label.is-active { + color: var(--el-color-primary) +} + +.el-switch__label--left { + margin-right: 10px +} + +.el-switch__label--right { + margin-left: 10px +} + +.el-switch__label * { + display: inline-block; + font-size: 14px; + line-height: 1 +} + +.el-switch__label .el-icon { + height: inherit +} + +.el-switch__label .el-icon svg { + vertical-align: middle +} + +.el-switch__input { + height: 0; + margin: 0; + opacity: 0; + position: absolute; + width: 0 +} + +.el-switch__input:focus-visible~.el-switch__core { + outline: 2px solid var(--el-switch-on-color); + outline-offset: 1px +} + +.el-switch__core { + align-items: center; + background: var(--el-switch-off-color); + border: 1px solid var(--el-switch-border-color, var(--el-switch-off-color)); + border-radius: 10px; + box-sizing: border-box; + cursor: pointer; + display: inline-flex; + height: 20px; + min-width: 40px; + outline: none; + position: relative; + transition: border-color var(--el-transition-duration), background-color var(--el-transition-duration) +} + +.el-switch__core .el-switch__inner { + align-items: center; + display: flex; + height: 16px; + justify-content: center; + overflow: hidden; + padding: 0 4px 0 18px; + transition: all var(--el-transition-duration); + width: 100% +} + +.el-switch__core .el-switch__inner .is-icon, +.el-switch__core .el-switch__inner .is-text { + color: var(--el-color-white); + font-size: 12px; + overflow: hidden; + text-overflow: ellipsis; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + white-space: nowrap +} + +.el-switch__core .el-switch__action { + align-items: center; + background-color: var(--el-color-white); + border-radius: var(--el-border-radius-circle); + color: var(--el-switch-off-color); + display: flex; + height: 16px; + justify-content: center; + left: 1px; + position: absolute; + transition: all var(--el-transition-duration); + width: 16px +} + +.el-switch.is-checked .el-switch__core { + background-color: var(--el-switch-on-color); + border-color: var(--el-switch-border-color, var(--el-switch-on-color)) +} + +.el-switch.is-checked .el-switch__core .el-switch__action { + color: var(--el-switch-on-color); + left: calc(100% - 17px) +} + +.el-switch.is-checked .el-switch__core .el-switch__inner { + padding: 0 18px 0 4px +} + +.el-switch.is-disabled { + opacity: .6 +} + +.el-switch--wide .el-switch__label.el-switch__label--left span { + left: 10px +} + +.el-switch--wide .el-switch__label.el-switch__label--right span { + right: 10px +} + +.el-switch .label-fade-enter-from, +.el-switch .label-fade-leave-active { + opacity: 0 +} + +.el-switch--large { + font-size: 14px; + height: 40px; + line-height: 24px +} + +.el-switch--large .el-switch__label { + font-size: 14px; + height: 24px +} + +.el-switch--large .el-switch__label * { + font-size: 14px +} + +.el-switch--large .el-switch__core { + border-radius: 12px; + height: 24px; + min-width: 50px +} + +.el-switch--large .el-switch__core .el-switch__inner { + height: 20px; + padding: 0 6px 0 22px +} + +.el-switch--large .el-switch__core .el-switch__action { + height: 20px; + width: 20px +} + +.el-switch--large.is-checked .el-switch__core .el-switch__action { + left: calc(100% - 21px) +} + +.el-switch--large.is-checked .el-switch__core .el-switch__inner { + padding: 0 22px 0 6px +} + +.el-switch--small { + font-size: 12px; + height: 24px; + line-height: 16px +} + +.el-switch--small .el-switch__label { + font-size: 12px; + height: 16px +} + +.el-switch--small .el-switch__label * { + font-size: 12px +} + +.el-switch--small .el-switch__core { + border-radius: 8px; + height: 16px; + min-width: 30px +} + +.el-switch--small .el-switch__core .el-switch__inner { + height: 12px; + padding: 0 2px 0 14px +} + +.el-switch--small .el-switch__core .el-switch__action { + height: 12px; + width: 12px +} + +.el-switch--small.is-checked .el-switch__core .el-switch__action { + left: calc(100% - 13px) +} + +.el-switch--small.is-checked .el-switch__core .el-switch__inner { + padding: 0 14px 0 2px +} + +.el-table-column--selection .cell { + padding-left: 14px; + padding-right: 14px +} + +.el-table-filter { + background-color: #fff; + border: 1px solid var(--el-border-color-lighter); + border-radius: 2px; + box-shadow: var(--el-box-shadow-light); + box-sizing: border-box +} + +.el-table-filter__list { + list-style: none; + margin: 0; + min-width: 100px; + padding: 5px 0 +} + +.el-table-filter__list-item { + cursor: pointer; + font-size: var(--el-font-size-base); + line-height: 36px; + padding: 0 10px +} + +.el-table-filter__list-item:hover { + background-color: var(--el-color-primary-light-9); + color: var(--el-color-primary) +} + +.el-table-filter__list-item.is-active { + background-color: var(--el-color-primary); + color: #fff +} + +.el-table-filter__content { + min-width: 100px +} + +.el-table-filter__bottom { + border-top: 1px solid var(--el-border-color-lighter); + padding: 8px +} + +.el-table-filter__bottom button { + background: transparent; + border: none; + color: var(--el-text-color-regular); + cursor: pointer; + font-size: var(--el-font-size-small); + padding: 0 3px +} + +.el-table-filter__bottom button:hover { + color: var(--el-color-primary) +} + +.el-table-filter__bottom button:focus { + outline: none +} + +.el-table-filter__bottom button.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-table-filter__wrap { + max-height: 280px +} + +.el-table-filter__checkbox-group { + padding: 10px +} + +.el-table-filter__checkbox-group label.el-checkbox { + align-items: center; + display: flex; + height: unset; + margin-bottom: 12px; + margin-left: 5px; + margin-right: 5px +} + +.el-table-filter__checkbox-group .el-checkbox:last-child { + margin-bottom: 0 +} + +.el-table { + --el-table-border-color: var(--el-border-color-lighter); + --el-table-border: 1px solid var(--el-table-border-color); + --el-table-text-color: var(--el-text-color-regular); + --el-table-header-text-color: var(--el-text-color-secondary); + --el-table-row-hover-bg-color: var(--el-fill-color-light); + --el-table-current-row-bg-color: var(--el-color-primary-light-9); + --el-table-header-bg-color: var(--el-bg-color); + --el-table-fixed-box-shadow: var(--el-box-shadow-light); + --el-table-bg-color: var(--el-fill-color-blank); + --el-table-tr-bg-color: var(--el-bg-color); + --el-table-expanded-cell-bg-color: var(--el-fill-color-blank); + --el-table-fixed-left-column: inset 10px 0 10px -10px rgba(0, 0, 0, .15); + --el-table-fixed-right-column: inset -10px 0 10px -10px rgba(0, 0, 0, .15); + --el-table-index: var(--el-index-normal); + background-color: var(--el-table-bg-color); + box-sizing: border-box; + color: var(--el-table-text-color); + font-size: var(--el-font-size-base); + height: -moz-fit-content; + height: fit-content; + max-width: 100%; + overflow: hidden; + position: relative; + width: 100% +} + +.el-table__inner-wrapper { + display: flex; + flex-direction: column; + height: 100%; + position: relative +} + +.el-table__inner-wrapper:before { + bottom: 0; + height: 1px; + left: 0 +} + +.el-table tbody:focus-visible { + outline: none +} + +.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell, +.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell { + border-bottom-color: transparent +} + +.el-table__empty-block { + align-items: center; + display: flex; + justify-content: center; + left: 0; + min-height: 60px; + position: sticky; + text-align: center; + width: 100% +} + +.el-table__empty-text { + color: var(--el-text-color-secondary); + line-height: 60px; + width: 50% +} + +.el-table__expand-column .cell { + padding: 0; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-table__expand-icon { + color: var(--el-text-color-regular); + cursor: pointer; + font-size: 12px; + height: 20px; + position: relative; + transition: transform var(--el-transition-duration-fast) ease-in-out +} + +.el-table__expand-icon--expanded { + transform: rotate(90deg) +} + +.el-table__expand-icon>.el-icon { + font-size: 12px +} + +.el-table__expanded-cell { + background-color: var(--el-table-expanded-cell-bg-color) +} + +.el-table__expanded-cell[class*=cell] { + padding: 20px 50px +} + +.el-table__expanded-cell:hover { + background-color: transparent !important +} + +.el-table__placeholder { + display: inline-block; + width: 20px +} + +.el-table__append-wrapper { + overflow: hidden +} + +.el-table--fit { + border-bottom: 0; + border-right: 0 +} + +.el-table--fit .el-table__cell.gutter { + border-right-width: 1px +} + +.el-table--fit .el-table__inner-wrapper:before { + width: 100% +} + +.el-table thead { + color: var(--el-table-header-text-color) +} + +.el-table thead th { + font-weight: 600 +} + +.el-table thead.is-group th.el-table__cell { + background: var(--el-fill-color-light) +} + +.el-table .el-table__cell { + box-sizing: border-box; + min-width: 0; + padding: 8px 0; + position: relative; + text-align: left; + text-overflow: ellipsis; + vertical-align: middle; + z-index: var(--el-table-index) +} + +.el-table .el-table__cell.is-center { + text-align: center +} + +.el-table .el-table__cell.is-right { + text-align: right +} + +.el-table .el-table__cell.gutter { + border-bottom-width: 0; + border-right-width: 0; + padding: 0; + width: 15px +} + +.el-table .el-table__cell.is-hidden>* { + visibility: hidden +} + +.el-table .cell { + box-sizing: border-box; + line-height: 23px; + overflow: hidden; + overflow-wrap: break-word; + padding: 0 12px; + text-overflow: ellipsis; + white-space: normal +} + +.el-table .cell.el-tooltip { + min-width: 50px; + white-space: nowrap +} + +.el-table--large { + font-size: var(--el-font-size-base) +} + +.el-table--large .el-table__cell { + padding: 12px 0 +} + +.el-table--large .cell { + padding: 0 16px +} + +.el-table--default { + font-size: var(--el-font-size-base) +} + +.el-table--default .el-table__cell { + padding: 8px 0 +} + +.el-table--default .cell { + padding: 0 12px +} + +.el-table--small { + font-size: var(--el-font-size-extra-small) +} + +.el-table--small .el-table__cell { + padding: 4px 0 +} + +.el-table--small .cell { + padding: 0 8px +} + +.el-table tr { + background-color: var(--el-table-tr-bg-color) +} + +.el-table tr input[type=checkbox] { + margin: 0 +} + +.el-table td.el-table__cell, +.el-table th.el-table__cell.is-leaf { + border-bottom: var(--el-table-border) +} + +.el-table th.el-table__cell.is-sortable { + cursor: pointer +} + +.el-table th.el-table__cell { + background-color: var(--el-table-header-bg-color) +} + +.el-table th.el-table__cell>.cell.highlight { + color: var(--el-color-primary) +} + +.el-table th.el-table__cell.required>div:before { + background: #ff4d51; + border-radius: 50%; + content: ""; + display: inline-block; + height: 8px; + margin-right: 5px; + vertical-align: middle; + width: 8px +} + +.el-table td.el-table__cell div { + box-sizing: border-box +} + +.el-table td.el-table__cell.gutter { + width: 0 +} + +.el-table--border .el-table__inner-wrapper:after, +.el-table--border:after, +.el-table--border:before, +.el-table__inner-wrapper:before { + background-color: var(--el-table-border-color); + content: ""; + position: absolute; + z-index: calc(var(--el-table-index) + 2) +} + +.el-table--border .el-table__inner-wrapper:after { + height: 1px; + left: 0; + top: 0; + width: 100%; + z-index: calc(var(--el-table-index) + 2) +} + +.el-table--border:before { + height: 100%; + left: 0; + top: -1px; + width: 1px +} + +.el-table--border:after { + height: 100%; + right: 0; + top: -1px; + width: 1px +} + +.el-table--border .el-table__inner-wrapper { + border-bottom: none; + border-right: none +} + +.el-table--border .el-table__footer-wrapper { + flex-shrink: 0; + position: relative +} + +.el-table--border .el-table__cell { + border-right: var(--el-table-border) +} + +.el-table--border th.el-table__cell.gutter:last-of-type { + border-bottom: var(--el-table-border); + border-bottom-width: 1px +} + +.el-table--border th.el-table__cell { + border-bottom: var(--el-table-border) +} + +.el-table--hidden { + visibility: hidden +} + +.el-table__body-wrapper, +.el-table__footer-wrapper, +.el-table__header-wrapper { + width: 100% +} + +.el-table__body-wrapper tr td.el-table-fixed-column--left, +.el-table__body-wrapper tr td.el-table-fixed-column--right, +.el-table__body-wrapper tr th.el-table-fixed-column--left, +.el-table__body-wrapper tr th.el-table-fixed-column--right, +.el-table__footer-wrapper tr td.el-table-fixed-column--left, +.el-table__footer-wrapper tr td.el-table-fixed-column--right, +.el-table__footer-wrapper tr th.el-table-fixed-column--left, +.el-table__footer-wrapper tr th.el-table-fixed-column--right, +.el-table__header-wrapper tr td.el-table-fixed-column--left, +.el-table__header-wrapper tr td.el-table-fixed-column--right, +.el-table__header-wrapper tr th.el-table-fixed-column--left, +.el-table__header-wrapper tr th.el-table-fixed-column--right { + background: inherit; + position: sticky !important; + z-index: calc(var(--el-table-index) + 1) +} + +.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before, +.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before, +.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before, +.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before { + bottom: -1px; + box-shadow: none; + content: ""; + overflow-x: hidden; + overflow-y: hidden; + pointer-events: none; + position: absolute; + top: 0; + touch-action: none; + width: 10px +} + +.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before, +.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before { + left: -10px +} + +.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before, +.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before, +.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before, +.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before, +.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before, +.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before, +.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before { + box-shadow: none; + right: -10px +} + +.el-table__body-wrapper tr td.el-table__fixed-right-patch, +.el-table__body-wrapper tr th.el-table__fixed-right-patch, +.el-table__footer-wrapper tr td.el-table__fixed-right-patch, +.el-table__footer-wrapper tr th.el-table__fixed-right-patch, +.el-table__header-wrapper tr td.el-table__fixed-right-patch, +.el-table__header-wrapper tr th.el-table__fixed-right-patch { + background: #fff; + position: sticky !important; + right: 0; + z-index: calc(var(--el-table-index) + 1) +} + +.el-table__header-wrapper { + flex-shrink: 0 +} + +.el-table__header-wrapper tr th.el-table-fixed-column--left, +.el-table__header-wrapper tr th.el-table-fixed-column--right { + background-color: var(--el-table-header-bg-color) +} + +.el-table__body, +.el-table__footer, +.el-table__header { + border-collapse: separate; + table-layout: fixed +} + +.el-table__header-wrapper { + overflow: hidden +} + +.el-table__header-wrapper tbody td.el-table__cell { + background-color: var(--el-table-row-hover-bg-color); + color: var(--el-table-text-color) +} + +.el-table__footer-wrapper { + flex-shrink: 0; + overflow: hidden +} + +.el-table__footer-wrapper tfoot td.el-table__cell { + background-color: var(--el-table-row-hover-bg-color); + color: var(--el-table-text-color) +} + +.el-table__body-wrapper .el-table-column--selection>.cell, +.el-table__header-wrapper .el-table-column--selection>.cell { + align-items: center; + display: inline-flex; + height: 23px +} + +.el-table__body-wrapper .el-table-column--selection .el-checkbox, +.el-table__header-wrapper .el-table-column--selection .el-checkbox { + height: unset +} + +.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before { + box-shadow: var(--el-table-fixed-right-column) +} + +.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell { + border-right: var(--el-table-border) +} + +.el-table.is-scrolling-left th.el-table-fixed-column--left { + background-color: var(--el-table-header-bg-color) +} + +.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before { + box-shadow: var(--el-table-fixed-left-column) +} + +.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell { + border-right: none +} + +.el-table.is-scrolling-right th.el-table-fixed-column--right { + background-color: var(--el-table-header-bg-color) +} + +.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell { + border-right: none +} + +.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before { + box-shadow: var(--el-table-fixed-right-column) +} + +.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before { + box-shadow: var(--el-table-fixed-left-column) +} + +.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before, +.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before, +.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before, +.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before { + box-shadow: none +} + +.el-table.is-scrolling-none th.el-table-fixed-column--left, +.el-table.is-scrolling-none th.el-table-fixed-column--right { + background-color: var(--el-table-header-bg-color) +} + +.el-table__body-wrapper { + flex: 1; + overflow: hidden; + position: relative +} + +.el-table__body-wrapper .el-scrollbar__bar { + z-index: calc(var(--el-table-index) + 2) +} + +.el-table .caret-wrapper { + align-items: center; + cursor: pointer; + display: inline-flex; + flex-direction: column; + height: 14px; + overflow: initial; + position: relative; + vertical-align: middle; + width: 24px +} + +.el-table .sort-caret { + border: 5px solid transparent; + height: 0; + left: 7px; + position: absolute; + width: 0 +} + +.el-table .sort-caret.ascending { + border-bottom-color: var(--el-text-color-placeholder); + top: -5px +} + +.el-table .sort-caret.descending { + border-top-color: var(--el-text-color-placeholder); + bottom: -3px +} + +.el-table .ascending .sort-caret.ascending { + border-bottom-color: var(--el-color-primary) +} + +.el-table .descending .sort-caret.descending { + border-top-color: var(--el-color-primary) +} + +.el-table .hidden-columns { + position: absolute; + visibility: hidden; + z-index: -1 +} + +.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell { + background: var(--el-fill-color-lighter) +} + +.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell { + background-color: var(--el-table-current-row-bg-color) +} + +.el-table__body tr.hover-row.current-row>td.el-table__cell, +.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell, +.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell, +.el-table__body tr.hover-row>td.el-table__cell, +.el-table__body tr>td.hover-cell { + background-color: var(--el-table-row-hover-bg-color) +} + +.el-table__body tr.current-row>td.el-table__cell { + background-color: var(--el-table-current-row-bg-color) +} + +.el-table.el-table--scrollable-y .el-table__body-header { + position: sticky; + top: 0; + z-index: calc(var(--el-table-index) + 2) +} + +.el-table.el-table--scrollable-y .el-table__body-footer { + bottom: 0; + position: sticky; + z-index: calc(var(--el-table-index) + 2) +} + +.el-table__column-resize-proxy { + border-left: var(--el-table-border); + bottom: 0; + left: 200px; + position: absolute; + top: 0; + width: 0; + z-index: calc(var(--el-table-index) + 9) +} + +.el-table__column-filter-trigger { + cursor: pointer; + display: inline-block +} + +.el-table__column-filter-trigger i { + color: var(--el-color-info); + font-size: 14px; + vertical-align: middle +} + +.el-table__border-left-patch { + height: 100%; + top: 0; + width: 1px +} + +.el-table__border-bottom-patch, +.el-table__border-left-patch { + background-color: var(--el-table-border-color); + left: 0; + position: absolute; + z-index: calc(var(--el-table-index) + 2) +} + +.el-table__border-bottom-patch { + height: 1px +} + +.el-table__border-right-patch { + background-color: var(--el-table-border-color); + height: 100%; + position: absolute; + top: 0; + width: 1px; + z-index: calc(var(--el-table-index) + 2) +} + +.el-table--enable-row-transition .el-table__body td.el-table__cell { + transition: background-color .25s ease +} + +.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell { + background-color: var(--el-table-row-hover-bg-color) +} + +.el-table [class*=el-table__row--level] .el-table__expand-icon { + display: inline-block; + height: 12px; + line-height: 12px; + margin-right: 8px; + text-align: center; + width: 12px +} + +.el-table .el-table.el-table--border .el-table__cell { + border-right: var(--el-table-border) +} + +.el-table:not(.el-table--border) .el-table__cell { + border-right: none +} + +.el-table:not(.el-table--border)>.el-table__inner-wrapper:after { + content: none +} + +.el-table-v2 { + --el-table-border-color: var(--el-border-color-lighter); + --el-table-border: 1px solid var(--el-table-border-color); + --el-table-text-color: var(--el-text-color-regular); + --el-table-header-text-color: var(--el-text-color-secondary); + --el-table-row-hover-bg-color: var(--el-fill-color-light); + --el-table-current-row-bg-color: var(--el-color-primary-light-9); + --el-table-header-bg-color: var(--el-bg-color); + --el-table-fixed-box-shadow: var(--el-box-shadow-light); + --el-table-bg-color: var(--el-fill-color-blank); + --el-table-tr-bg-color: var(--el-bg-color); + --el-table-expanded-cell-bg-color: var(--el-fill-color-blank); + --el-table-fixed-left-column: inset 10px 0 10px -10px rgba(0, 0, 0, .15); + --el-table-fixed-right-column: inset -10px 0 10px -10px rgba(0, 0, 0, .15); + --el-table-index: var(--el-index-normal); + font-size: var(--el-font-size-base) +} + +.el-table-v2 * { + box-sizing: border-box +} + +.el-table-v2__root { + position: relative +} + +.el-table-v2__root:hover .el-table-v2__main .el-virtual-scrollbar { + opacity: 1 +} + +.el-table-v2__main { + background-color: var(--el-bg-color); + display: flex; + flex-direction: column-reverse; + left: 0; + overflow: hidden; + position: absolute; + top: 0 +} + +.el-table-v2__main .el-vl__horizontal, +.el-table-v2__main .el-vl__vertical { + z-index: 2 +} + +.el-table-v2__left { + background-color: var(--el-bg-color); + box-shadow: 2px 0 4px #0000000f; + display: flex; + flex-direction: column-reverse; + left: 0; + overflow: hidden; + position: absolute; + top: 0 +} + +.el-table-v2__left .el-virtual-scrollbar { + opacity: 0 +} + +.el-table-v2__left .el-vl__horizontal, +.el-table-v2__left .el-vl__vertical { + z-index: -1 +} + +.el-table-v2__right { + background-color: var(--el-bg-color); + box-shadow: -2px 0 4px #0000000f; + display: flex; + flex-direction: column-reverse; + overflow: hidden; + position: absolute; + right: 0; + top: 0 +} + +.el-table-v2__right .el-virtual-scrollbar { + opacity: 0 +} + +.el-table-v2__right .el-vl__horizontal, +.el-table-v2__right .el-vl__vertical { + z-index: -1 +} + +.el-table-v2__header-row, +.el-table-v2__row { + padding-inline-end: var(--el-table-scrollbar-size) +} + +.el-table-v2__header-wrapper { + overflow: hidden +} + +.el-table-v2__header { + overflow: hidden; + position: relative +} + +.el-table-v2__header .el-checkbox { + z-index: 0 +} + +.el-table-v2__footer { + bottom: 0; + overflow: hidden; + right: 0 +} + +.el-table-v2__empty, +.el-table-v2__footer, +.el-table-v2__overlay { + left: 0; + position: absolute +} + +.el-table-v2__overlay { + bottom: 0; + right: 0; + top: 0; + z-index: 9999 +} + +.el-table-v2__header-row { + border-bottom: var(--el-table-border); + display: flex +} + +.el-table-v2__header-cell { + align-items: center; + background-color: var(--el-table-header-bg-color); + color: var(--el-table-header-text-color); + display: flex; + font-weight: 700; + height: 100%; + overflow: hidden; + padding: 0 8px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-table-v2__header-cell.is-align-center { + justify-content: center; + text-align: center +} + +.el-table-v2__header-cell.is-align-right { + justify-content: flex-end; + text-align: right +} + +.el-table-v2__header-cell.is-sortable { + cursor: pointer +} + +.el-table-v2__header-cell:hover .el-icon { + display: block +} + +.el-table-v2__sort-icon { + display: none; + opacity: .6; + transition: opacity, display var(--el-transition-duration) +} + +.el-table-v2__sort-icon.is-sorting { + display: block; + opacity: 1 +} + +.el-table-v2__row { + align-items: center; + border-bottom: var(--el-table-border); + display: flex; + transition: background-color var(--el-transition-duration) +} + +.el-table-v2__row.is-hovered, +.el-table-v2__row:hover { + background-color: var(--el-table-row-hover-bg-color) +} + +.el-table-v2__row-cell { + align-items: center; + display: flex; + height: 100%; + overflow: hidden; + padding: 0 8px +} + +.el-table-v2__row-cell.is-align-center { + justify-content: center; + text-align: center +} + +.el-table-v2__row-cell.is-align-right { + justify-content: flex-end; + text-align: right +} + +.el-table-v2__expand-icon { + cursor: pointer; + margin: 0 4px; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none +} + +.el-table-v2__expand-icon svg { + transition: transform var(--el-transition-duration) +} + +.el-table-v2__expand-icon.is-expanded svg { + transform: rotate(90deg) +} + +.el-table-v2:not(.is-dynamic) .el-table-v2__cell-text { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-table-v2.is-dynamic .el-table-v2__row { + align-items: stretch; + overflow: hidden +} + +.el-table-v2.is-dynamic .el-table-v2__row .el-table-v2__row-cell { + overflow-wrap: break-word +} + +.el-tabs { + --el-tabs-header-height: 40px; + display: flex +} + +.el-tabs__header { + align-items: center; + display: flex; + justify-content: space-between; + margin: 0 0 15px; + padding: 0; + position: relative +} + +.el-tabs__header-vertical { + flex-direction: column +} + +.el-tabs__active-bar { + background-color: var(--el-color-primary); + bottom: 0; + height: 2px; + left: 0; + list-style: none; + position: absolute; + transition: width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier), transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier); + z-index: 1 +} + +.el-tabs__new-tab { + align-items: center; + border: 1px solid var(--el-border-color); + border-radius: 3px; + color: var(--el-text-color-primary); + cursor: pointer; + display: flex; + font-size: 12px; + height: 20px; + justify-content: center; + line-height: 20px; + margin: 10px 0 10px 10px; + text-align: center; + transition: all .15s; + width: 20px +} + +.el-tabs__new-tab .is-icon-plus { + height: inherit; + transform: scale(.8); + width: inherit +} + +.el-tabs__new-tab .is-icon-plus svg { + vertical-align: middle +} + +.el-tabs__new-tab:hover { + color: var(--el-color-primary) +} + +.el-tabs__new-tab-vertical { + margin-left: 0 +} + +.el-tabs__nav-wrap { + flex: 1 auto; + margin-bottom: -1px; + overflow: hidden; + position: relative +} + +.el-tabs__nav-wrap:after { + background-color: var(--el-border-color-light); + bottom: 0; + content: ""; + height: 2px; + left: 0; + position: absolute; + width: 100%; + z-index: var(--el-index-normal) +} + +.el-tabs__nav-wrap.is-scrollable { + box-sizing: border-box; + padding: 0 20px +} + +.el-tabs__nav-scroll { + overflow: hidden +} + +.el-tabs__nav-next, +.el-tabs__nav-prev { + color: var(--el-text-color-secondary); + cursor: pointer; + font-size: 12px; + line-height: 44px; + position: absolute; + text-align: center; + width: 20px +} + +.el-tabs__nav-next { + right: 0 +} + +.el-tabs__nav-prev { + left: 0 +} + +.el-tabs__nav { + display: flex; + float: left; + position: relative; + transition: transform var(--el-transition-duration); + white-space: nowrap; + z-index: calc(var(--el-index-normal) + 1) +} + +.el-tabs__nav.is-stretch { + display: flex; + min-width: 100% +} + +.el-tabs__nav.is-stretch>* { + flex: 1; + text-align: center +} + +.el-tabs__item { + align-items: center; + box-sizing: border-box; + color: var(--el-text-color-primary); + display: flex; + font-size: var(--el-font-size-base); + font-weight: 500; + height: var(--el-tabs-header-height); + justify-content: center; + list-style: none; + padding: 0 20px; + position: relative +} + +.el-tabs__item:focus, +.el-tabs__item:focus:active { + outline: none +} + +.el-tabs__item:focus-visible { + border-radius: 3px; + box-shadow: 0 0 2px 2px var(--el-color-primary) inset +} + +.el-tabs__item .is-icon-close { + border-radius: 50%; + margin-left: 5px; + text-align: center; + transition: all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier) +} + +.el-tabs__item .is-icon-close:before { + display: inline-block; + transform: scale(.9) +} + +.el-tabs__item .is-icon-close:hover { + background-color: var(--el-text-color-placeholder); + color: #fff +} + +.el-tabs__item.is-active, +.el-tabs__item:hover { + color: var(--el-color-primary) +} + +.el-tabs__item:hover { + cursor: pointer +} + +.el-tabs__item.is-disabled { + color: var(--el-disabled-text-color); + cursor: not-allowed +} + +.el-tabs__content { + flex-grow: 1; + overflow: hidden; + position: relative +} + +.el-tabs--bottom>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--top>.el-tabs__header .el-tabs__item:nth-child(2) { + padding-left: 0 +} + +.el-tabs--bottom>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--top>.el-tabs__header .el-tabs__item:last-child { + padding-right: 0 +} + +.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2), +.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2) { + padding-left: 20px +} + +.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child, +.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child { + padding-right: 20px +} + +.el-tabs--card>.el-tabs__header { + border-bottom: 1px solid var(--el-border-color-light); + height: var(--el-tabs-header-height) +} + +.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after { + content: none +} + +.el-tabs--card>.el-tabs__header .el-tabs__nav { + border: 1px solid var(--el-border-color-light); + border-bottom: none; + border-radius: 4px 4px 0 0; + box-sizing: border-box +} + +.el-tabs--card>.el-tabs__header .el-tabs__active-bar { + display: none +} + +.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close { + font-size: 12px; + height: 14px; + overflow: hidden; + position: relative; + right: -2px; + transform-origin: 100% 50%; + width: 0 +} + +.el-tabs--card>.el-tabs__header .el-tabs__item { + border-bottom: 1px solid transparent; + border-left: 1px solid var(--el-border-color-light); + transition: color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier), padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier) +} + +.el-tabs--card>.el-tabs__header .el-tabs__item:first-child { + border-left: none +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover { + padding-left: 13px; + padding-right: 13px +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close { + width: 14px +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-active { + border-bottom-color: var(--el-bg-color) +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable { + padding-left: 20px; + padding-right: 20px +} + +.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close { + width: 14px +} + +.el-tabs--border-card { + background: var(--el-bg-color-overlay); + border: 1px solid var(--el-border-color) +} + +.el-tabs--border-card>.el-tabs__content { + padding: 15px +} + +.el-tabs--border-card>.el-tabs__header { + background-color: var(--el-fill-color-light); + border-bottom: 1px solid var(--el-border-color-light); + margin: 0 +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after { + content: none +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item { + border: 1px solid transparent; + color: var(--el-text-color-secondary); + margin-top: -1px; + transition: all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier) +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item, +.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child { + margin-left: -1px +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active { + background-color: var(--el-bg-color-overlay); + border-left-color: var(--el-border-color); + border-right-color: var(--el-border-color); + color: var(--el-color-primary) +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover { + color: var(--el-color-primary) +} + +.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled { + color: var(--el-disabled-text-color) +} + +.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child { + margin-left: 0 +} + +.el-tabs--bottom { + flex-direction: column +} + +.el-tabs--bottom .el-tabs__header.is-bottom { + margin-bottom: 0; + margin-top: 10px +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom { + border-bottom: 0; + border-top: 1px solid var(--el-border-color) +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom { + margin-bottom: 0; + margin-top: -1px +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active) { + border: 1px solid transparent +} + +.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom { + margin: 0 -1px -1px +} + +.el-tabs--left, +.el-tabs--right { + overflow: hidden +} + +.el-tabs--left .el-tabs__header.is-left, +.el-tabs--left .el-tabs__header.is-right, +.el-tabs--left .el-tabs__nav-scroll, +.el-tabs--left .el-tabs__nav-wrap.is-left, +.el-tabs--left .el-tabs__nav-wrap.is-right, +.el-tabs--right .el-tabs__header.is-left, +.el-tabs--right .el-tabs__header.is-right, +.el-tabs--right .el-tabs__nav-scroll, +.el-tabs--right .el-tabs__nav-wrap.is-left, +.el-tabs--right .el-tabs__nav-wrap.is-right { + height: 100% +} + +.el-tabs--left .el-tabs__active-bar.is-left, +.el-tabs--left .el-tabs__active-bar.is-right, +.el-tabs--right .el-tabs__active-bar.is-left, +.el-tabs--right .el-tabs__active-bar.is-right { + bottom: auto; + height: auto; + top: 0; + width: 2px +} + +.el-tabs--left .el-tabs__nav-wrap.is-left, +.el-tabs--left .el-tabs__nav-wrap.is-right, +.el-tabs--right .el-tabs__nav-wrap.is-left, +.el-tabs--right .el-tabs__nav-wrap.is-right { + margin-bottom: 0 +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev { + cursor: pointer; + height: 30px; + line-height: 30px; + text-align: center; + width: 100% +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i, +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i { + transform: rotate(90deg) +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev { + left: auto; + top: 0 +} + +.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next, +.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next { + bottom: 0; + right: auto +} + +.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable, +.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable, +.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable, +.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable { + padding: 30px 0 +} + +.el-tabs--left .el-tabs__nav-wrap.is-left:after, +.el-tabs--left .el-tabs__nav-wrap.is-right:after, +.el-tabs--right .el-tabs__nav-wrap.is-left:after, +.el-tabs--right .el-tabs__nav-wrap.is-right:after { + bottom: auto; + height: 100%; + top: 0; + width: 2px +} + +.el-tabs--left .el-tabs__nav.is-left, +.el-tabs--left .el-tabs__nav.is-right, +.el-tabs--right .el-tabs__nav.is-left, +.el-tabs--right .el-tabs__nav.is-right { + flex-direction: column +} + +.el-tabs--left .el-tabs__item.is-left, +.el-tabs--right .el-tabs__item.is-left { + justify-content: flex-end +} + +.el-tabs--left .el-tabs__item.is-right, +.el-tabs--right .el-tabs__item.is-right { + justify-content: flex-start +} + +.el-tabs--left { + flex-direction: row-reverse +} + +.el-tabs--left .el-tabs__header.is-left { + margin-bottom: 0; + margin-right: 10px +} + +.el-tabs--left .el-tabs__nav-wrap.is-left { + margin-right: -1px +} + +.el-tabs--left .el-tabs__active-bar.is-left, +.el-tabs--left .el-tabs__nav-wrap.is-left:after { + left: auto; + right: 0 +} + +.el-tabs--left .el-tabs__item.is-left { + text-align: right +} + +.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left { + display: none +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left { + border-bottom: none; + border-left: none; + border-right: 1px solid var(--el-border-color-light); + border-top: 1px solid var(--el-border-color-light); + text-align: left +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child { + border-right: 1px solid var(--el-border-color-light); + border-top: none +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active { + border: 1px solid var(--el-border-color-light); + border-bottom: none; + border-left: none; + border-right: 1px solid #fff +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child { + border-top: none +} + +.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child { + border-bottom: none +} + +.el-tabs--left.el-tabs--card .el-tabs__nav { + border-bottom: 1px solid var(--el-border-color-light); + border-radius: 4px 0 0 4px; + border-right: none +} + +.el-tabs--left.el-tabs--card .el-tabs__new-tab { + float: none +} + +.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left { + border-right: 1px solid var(--el-border-color) +} + +.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left { + border: 1px solid transparent; + margin: -1px 0 -1px -1px +} + +.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active { + border-color: rgb(209, 219, 229) transparent +} + +.el-tabs--right .el-tabs__header.is-right { + margin-bottom: 0; + margin-left: 10px +} + +.el-tabs--right .el-tabs__nav-wrap.is-right { + margin-left: -1px +} + +.el-tabs--right .el-tabs__nav-wrap.is-right:after { + left: 0; + right: auto +} + +.el-tabs--right .el-tabs__active-bar.is-right { + left: 0 +} + +.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right { + display: none +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right { + border-bottom: none; + border-top: 1px solid var(--el-border-color-light) +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child { + border-left: 1px solid var(--el-border-color-light); + border-top: none +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active { + border: 1px solid var(--el-border-color-light); + border-bottom: none; + border-left: 1px solid #fff; + border-right: none +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child { + border-top: none +} + +.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child { + border-bottom: none +} + +.el-tabs--right.el-tabs--card .el-tabs__nav { + border-bottom: 1px solid var(--el-border-color-light); + border-left: none; + border-radius: 0 4px 4px 0 +} + +.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right { + border-left: 1px solid var(--el-border-color) +} + +.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right { + border: 1px solid transparent; + margin: -1px -1px -1px 0 +} + +.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active { + border-color: rgb(209, 219, 229) transparent +} + +.el-tabs--top { + flex-direction: column-reverse +} + +.slideInLeft-transition, +.slideInRight-transition { + display: inline-block +} + +.slideInRight-enter { + animation: slideInRight-enter var(--el-transition-duration) +} + +.slideInRight-leave { + animation: slideInRight-leave var(--el-transition-duration); + left: 0; + position: absolute; + right: 0 +} + +.slideInLeft-enter { + animation: slideInLeft-enter var(--el-transition-duration) +} + +.slideInLeft-leave { + animation: slideInLeft-leave var(--el-transition-duration); + left: 0; + position: absolute; + right: 0 +} + +@keyframes slideInRight-enter { + 0% { + opacity: 0; + transform: translate(100%); + transform-origin: 0 0 + } + + to { + opacity: 1; + transform: translate(0); + transform-origin: 0 0 + } +} + +@keyframes slideInRight-leave { + 0% { + opacity: 1; + transform: translate(0); + transform-origin: 0 0 + } + + to { + opacity: 0; + transform: translate(100%); + transform-origin: 0 0 + } +} + +@keyframes slideInLeft-enter { + 0% { + opacity: 0; + transform: translate(-100%); + transform-origin: 0 0 + } + + to { + opacity: 1; + transform: translate(0); + transform-origin: 0 0 + } +} + +@keyframes slideInLeft-leave { + 0% { + opacity: 1; + transform: translate(0); + transform-origin: 0 0 + } + + to { + opacity: 0; + transform: translate(-100%); + transform-origin: 0 0 + } +} + +.el-tag { + --el-tag-font-size: 12px; + --el-tag-border-radius: 4px; + --el-tag-border-radius-rounded: 9999px; + align-items: center; + background-color: var(--el-tag-bg-color); + border-color: var(--el-tag-border-color); + border-radius: var(--el-tag-border-radius); + border-style: solid; + border-width: 1px; + box-sizing: border-box; + color: var(--el-tag-text-color); + display: inline-flex; + font-size: var(--el-tag-font-size); + height: 24px; + justify-content: center; + line-height: 1; + padding: 0 9px; + vertical-align: middle; + white-space: nowrap; + --el-icon-size: 14px +} + +.el-tag, +.el-tag.el-tag--primary { + --el-tag-bg-color: var(--el-color-primary-light-9); + --el-tag-border-color: var(--el-color-primary-light-8); + --el-tag-hover-color: var(--el-color-primary) +} + +.el-tag.el-tag--success { + --el-tag-bg-color: var(--el-color-success-light-9); + --el-tag-border-color: var(--el-color-success-light-8); + --el-tag-hover-color: var(--el-color-success) +} + +.el-tag.el-tag--warning { + --el-tag-bg-color: var(--el-color-warning-light-9); + --el-tag-border-color: var(--el-color-warning-light-8); + --el-tag-hover-color: var(--el-color-warning) +} + +.el-tag.el-tag--danger { + --el-tag-bg-color: var(--el-color-danger-light-9); + --el-tag-border-color: var(--el-color-danger-light-8); + --el-tag-hover-color: var(--el-color-danger) +} + +.el-tag.el-tag--error { + --el-tag-bg-color: var(--el-color-error-light-9); + --el-tag-border-color: var(--el-color-error-light-8); + --el-tag-hover-color: var(--el-color-error) +} + +.el-tag.el-tag--info { + --el-tag-bg-color: var(--el-color-info-light-9); + --el-tag-border-color: var(--el-color-info-light-8); + --el-tag-hover-color: var(--el-color-info) +} + +.el-tag.is-hit { + border-color: var(--el-color-primary) +} + +.el-tag.is-round { + border-radius: var(--el-tag-border-radius-rounded) +} + +.el-tag .el-tag__close { + color: var(--el-tag-text-color); + flex-shrink: 0 +} + +.el-tag .el-tag__close:hover { + background-color: var(--el-tag-hover-color); + color: var(--el-color-white) +} + +.el-tag.el-tag--primary { + --el-tag-text-color: var(--el-color-primary) +} + +.el-tag.el-tag--success { + --el-tag-text-color: var(--el-color-success) +} + +.el-tag.el-tag--warning { + --el-tag-text-color: var(--el-color-warning) +} + +.el-tag.el-tag--danger { + --el-tag-text-color: var(--el-color-danger) +} + +.el-tag.el-tag--error { + --el-tag-text-color: var(--el-color-error) +} + +.el-tag.el-tag--info { + --el-tag-text-color: var(--el-color-info) +} + +.el-tag .el-icon { + border-radius: 50%; + cursor: pointer; + font-size: calc(var(--el-icon-size) - 2px); + height: var(--el-icon-size); + width: var(--el-icon-size) +} + +.el-tag .el-tag__close { + margin-left: 6px +} + +.el-tag--dark { + --el-tag-text-color: var(--el-color-white) +} + +.el-tag--dark, +.el-tag--dark.el-tag--primary { + --el-tag-bg-color: var(--el-color-primary); + --el-tag-border-color: var(--el-color-primary); + --el-tag-hover-color: var(--el-color-primary-light-3) +} + +.el-tag--dark.el-tag--success { + --el-tag-bg-color: var(--el-color-success); + --el-tag-border-color: var(--el-color-success); + --el-tag-hover-color: var(--el-color-success-light-3) +} + +.el-tag--dark.el-tag--warning { + --el-tag-bg-color: var(--el-color-warning); + --el-tag-border-color: var(--el-color-warning); + --el-tag-hover-color: var(--el-color-warning-light-3) +} + +.el-tag--dark.el-tag--danger { + --el-tag-bg-color: var(--el-color-danger); + --el-tag-border-color: var(--el-color-danger); + --el-tag-hover-color: var(--el-color-danger-light-3) +} + +.el-tag--dark.el-tag--error { + --el-tag-bg-color: var(--el-color-error); + --el-tag-border-color: var(--el-color-error); + --el-tag-hover-color: var(--el-color-error-light-3) +} + +.el-tag--dark.el-tag--info { + --el-tag-bg-color: var(--el-color-info); + --el-tag-border-color: var(--el-color-info); + --el-tag-hover-color: var(--el-color-info-light-3) +} + +.el-tag--dark.el-tag--danger, +.el-tag--dark.el-tag--error, +.el-tag--dark.el-tag--info, +.el-tag--dark.el-tag--primary, +.el-tag--dark.el-tag--success, +.el-tag--dark.el-tag--warning { + --el-tag-text-color: var(--el-color-white) +} + +.el-tag--plain, +.el-tag--plain.el-tag--primary { + --el-tag-bg-color: var(--el-fill-color-blank); + --el-tag-border-color: var(--el-color-primary-light-5); + --el-tag-hover-color: var(--el-color-primary) +} + +.el-tag--plain.el-tag--success { + --el-tag-bg-color: var(--el-fill-color-blank); + --el-tag-border-color: var(--el-color-success-light-5); + --el-tag-hover-color: var(--el-color-success) +} + +.el-tag--plain.el-tag--warning { + --el-tag-bg-color: var(--el-fill-color-blank); + --el-tag-border-color: var(--el-color-warning-light-5); + --el-tag-hover-color: var(--el-color-warning) +} + +.el-tag--plain.el-tag--danger { + --el-tag-bg-color: var(--el-fill-color-blank); + --el-tag-border-color: var(--el-color-danger-light-5); + --el-tag-hover-color: var(--el-color-danger) +} + +.el-tag--plain.el-tag--error { + --el-tag-bg-color: var(--el-fill-color-blank); + --el-tag-border-color: var(--el-color-error-light-5); + --el-tag-hover-color: var(--el-color-error) +} + +.el-tag--plain.el-tag--info { + --el-tag-bg-color: var(--el-fill-color-blank); + --el-tag-border-color: var(--el-color-info-light-5); + --el-tag-hover-color: var(--el-color-info) +} + +.el-tag.is-closable { + padding-right: 5px +} + +.el-tag--large { + height: 32px; + padding: 0 11px; + --el-icon-size: 16px +} + +.el-tag--large .el-tag__close { + margin-left: 8px +} + +.el-tag--large.is-closable { + padding-right: 7px +} + +.el-tag--small { + height: 20px; + padding: 0 7px; + --el-icon-size: 12px +} + +.el-tag--small .el-tag__close { + margin-left: 4px +} + +.el-tag--small.is-closable { + padding-right: 3px +} + +.el-tag--small .el-icon-close { + transform: scale(.8) +} + +.el-tag.el-tag--primary.is-hit { + border-color: var(--el-color-primary) +} + +.el-tag.el-tag--success.is-hit { + border-color: var(--el-color-success) +} + +.el-tag.el-tag--warning.is-hit { + border-color: var(--el-color-warning) +} + +.el-tag.el-tag--danger.is-hit { + border-color: var(--el-color-danger) +} + +.el-tag.el-tag--error.is-hit { + border-color: var(--el-color-error) +} + +.el-tag.el-tag--info.is-hit { + border-color: var(--el-color-info) +} + +.el-text { + --el-text-font-size: var(--el-font-size-base); + --el-text-color: var(--el-text-color-regular); + align-self: center; + color: var(--el-text-color); + font-size: var(--el-text-font-size); + margin: 0; + overflow-wrap: break-word; + padding: 0 +} + +.el-text.is-truncated { + display: inline-block; + max-width: 100%; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-text.is-line-clamp { + display: -webkit-inline-box; + -webkit-box-orient: vertical; + overflow: hidden +} + +.el-text--large { + --el-text-font-size: var(--el-font-size-medium) +} + +.el-text--default { + --el-text-font-size: var(--el-font-size-base) +} + +.el-text--small { + --el-text-font-size: var(--el-font-size-extra-small) +} + +.el-text.el-text--primary { + --el-text-color: var(--el-color-primary) +} + +.el-text.el-text--success { + --el-text-color: var(--el-color-success) +} + +.el-text.el-text--warning { + --el-text-color: var(--el-color-warning) +} + +.el-text.el-text--danger { + --el-text-color: var(--el-color-danger) +} + +.el-text.el-text--error { + --el-text-color: var(--el-color-error) +} + +.el-text.el-text--info { + --el-text-color: var(--el-color-info) +} + +.el-text>.el-icon { + vertical-align: -2px +} + +.time-select { + margin: 5px 0; + min-width: 0 +} + +.time-select .el-picker-panel__content { + margin: 0; + max-height: 200px +} + +.time-select-item { + font-size: 14px; + line-height: 20px; + padding: 8px 10px +} + +.time-select-item.disabled { + color: var(--el-datepicker-border-color); + cursor: not-allowed +} + +.time-select-item:hover { + background-color: var(--el-fill-color-light); + cursor: pointer; + font-weight: 700 +} + +.time-select .time-select-item.selected:not(.disabled) { + color: var(--el-color-primary); + font-weight: 700 +} + +.el-timeline-item { + padding-bottom: 20px; + position: relative +} + +.el-timeline-item__wrapper { + padding-left: 28px; + position: relative; + top: -3px +} + +.el-timeline-item__tail { + border-left: 2px solid var(--el-timeline-node-color); + height: 100%; + left: 4px; + position: absolute +} + +.el-timeline-item .el-timeline-item__icon { + color: var(--el-color-white); + font-size: var(--el-font-size-small) +} + +.el-timeline-item__node { + align-items: center; + background-color: var(--el-timeline-node-color); + border-color: var(--el-timeline-node-color); + border-radius: 50%; + box-sizing: border-box; + display: flex; + justify-content: center; + position: absolute +} + +.el-timeline-item__node--normal { + height: var(--el-timeline-node-size-normal); + left: -1px; + width: var(--el-timeline-node-size-normal) +} + +.el-timeline-item__node--large { + height: var(--el-timeline-node-size-large); + left: -2px; + width: var(--el-timeline-node-size-large) +} + +.el-timeline-item__node.is-hollow { + background: var(--el-color-white); + border-style: solid; + border-width: 2px +} + +.el-timeline-item__node--primary { + background-color: var(--el-color-primary); + border-color: var(--el-color-primary) +} + +.el-timeline-item__node--success { + background-color: var(--el-color-success); + border-color: var(--el-color-success) +} + +.el-timeline-item__node--warning { + background-color: var(--el-color-warning); + border-color: var(--el-color-warning) +} + +.el-timeline-item__node--danger { + background-color: var(--el-color-danger); + border-color: var(--el-color-danger) +} + +.el-timeline-item__node--info { + background-color: var(--el-color-info); + border-color: var(--el-color-info) +} + +.el-timeline-item__dot { + align-items: center; + display: flex; + justify-content: center; + position: absolute +} + +.el-timeline-item__content { + color: var(--el-text-color-primary) +} + +.el-timeline-item__timestamp { + color: var(--el-text-color-secondary); + font-size: var(--el-font-size-small); + line-height: 1 +} + +.el-timeline-item__timestamp.is-top { + margin-bottom: 8px; + padding-top: 4px +} + +.el-timeline-item__timestamp.is-bottom { + margin-top: 8px +} + +.el-timeline { + --el-timeline-node-size-normal: 12px; + --el-timeline-node-size-large: 14px; + --el-timeline-node-color: var(--el-border-color-light); + font-size: var(--el-font-size-base); + list-style: none; + margin: 0 +} + +.el-timeline .el-timeline-item:last-child .el-timeline-item__tail { + display: none +} + +.el-timeline .el-timeline-item__center { + align-items: center; + display: flex +} + +.el-timeline .el-timeline-item__center .el-timeline-item__wrapper { + width: 100% +} + +.el-timeline .el-timeline-item__center .el-timeline-item__tail { + top: 0 +} + +.el-timeline .el-timeline-item__center:first-child .el-timeline-item__tail { + height: calc(50% + 10px); + top: calc(50% - 10px) +} + +.el-timeline .el-timeline-item__center:last-child .el-timeline-item__tail { + display: block; + height: calc(50% - 10px) +} + +.el-tooltip-v2__content { + --el-tooltip-v2-padding: 5px 10px; + --el-tooltip-v2-border-radius: 4px; + --el-tooltip-v2-border-color: var(--el-border-color); + background-color: var(--el-color-white); + border: 1px solid var(--el-border-color); + border-radius: var(--el-tooltip-v2-border-radius); + color: var(--el-color-black); + padding: var(--el-tooltip-v2-padding) +} + +.el-tooltip-v2__arrow { + color: var(--el-color-white); + height: var(--el-tooltip-v2-arrow-height); + left: var(--el-tooltip-v2-arrow-x); + pointer-events: none; + position: absolute; + top: var(--el-tooltip-v2-arrow-y); + width: var(--el-tooltip-v2-arrow-width) +} + +.el-tooltip-v2__arrow:after, +.el-tooltip-v2__arrow:before { + border: var(--el-tooltip-v2-arrow-border-width) solid transparent; + content: ""; + height: 0; + position: absolute; + width: 0 +} + +.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow { + bottom: 0 +} + +.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow:before { + border-bottom: 0; + border-top-color: var(--el-color-white); + border-top-width: var(--el-tooltip-v2-arrow-border-width); + top: calc(100% - 1px) +} + +.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow:after { + border-bottom: 0; + border-top-color: var(--el-border-color); + border-top-width: var(--el-tooltip-v2-arrow-border-width); + top: 100%; + z-index: -1 +} + +.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow { + top: 0 +} + +.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow:before { + border-bottom-color: var(--el-color-white); + border-bottom-width: var(--el-tooltip-v2-arrow-border-width); + border-top: 0; + bottom: calc(100% - 1px) +} + +.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow:after { + border-bottom-color: var(--el-border-color); + border-bottom-width: var(--el-tooltip-v2-arrow-border-width); + border-top: 0; + bottom: 100%; + z-index: -1 +} + +.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow { + right: 0 +} + +.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow:before { + border-left-color: var(--el-color-white); + border-left-width: var(--el-tooltip-v2-arrow-border-width); + border-right: 0; + left: calc(100% - 1px) +} + +.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow:after { + border-left-color: var(--el-border-color); + border-left-width: var(--el-tooltip-v2-arrow-border-width); + border-right: 0; + left: 100%; + z-index: -1 +} + +.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow { + left: 0 +} + +.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow:before { + border-left: 0; + border-right-color: var(--el-color-white); + border-right-width: var(--el-tooltip-v2-arrow-border-width); + right: calc(100% - 1px) +} + +.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow:after { + border-left: 0; + border-right-color: var(--el-border-color); + border-right-width: var(--el-tooltip-v2-arrow-border-width); + right: 100%; + z-index: -1 +} + +.el-tooltip-v2__content.is-dark { + --el-tooltip-v2-border-color: transparent; + color: var(--el-color-white) +} + +.el-tooltip-v2__content.is-dark, +.el-tooltip-v2__content.is-dark .el-tooltip-v2__arrow { + background-color: var(--el-color-black); + border-color: transparent +} + +.el-transfer { + --el-transfer-border-color: var(--el-border-color-lighter); + --el-transfer-border-radius: var(--el-border-radius-base); + --el-transfer-panel-width: 200px; + --el-transfer-panel-header-height: 40px; + --el-transfer-panel-header-bg-color: var(--el-fill-color-light); + --el-transfer-panel-footer-height: 40px; + --el-transfer-panel-body-height: 278px; + --el-transfer-item-height: 30px; + --el-transfer-filter-height: 32px; + font-size: var(--el-font-size-base) +} + +.el-transfer__buttons { + display: inline-block; + padding: 0 30px; + vertical-align: middle +} + +.el-transfer__button { + vertical-align: top +} + +.el-transfer__button:nth-child(2) { + margin: 0 0 0 10px +} + +.el-transfer__button i, +.el-transfer__button span { + font-size: 14px +} + +.el-transfer__button .el-icon+span { + margin-left: 0 +} + +.el-transfer-panel { + background: var(--el-bg-color-overlay); + box-sizing: border-box; + display: inline-block; + max-height: 100%; + overflow: hidden; + position: relative; + text-align: left; + vertical-align: middle; + width: var(--el-transfer-panel-width) +} + +.el-transfer-panel__body { + border-bottom: 1px solid var(--el-transfer-border-color); + border-bottom-left-radius: var(--el-transfer-border-radius); + border-bottom-right-radius: var(--el-transfer-border-radius); + border-left: 1px solid var(--el-transfer-border-color); + border-right: 1px solid var(--el-transfer-border-color); + height: var(--el-transfer-panel-body-height); + overflow: hidden +} + +.el-transfer-panel__body.is-with-footer { + border-bottom: none; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0 +} + +.el-transfer-panel__list { + box-sizing: border-box; + height: var(--el-transfer-panel-body-height); + list-style: none; + margin: 0; + overflow: auto; + padding: 6px 0 +} + +.el-transfer-panel__list.is-filterable { + height: calc(100% - var(--el-transfer-filter-height) - 30px); + padding-top: 0 +} + +.el-transfer-panel__item { + display: block !important; + height: var(--el-transfer-item-height); + line-height: var(--el-transfer-item-height); + padding-left: 15px +} + +.el-transfer-panel__item+.el-transfer-panel__item { + margin-left: 0 +} + +.el-transfer-panel__item.el-checkbox { + color: var(--el-text-color-regular) +} + +.el-transfer-panel__item:hover { + color: var(--el-color-primary) +} + +.el-transfer-panel__item.el-checkbox .el-checkbox__label { + box-sizing: border-box; + display: block; + line-height: var(--el-transfer-item-height); + overflow: hidden; + padding-left: 22px; + text-overflow: ellipsis; + white-space: nowrap; + width: 100% +} + +.el-transfer-panel__item .el-checkbox__input { + position: absolute; + top: 8px +} + +.el-transfer-panel__filter { + box-sizing: border-box; + padding: 15px; + text-align: center +} + +.el-transfer-panel__filter .el-input__inner { + box-sizing: border-box; + display: inline-block; + font-size: 12px; + height: var(--el-transfer-filter-height); + width: 100% +} + +.el-transfer-panel__filter .el-icon-circle-close { + cursor: pointer +} + +.el-transfer-panel .el-transfer-panel__header { + align-items: center; + background: var(--el-transfer-panel-header-bg-color); + border: 1px solid var(--el-transfer-border-color); + border-top-left-radius: var(--el-transfer-border-radius); + border-top-right-radius: var(--el-transfer-border-radius); + box-sizing: border-box; + color: var(--el-color-black); + display: flex; + height: var(--el-transfer-panel-header-height); + margin: 0; + padding-left: 15px +} + +.el-transfer-panel .el-transfer-panel__header .el-checkbox { + align-items: center; + display: flex; + position: relative; + width: 100% +} + +.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label { + color: var(--el-text-color-primary); + font-size: 16px; + font-weight: 400 +} + +.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span { + color: var(--el-text-color-secondary); + font-size: 12px; + font-weight: 400; + position: absolute; + right: 15px; + top: 50%; + transform: translate3d(0, -50%, 0) +} + +.el-transfer-panel .el-transfer-panel__footer { + background: var(--el-bg-color-overlay); + border: 1px solid var(--el-transfer-border-color); + border-bottom-left-radius: var(--el-transfer-border-radius); + border-bottom-right-radius: var(--el-transfer-border-radius); + height: var(--el-transfer-panel-footer-height); + margin: 0; + padding: 0 +} + +.el-transfer-panel .el-transfer-panel__footer:after { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle +} + +.el-transfer-panel .el-transfer-panel__footer .el-checkbox { + color: var(--el-text-color-regular); + padding-left: 20px +} + +.el-transfer-panel .el-transfer-panel__empty { + color: var(--el-text-color-secondary); + height: var(--el-transfer-item-height); + line-height: var(--el-transfer-item-height); + margin: 0; + padding: 6px 15px 0; + text-align: center +} + +.el-transfer-panel .el-checkbox__label { + padding-left: 8px +} + +.el-transfer-panel .el-checkbox__inner { + border-radius: 3px; + height: 14px; + width: 14px +} + +.el-transfer-panel .el-checkbox__inner:after { + height: 6px; + left: 4px; + width: 3px +} + +.el-tree { + --el-tree-node-content-height: 26px; + --el-tree-node-hover-bg-color: var(--el-fill-color-light); + --el-tree-text-color: var(--el-text-color-regular); + --el-tree-expand-icon-color: var(--el-text-color-placeholder); + background: var(--el-fill-color-blank); + color: var(--el-tree-text-color); + cursor: default; + font-size: var(--el-font-size-base); + position: relative +} + +.el-tree__empty-block { + height: 100%; + min-height: 60px; + position: relative; + text-align: center; + width: 100% +} + +.el-tree__empty-text { + color: var(--el-text-color-secondary); + font-size: var(--el-font-size-base); + left: 50%; + position: absolute; + top: 50%; + transform: translate(-50%, -50%) +} + +.el-tree__drop-indicator { + background-color: var(--el-color-primary); + height: 1px; + left: 0; + position: absolute; + right: 0 +} + +.el-tree-node { + outline: none; + white-space: nowrap +} + +.el-tree-node:focus>.el-tree-node__content { + background-color: var(--el-tree-node-hover-bg-color) +} + +.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label { + background-color: var(--el-color-primary); + color: #fff +} + +.el-tree-node__content { + --el-checkbox-height: var(--el-tree-node-content-height); + align-items: center; + cursor: pointer; + display: flex; + height: var(--el-tree-node-content-height) +} + +.el-tree-node__content>.el-tree-node__expand-icon { + box-sizing: content-box; + padding: 6px +} + +.el-tree-node__content>label.el-checkbox { + margin-right: 8px +} + +.el-tree-node__content:hover { + background-color: var(--el-tree-node-hover-bg-color) +} + +.el-tree.is-dragging .el-tree-node__content { + cursor: move +} + +.el-tree.is-dragging .el-tree-node__content * { + pointer-events: none +} + +.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content { + cursor: not-allowed +} + +.el-tree-node__expand-icon { + color: var(--el-tree-expand-icon-color); + cursor: pointer; + font-size: 12px; + transform: rotate(0); + transition: transform var(--el-transition-duration) ease-in-out +} + +.el-tree-node__expand-icon.expanded { + transform: rotate(90deg) +} + +.el-tree-node__expand-icon.is-leaf { + color: transparent; + cursor: default; + visibility: hidden +} + +.el-tree-node__expand-icon.is-hidden { + visibility: hidden +} + +.el-tree-node__loading-icon { + color: var(--el-tree-expand-icon-color); + font-size: var(--el-font-size-base); + margin-right: 8px +} + +.el-tree-node>.el-tree-node__children { + background-color: transparent; + overflow: hidden +} + +.el-tree-node.is-expanded>.el-tree-node__children { + display: block +} + +.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content { + background-color: var(--el-color-primary-light-9) +} + +.el-tree-select { + --el-tree-node-content-height: 26px; + --el-tree-node-hover-bg-color: var(--el-fill-color-light); + --el-tree-text-color: var(--el-text-color-regular); + --el-tree-expand-icon-color: var(--el-text-color-placeholder) +} + +.el-tree-select__popper .el-tree-node__expand-icon { + margin-left: 8px +} + +.el-tree-select__popper .el-tree-node.is-checked>.el-tree-node__content .el-select-dropdown__item.selected:after { + content: none +} + +.el-tree-select__popper .el-select-dropdown__list>.el-select-dropdown__item { + padding-left: 32px +} + +.el-tree-select__popper .el-select-dropdown__item { + background: transparent !important; + flex: 1; + height: 20px; + line-height: 20px; + padding-left: 0 +} + +.el-upload { + --el-upload-dragger-padding-horizontal: 40px; + --el-upload-dragger-padding-vertical: 10px; + align-items: center; + cursor: pointer; + display: inline-flex; + justify-content: center; + outline: none +} + +.el-upload.is-disabled { + cursor: not-allowed +} + +.el-upload.is-disabled:focus { + color: inherit +} + +.el-upload.is-disabled:focus, +.el-upload.is-disabled:focus .el-upload-dragger { + border-color: var(--el-border-color-darker) +} + +.el-upload.is-disabled .el-upload-dragger { + background-color: var(--el-disabled-bg-color); + cursor: not-allowed +} + +.el-upload.is-disabled .el-upload-dragger .el-upload__text { + color: var(--el-text-color-placeholder) +} + +.el-upload.is-disabled .el-upload-dragger .el-upload__text em { + color: var(--el-disabled-text-color) +} + +.el-upload.is-disabled .el-upload-dragger:hover { + border-color: var(--el-border-color-darker) +} + +.el-upload__input { + display: none +} + +.el-upload__tip { + color: var(--el-text-color-regular); + font-size: 12px; + margin-top: 7px +} + +.el-upload iframe { + filter: alpha(opacity=0); + left: 0; + opacity: 0; + position: absolute; + top: 0; + z-index: -1 +} + +.el-upload--picture-card { + --el-upload-picture-card-size: 148px; + align-items: center; + background-color: var(--el-fill-color-lighter); + border: 1px dashed var(--el-border-color-darker); + border-radius: 6px; + box-sizing: border-box; + cursor: pointer; + display: inline-flex; + height: var(--el-upload-picture-card-size); + justify-content: center; + vertical-align: top; + width: var(--el-upload-picture-card-size) +} + +.el-upload--picture-card>i { + color: var(--el-text-color-secondary); + font-size: 28px +} + +.el-upload--picture-card:hover { + border-color: var(--el-color-primary); + color: var(--el-color-primary) +} + +.el-upload.is-drag { + display: block +} + +.el-upload:focus { + color: var(--el-color-primary) +} + +.el-upload:focus, +.el-upload:focus .el-upload-dragger { + border-color: var(--el-color-primary) +} + +.el-upload-dragger { + background-color: var(--el-fill-color-blank); + border: 1px dashed var(--el-border-color); + border-radius: 6px; + box-sizing: border-box; + cursor: pointer; + overflow: hidden; + padding: var(--el-upload-dragger-padding-horizontal) var(--el-upload-dragger-padding-vertical); + position: relative; + text-align: center +} + +.el-upload-dragger .el-icon--upload { + color: var(--el-text-color-placeholder); + font-size: 67px; + line-height: 50px; + margin-bottom: 16px +} + +.el-upload-dragger+.el-upload__tip { + text-align: center +} + +.el-upload-dragger~.el-upload__files { + border-top: var(--el-border); + margin-top: 7px; + padding-top: 5px +} + +.el-upload-dragger .el-upload__text { + color: var(--el-text-color-regular); + font-size: 14px; + text-align: center +} + +.el-upload-dragger .el-upload__text em { + color: var(--el-color-primary); + font-style: normal +} + +.el-upload-dragger:hover { + border-color: var(--el-color-primary) +} + +.el-upload-dragger.is-dragover { + background-color: var(--el-color-primary-light-9); + border: 2px dashed var(--el-color-primary); + padding: calc(var(--el-upload-dragger-padding-horizontal) - 1px) calc(var(--el-upload-dragger-padding-vertical) - 1px) +} + +.el-upload-list { + list-style: none; + margin: 10px 0 0; + padding: 0; + position: relative +} + +.el-upload-list__item { + border-radius: 4px; + box-sizing: border-box; + color: var(--el-text-color-regular); + font-size: 14px; + margin-bottom: 5px; + position: relative; + transition: all .5s cubic-bezier(.55, 0, .1, 1); + width: 100% +} + +.el-upload-list__item .el-progress { + position: absolute; + top: 20px; + width: 100% +} + +.el-upload-list__item .el-progress__text { + position: absolute; + right: 0; + top: -13px +} + +.el-upload-list__item .el-progress-bar { + margin-right: 0; + padding-right: 0 +} + +.el-upload-list__item .el-icon--upload-success { + color: var(--el-color-success) +} + +.el-upload-list__item .el-icon--close { + color: var(--el-text-color-regular); + cursor: pointer; + display: none; + opacity: .75; + position: absolute; + right: 5px; + top: 50%; + transform: translateY(-50%); + transition: opacity var(--el-transition-duration) +} + +.el-upload-list__item .el-icon--close:hover { + color: var(--el-color-primary); + opacity: 1 +} + +.el-upload-list__item .el-icon--close-tip { + color: var(--el-color-primary); + cursor: pointer; + display: none; + font-size: 12px; + font-style: normal; + opacity: 1; + position: absolute; + right: 5px; + top: 1px +} + +.el-upload-list__item:hover { + background-color: var(--el-fill-color-light) +} + +.el-upload-list__item:hover .el-icon--close { + display: inline-flex +} + +.el-upload-list__item:hover .el-progress__text { + display: none +} + +.el-upload-list__item .el-upload-list__item-info { + display: inline-flex; + flex-direction: column; + justify-content: center; + margin-left: 4px; + width: calc(100% - 30px) +} + +.el-upload-list__item.is-success .el-upload-list__item-status-label { + display: inline-flex +} + +.el-upload-list__item.is-success .el-upload-list__item-name:focus, +.el-upload-list__item.is-success .el-upload-list__item-name:hover { + color: var(--el-color-primary); + cursor: pointer +} + +.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip { + display: inline-block +} + +.el-upload-list__item.is-success:active, +.el-upload-list__item.is-success:not(.focusing):focus { + outline-width: 0 +} + +.el-upload-list__item.is-success:active .el-icon--close-tip, +.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip { + display: none +} + +.el-upload-list__item.is-success:focus .el-upload-list__item-status-label, +.el-upload-list__item.is-success:hover .el-upload-list__item-status-label { + display: none; + opacity: 0 +} + +.el-upload-list__item-name { + align-items: center; + color: var(--el-text-color-regular); + display: inline-flex; + font-size: var(--el-font-size-base); + padding: 0 4px; + text-align: center; + transition: color var(--el-transition-duration) +} + +.el-upload-list__item-name .el-icon { + color: var(--el-text-color-secondary); + margin-right: 6px +} + +.el-upload-list__item-file-name { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-upload-list__item-status-label { + align-items: center; + display: none; + height: 100%; + justify-content: center; + line-height: inherit; + position: absolute; + right: 5px; + top: 0; + transition: opacity var(--el-transition-duration) +} + +.el-upload-list__item-delete { + color: var(--el-text-color-regular); + display: none; + font-size: 12px; + position: absolute; + right: 10px; + top: 0 +} + +.el-upload-list__item-delete:hover { + color: var(--el-color-primary) +} + +.el-upload-list--picture-card { + --el-upload-list-picture-card-size: 148px; + display: inline-flex; + flex-wrap: wrap; + margin: 0 +} + +.el-upload-list--picture-card .el-upload-list__item { + background-color: var(--el-fill-color-blank); + border: 1px solid var(--el-border-color); + border-radius: 6px; + box-sizing: border-box; + display: inline-flex; + height: var(--el-upload-list-picture-card-size); + margin: 0 8px 8px 0; + overflow: hidden; + padding: 0; + width: var(--el-upload-list-picture-card-size) +} + +.el-upload-list--picture-card .el-upload-list__item .el-icon--check, +.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check { + color: #fff +} + +.el-upload-list--picture-card .el-upload-list__item .el-icon--close { + display: none +} + +.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label { + display: block; + opacity: 0 +} + +.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text { + display: block +} + +.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name { + display: none +} + +.el-upload-list--picture-card .el-upload-list__item-thumbnail { + height: 100%; + -o-object-fit: contain; + object-fit: contain; + width: 100% +} + +.el-upload-list--picture-card .el-upload-list__item-status-label { + background: var(--el-color-success); + height: 24px; + right: -15px; + text-align: center; + top: -6px; + transform: rotate(45deg); + width: 40px +} + +.el-upload-list--picture-card .el-upload-list__item-status-label i { + font-size: 12px; + margin-top: 11px; + transform: rotate(-45deg) +} + +.el-upload-list--picture-card .el-upload-list__item-actions { + align-items: center; + background-color: var(--el-overlay-color-lighter); + color: #fff; + cursor: default; + display: inline-flex; + font-size: 20px; + height: 100%; + justify-content: center; + left: 0; + opacity: 0; + position: absolute; + top: 0; + transition: opacity var(--el-transition-duration); + width: 100% +} + +.el-upload-list--picture-card .el-upload-list__item-actions span { + cursor: pointer; + display: none +} + +.el-upload-list--picture-card .el-upload-list__item-actions span+span { + margin-left: 16px +} + +.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete { + color: inherit; + font-size: inherit; + position: static +} + +.el-upload-list--picture-card .el-upload-list__item-actions:hover { + opacity: 1 +} + +.el-upload-list--picture-card .el-upload-list__item-actions:hover span { + display: inline-flex +} + +.el-upload-list--picture-card .el-progress { + bottom: auto; + left: 50%; + top: 50%; + transform: translate(-50%, -50%); + width: 126px +} + +.el-upload-list--picture-card .el-progress .el-progress__text { + top: 50% +} + +.el-upload-list--picture .el-upload-list__item { + align-items: center; + background-color: var(--el-fill-color-blank); + border: 1px solid var(--el-border-color); + border-radius: 6px; + box-sizing: border-box; + display: flex; + margin-top: 10px; + overflow: hidden; + padding: 10px; + z-index: 0 +} + +.el-upload-list--picture .el-upload-list__item .el-icon--check, +.el-upload-list--picture .el-upload-list__item .el-icon--circle-check { + color: #fff +} + +.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label { + display: inline-flex; + opacity: 0 +} + +.el-upload-list--picture .el-upload-list__item:hover .el-progress__text { + display: block +} + +.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i { + display: none +} + +.el-upload-list--picture .el-upload-list__item .el-icon--close { + top: 5px; + transform: translateY(0) +} + +.el-upload-list--picture .el-upload-list__item-thumbnail { + align-items: center; + background-color: var(--el-color-white); + display: inline-flex; + height: 70px; + justify-content: center; + -o-object-fit: contain; + object-fit: contain; + position: relative; + width: 70px; + z-index: 1 +} + +.el-upload-list--picture .el-upload-list__item-status-label { + background: var(--el-color-success); + height: 26px; + position: absolute; + right: -17px; + text-align: center; + top: -7px; + transform: rotate(45deg); + width: 46px +} + +.el-upload-list--picture .el-upload-list__item-status-label i { + font-size: 12px; + margin-top: 12px; + transform: rotate(-45deg) +} + +.el-upload-list--picture .el-progress { + position: relative; + top: -7px +} + +.el-upload-cover { + cursor: default; + height: 100%; + left: 0; + overflow: hidden; + position: absolute; + top: 0; + width: 100%; + z-index: 10 +} + +.el-upload-cover:after { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle +} + +.el-upload-cover img { + display: block; + height: 100%; + width: 100% +} + +.el-upload-cover__label { + background: var(--el-color-success); + height: 24px; + right: -15px; + text-align: center; + top: -6px; + transform: rotate(45deg); + width: 40px +} + +.el-upload-cover__label i { + color: #fff; + font-size: 12px; + margin-top: 11px; + transform: rotate(-45deg) +} + +.el-upload-cover__progress { + display: inline-block; + position: static; + vertical-align: middle; + width: 243px +} + +.el-upload-cover__progress+.el-upload__inner { + opacity: 0 +} + +.el-upload-cover__content { + height: 100%; + left: 0; + position: absolute; + top: 0; + width: 100% +} + +.el-upload-cover__interact { + background-color: var(--el-overlay-color-light); + bottom: 0; + height: 100%; + left: 0; + position: absolute; + text-align: center; + width: 100% +} + +.el-upload-cover__interact .btn { + color: #fff; + cursor: pointer; + display: inline-block; + font-size: 14px; + margin-top: 60px; + transition: var(--el-transition-md-fade); + vertical-align: middle +} + +.el-upload-cover__interact .btn i { + margin-top: 0 +} + +.el-upload-cover__interact .btn span { + opacity: 0; + transition: opacity .15s linear +} + +.el-upload-cover__interact .btn:not(:first-child) { + margin-left: 35px +} + +.el-upload-cover__interact .btn:hover { + transform: translateY(-13px) +} + +.el-upload-cover__interact .btn:hover span { + opacity: 1 +} + +.el-upload-cover__interact .btn i { + color: #fff; + display: block; + font-size: 24px; + line-height: inherit; + margin: 0 auto 5px +} + +.el-upload-cover__title { + background-color: #fff; + bottom: 0; + color: var(--el-text-color-primary); + font-size: 14px; + font-weight: 400; + height: 36px; + left: 0; + line-height: 36px; + margin: 0; + overflow: hidden; + padding: 0 10px; + position: absolute; + text-align: left; + text-overflow: ellipsis; + white-space: nowrap; + width: 100% +} + +.el-upload-cover+.el-upload__inner { + opacity: 0; + position: relative; + z-index: 1 +} + +.el-vl__wrapper { + position: relative +} + +.el-vl__wrapper.always-on .el-virtual-scrollbar, +.el-vl__wrapper:hover .el-virtual-scrollbar { + opacity: 1 +} + +.el-vl__window { + scrollbar-width: none +} + +.el-vl__window::-webkit-scrollbar { + display: none +} + +.el-virtual-scrollbar { + opacity: 0; + transition: opacity .34s ease-out +} + +.el-virtual-scrollbar.always-on { + opacity: 1 +} + +.el-vg__wrapper { + position: relative +} + +.el-popper { + --el-popper-border-radius: var(--el-popover-border-radius, 4px); + border-radius: var(--el-popper-border-radius); + font-size: 12px; + line-height: 20px; + min-width: 10px; + overflow-wrap: break-word; + padding: 5px 11px; + position: absolute; + visibility: visible; + z-index: 2000 +} + +.el-popper.is-dark { + color: var(--el-bg-color) +} + +.el-popper.is-dark, +.el-popper.is-dark>.el-popper__arrow:before { + background: var(--el-text-color-primary); + border: 1px solid var(--el-text-color-primary) +} + +.el-popper.is-dark>.el-popper__arrow:before { + right: 0 +} + +.el-popper.is-light, +.el-popper.is-light>.el-popper__arrow:before { + background: var(--el-bg-color-overlay); + border: 1px solid var(--el-border-color-light) +} + +.el-popper.is-light>.el-popper__arrow:before { + right: 0 +} + +.el-popper.is-pure { + padding: 0 +} + +.el-popper__arrow, +.el-popper__arrow:before { + height: 10px; + position: absolute; + width: 10px; + z-index: -1 +} + +.el-popper__arrow:before { + background: var(--el-text-color-primary); + box-sizing: border-box; + content: " "; + transform: rotate(45deg) +} + +.el-popper[data-popper-placement^=top]>.el-popper__arrow { + bottom: -5px +} + +.el-popper[data-popper-placement^=top]>.el-popper__arrow:before { + border-bottom-right-radius: 2px +} + +.el-popper[data-popper-placement^=bottom]>.el-popper__arrow { + top: -5px +} + +.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before { + border-top-left-radius: 2px +} + +.el-popper[data-popper-placement^=left]>.el-popper__arrow { + right: -5px +} + +.el-popper[data-popper-placement^=left]>.el-popper__arrow:before { + border-top-right-radius: 2px +} + +.el-popper[data-popper-placement^=right]>.el-popper__arrow { + left: -5px +} + +.el-popper[data-popper-placement^=right]>.el-popper__arrow:before { + border-bottom-left-radius: 2px +} + +.el-popper[data-popper-placement^=top]>.el-popper__arrow:before { + border-left-color: transparent !important; + border-top-color: transparent !important +} + +.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before { + border-bottom-color: transparent !important; + border-right-color: transparent !important +} + +.el-popper[data-popper-placement^=left]>.el-popper__arrow:before { + border-bottom-color: transparent !important; + border-left-color: transparent !important +} + +.el-popper[data-popper-placement^=right]>.el-popper__arrow:before { + border-right-color: transparent !important; + border-top-color: transparent !important +} + +.el-statistic { + --el-statistic-title-font-weight: 400; + --el-statistic-title-font-size: var(--el-font-size-extra-small); + --el-statistic-title-color: var(--el-text-color-regular); + --el-statistic-content-font-weight: 400; + --el-statistic-content-font-size: var(--el-font-size-extra-large); + --el-statistic-content-color: var(--el-text-color-primary) +} + +.el-statistic__head { + color: var(--el-statistic-title-color); + font-size: var(--el-statistic-title-font-size); + font-weight: var(--el-statistic-title-font-weight); + line-height: 20px; + margin-bottom: 4px +} + +.el-statistic__content { + color: var(--el-statistic-content-color); + font-size: var(--el-statistic-content-font-size); + font-weight: var(--el-statistic-content-font-weight) +} + +.el-statistic__value { + display: inline-block +} + +.el-statistic__prefix { + display: inline-block; + margin-right: 4px +} + +.el-statistic__suffix { + display: inline-block; + margin-left: 4px +} + +.el-tour { + --el-tour-width: 520px; + --el-tour-padding-primary: 12px; + --el-tour-font-line-height: var(--el-font-line-height-primary); + --el-tour-title-font-size: 16px; + --el-tour-title-text-color: var(--el-text-color-primary); + --el-tour-title-font-weight: 400; + --el-tour-close-color: var(--el-color-info); + --el-tour-font-size: 14px; + --el-tour-color: var(--el-text-color-primary); + --el-tour-bg-color: var(--el-bg-color); + --el-tour-border-radius: 4px +} + +.el-tour__hollow { + transition: all var(--el-transition-duration) ease +} + +.el-tour__content { + border-radius: var(--el-tour-border-radius); + box-shadow: var(--el-box-shadow-light); + outline: none; + overflow-wrap: break-word; + padding: var(--el-tour-padding-primary); + width: var(--el-tour-width) +} + +.el-tour__arrow, +.el-tour__content { + background: var(--el-tour-bg-color); + box-sizing: border-box +} + +.el-tour__arrow { + height: 10px; + pointer-events: none; + position: absolute; + transform: rotate(45deg); + width: 10px +} + +.el-tour__content[data-side^=top] .el-tour__arrow { + border-left-color: transparent; + border-top-color: transparent +} + +.el-tour__content[data-side^=bottom] .el-tour__arrow { + border-bottom-color: transparent; + border-right-color: transparent +} + +.el-tour__content[data-side^=left] .el-tour__arrow { + border-bottom-color: transparent; + border-left-color: transparent +} + +.el-tour__content[data-side^=right] .el-tour__arrow { + border-right-color: transparent; + border-top-color: transparent +} + +.el-tour__content[data-side^=top] .el-tour__arrow { + bottom: -5px +} + +.el-tour__content[data-side^=bottom] .el-tour__arrow { + top: -5px +} + +.el-tour__content[data-side^=left] .el-tour__arrow { + right: -5px +} + +.el-tour__content[data-side^=right] .el-tour__arrow { + left: -5px +} + +.el-tour__closebtn { + background: transparent; + border: none; + cursor: pointer; + font-size: var(--el-message-close-size, 16px); + height: 40px; + outline: none; + padding: 0; + position: absolute; + right: 0; + top: 0; + width: 40px +} + +.el-tour__closebtn .el-tour__close { + color: var(--el-tour-close-color); + font-size: inherit +} + +.el-tour__closebtn:focus .el-tour__close, +.el-tour__closebtn:hover .el-tour__close { + color: var(--el-color-primary) +} + +.el-tour__header { + padding-bottom: var(--el-tour-padding-primary) +} + +.el-tour__header.show-close { + padding-right: calc(var(--el-tour-padding-primary) + var(--el-message-close-size, 16px)) +} + +.el-tour__title { + color: var(--el-tour-title-text-color); + font-size: var(--el-tour-title-font-size); + font-weight: var(--el-tour-title-font-weight); + line-height: var(--el-tour-font-line-height) +} + +.el-tour__body { + color: var(--el-tour-text-color); + font-size: var(--el-tour-font-size) +} + +.el-tour__body img, +.el-tour__body video { + max-width: 100% +} + +.el-tour__footer { + box-sizing: border-box; + display: flex; + justify-content: space-between; + padding-top: var(--el-tour-padding-primary) +} + +.el-tour__content .el-tour-indicators { + display: inline-block; + flex: 1 +} + +.el-tour__content .el-tour-indicator { + background: var(--el-color-info-light-9); + border-radius: 50%; + display: inline-block; + height: 6px; + margin-right: 6px; + width: 6px +} + +.el-tour__content .el-tour-indicator.is-active { + background: var(--el-color-primary) +} + +.el-tour.el-tour--primary { + --el-tour-title-text-color: #fff; + --el-tour-text-color: #fff; + --el-tour-bg-color: var(--el-color-primary); + --el-tour-close-color: #fff +} + +.el-tour.el-tour--primary .el-tour__closebtn:focus .el-tour__close, +.el-tour.el-tour--primary .el-tour__closebtn:hover .el-tour__close { + color: var(--el-tour-title-text-color) +} + +.el-tour.el-tour--primary .el-button--default { + background: #fff; + border-color: var(--el-color-primary); + color: var(--el-color-primary) +} + +.el-tour.el-tour--primary .el-button--primary { + border-color: #fff +} + +.el-tour.el-tour--primary .el-tour-indicator { + background: #ffffff26 +} + +.el-tour.el-tour--primary .el-tour-indicator.is-active { + background: #fff +} + +.el-tour-parent--hidden { + overflow: hidden +} + +.el-anchor { + --el-anchor-bg-color: var(--el-bg-color); + --el-anchor-padding-indent: 14px; + --el-anchor-line-height: 22px; + --el-anchor-font-size: 12px; + --el-anchor-color: var(--el-text-color-secondary); + --el-anchor-active-color: var(--el-color-primary); + --el-anchor-marker-bg-color: var(--el-color-primary); + background-color: var(--el-anchor-bg-color); + position: relative +} + +.el-anchor__marker { + background-color: var(--el-anchor-marker-bg-color); + border-radius: 4px; + opacity: 0; + position: absolute; + z-index: 0 +} + +.el-anchor.el-anchor--vertical .el-anchor__marker { + height: 14px; + left: 0; + top: 8px; + transition: top .25s ease-in-out, opacity .25s; + width: 4px +} + +.el-anchor.el-anchor--vertical .el-anchor__list { + padding-left: var(--el-anchor-padding-indent) +} + +.el-anchor.el-anchor--vertical.el-anchor--underline:before { + background-color: #0505050f; + content: ""; + height: 100%; + left: 0; + position: absolute; + width: 2px +} + +.el-anchor.el-anchor--vertical.el-anchor--underline .el-anchor__marker { + border-radius: unset; + width: 2px +} + +.el-anchor.el-anchor--horizontal .el-anchor__marker { + bottom: 0; + height: 2px; + transition: left .25s ease-in-out, opacity .25s, width .25s; + width: 20px +} + +.el-anchor.el-anchor--horizontal .el-anchor__list { + display: flex; + padding-bottom: 4px +} + +.el-anchor.el-anchor--horizontal .el-anchor__list .el-anchor__item { + padding-left: 16px +} + +.el-anchor.el-anchor--horizontal .el-anchor__list .el-anchor__item:first-child { + padding-left: 0 +} + +.el-anchor.el-anchor--horizontal.el-anchor--underline:before { + background-color: #0505050f; + bottom: 0; + content: ""; + height: 2px; + position: absolute; + width: 100% +} + +.el-anchor.el-anchor--horizontal.el-anchor--underline .el-anchor__marker { + border-radius: unset; + height: 2px +} + +.el-anchor__item { + display: flex; + flex-direction: column; + overflow: hidden +} + +.el-anchor__link { + cursor: pointer; + font-size: var(--el-anchor-font-size); + line-height: var(--el-anchor-line-height); + max-width: 100%; + outline: none; + overflow: hidden; + padding: 4px 0; + text-decoration: none; + text-overflow: ellipsis; + transition: color var(--el-transition-duration); + white-space: nowrap +} + +.el-anchor__link, +.el-anchor__link:focus, +.el-anchor__link:hover { + color: var(--el-anchor-color) +} + +.el-anchor__link.is-active { + color: var(--el-anchor-active-color) +} + +.el-anchor .el-anchor__list .el-anchor__item a { + display: inline-block +} + +.el-segmented--vertical { + flex-direction: column +} + +.el-segmented--vertical .el-segmented__item { + padding: 11px +} + +.el-segmented { + --el-segmented-color: var(--el-text-color-regular); + --el-segmented-bg-color: var(--el-fill-color-light); + --el-segmented-padding: 2px; + --el-segmented-item-selected-color: var(--el-color-white); + --el-segmented-item-selected-bg-color: var(--el-color-primary); + --el-segmented-item-selected-disabled-bg-color: var(--el-color-primary-light-5); + --el-segmented-item-hover-color: var(--el-text-color-primary); + --el-segmented-item-hover-bg-color: var(--el-fill-color-dark); + --el-segmented-item-active-bg-color: var(--el-fill-color-darker); + --el-segmented-item-disabled-color: var(--el-text-color-placeholder); + align-items: stretch; + background: var(--el-segmented-bg-color); + border-radius: var(--el-border-radius-base); + box-sizing: border-box; + color: var(--el-segmented-color); + display: inline-flex; + font-size: 14px; + min-height: 32px; + padding: var(--el-segmented-padding) +} + +.el-segmented__group { + align-items: stretch; + display: flex; + position: relative; + width: 100% +} + +.el-segmented__item-selected { + background: var(--el-segmented-item-selected-bg-color); + border-radius: calc(var(--el-border-radius-base) - 2px); + height: 100%; + left: 0; + pointer-events: none; + position: absolute; + top: 0; + transition: all .3s; + width: 10px +} + +.el-segmented__item-selected.is-disabled { + background: var(--el-segmented-item-selected-disabled-bg-color) +} + +.el-segmented__item-selected.is-focus-visible:before { + border-radius: inherit; + content: ""; + top: 0; + right: 0; + bottom: 0; + left: 0; + outline: 2px solid var(--el-segmented-item-selected-bg-color); + outline-offset: 1px; + position: absolute +} + +.el-segmented__item { + align-items: center; + border-radius: calc(var(--el-border-radius-base) - 2px); + cursor: pointer; + display: flex; + flex: 1; + padding: 0 11px +} + +.el-segmented__item:not(.is-disabled):not(.is-selected):hover { + background: var(--el-segmented-item-hover-bg-color); + color: var(--el-segmented-item-hover-color) +} + +.el-segmented__item:not(.is-disabled):not(.is-selected):active { + background: var(--el-segmented-item-active-bg-color) +} + +.el-segmented__item.is-selected, +.el-segmented__item.is-selected.is-disabled { + color: var(--el-segmented-item-selected-color) +} + +.el-segmented__item.is-disabled { + color: var(--el-segmented-item-disabled-color); + cursor: not-allowed +} + +.el-segmented__item-input { + height: 0; + margin: 0; + opacity: 0; + pointer-events: none; + position: absolute; + width: 0 +} + +.el-segmented__item-label { + flex: 1; + line-height: normal; + overflow: hidden; + text-align: center; + text-overflow: ellipsis; + transition: color .3s; + white-space: nowrap; + z-index: 1 +} + +.el-segmented.is-block { + display: flex +} + +.el-segmented.is-block .el-segmented__item { + min-width: 0 +} + +.el-segmented--large { + border-radius: var(--el-border-radius-base); + font-size: 16px; + min-height: 40px +} + +.el-segmented--large .el-segmented__item-selected { + border-radius: calc(var(--el-border-radius-base) - 2px) +} + +.el-segmented--large .el-segmented--vertical .el-segmented__item { + padding: 11px +} + +.el-segmented--large .el-segmented__item { + border-radius: calc(var(--el-border-radius-base) - 2px); + padding: 0 11px +} + +.el-segmented--small { + border-radius: calc(var(--el-border-radius-base) - 1px); + font-size: 14px; + min-height: 24px +} + +.el-segmented--small .el-segmented__item-selected { + border-radius: calc(var(--el-border-radius-base) - 3px) +} + +.el-segmented--small .el-segmented--vertical .el-segmented__item { + padding: 7px +} + +.el-segmented--small .el-segmented__item { + border-radius: calc(var(--el-border-radius-base) - 3px); + padding: 0 7px +} + +.el-mention { + position: relative; + width: 100% +} + +.el-mention__popper.el-popper { + background: var(--el-bg-color-overlay); + box-shadow: var(--el-box-shadow-light) +} + +.el-mention__popper.el-popper, +.el-mention__popper.el-popper .el-popper__arrow:before { + border: 1px solid var(--el-border-color-light) +} + +.el-mention__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before { + border-left-color: transparent; + border-top-color: transparent +} + +.el-mention__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before { + border-bottom-color: transparent; + border-right-color: transparent +} + +.el-mention__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before { + border-bottom-color: transparent; + border-left-color: transparent +} + +.el-mention__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before { + border-right-color: transparent; + border-top-color: transparent +} + +.el-mention-dropdown { + --el-mention-font-size: var(--el-font-size-base); + --el-mention-bg-color: var(--el-bg-color-overlay); + --el-mention-shadow: var(--el-box-shadow-light); + --el-mention-border: 1px solid var(--el-border-color-light); + --el-mention-option-color: var(--el-text-color-regular); + --el-mention-option-height: 34px; + --el-mention-option-min-width: 100px; + --el-mention-option-hover-background: var(--el-fill-color-light); + --el-mention-option-selected-color: var(--el-color-primary); + --el-mention-option-disabled-color: var(--el-text-color-placeholder); + --el-mention-option-loading-color: var(--el-text-color-secondary); + --el-mention-option-loading-padding: 10px 0; + --el-mention-max-height: 174px; + --el-mention-padding: 6px 0; + --el-mention-header-padding: 10px; + --el-mention-footer-padding: 10px +} + +.el-mention-dropdown__item { + box-sizing: border-box; + color: var(--el-mention-option-color); + cursor: pointer; + font-size: var(--el-mention-font-size); + height: var(--el-mention-option-height); + line-height: var(--el-mention-option-height); + min-width: var(--el-mention-option-min-width); + overflow: hidden; + padding: 0 20px; + position: relative; + text-overflow: ellipsis; + white-space: nowrap +} + +.el-mention-dropdown__item.is-hovering { + background-color: var(--el-mention-option-hover-background) +} + +.el-mention-dropdown__item.is-selected { + color: var(--el-mention-option-selected-color); + font-weight: 700 +} + +.el-mention-dropdown__item.is-disabled { + background-color: unset; + color: var(--el-mention-option-disabled-color); + cursor: not-allowed +} + +.el-mention-dropdown { + border-radius: var(--el-border-radius-base); + box-sizing: border-box; + z-index: calc(var(--el-index-top) + 1) +} + +.el-mention-dropdown__loading { + color: var(--el-mention-option-loading-color); + font-size: 12px; + margin: 0; + min-width: var(--el-mention-option-min-width); + padding: 10px 0; + text-align: center +} + +.el-mention-dropdown__wrap { + max-height: var(--el-mention-max-height) +} + +.el-mention-dropdown__list { + box-sizing: border-box; + list-style: none; + margin: 0; + padding: var(--el-mention-padding) +} + +.el-mention-dropdown__header { + border-bottom: var(--el-mention-border); + padding: var(--el-mention-header-padding) +} + +.el-mention-dropdown__footer { + border-top: var(--el-mention-border); + padding: var(--el-mention-footer-padding) +} + +.flex, +.flex-row, +.flex-x { + display: flex; + flex-direction: row +} + +.flex-y, +.flex-column { + display: flex; + flex-direction: column +} + +.flex-x-center { + display: flex; + flex-direction: row; + justify-content: center +} + +.flex-xy-center { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center +} + +.flex-y-center { + display: flex; + flex-direction: row; + align-items: center +} + +.flex-x-left { + display: flex; + flex-direction: row +} + +.flex-x-reverse, +.flex-row-reverse { + flex-direction: row-reverse +} + +.flex-y-reverse, +.flex-column-reverse { + flex-direction: column-reverse +} + +.flex.flex-reverse, +.flex-row.flex-reverse, +.flex-x.flex-reverse { + flex-direction: row-reverse +} + +.flex-column.flex-reverse, +.flex-y.flex-reverse { + flex-direction: column-reverse +} + +.flex-fill { + flex: 1 1 auto +} + +.margin-top-auto, +.m-t-auto { + margin-top: auto !important +} + +.margin-right-auto, +.m-r-auto { + margin-right: auto !important +} + +.margin-bottom-auto, +.m-b-auto { + margin-bottom: auto !important +} + +.margin-left-auto, +.m-l-auto { + margin-left: auto !important +} + +.margin-center-auto, +.m-c-auto { + margin-left: auto !important; + margin-right: auto !important +} + +.margin-middle-auto, +.m-m-auto { + margin-top: auto !important; + margin-bottom: auto !important +} + +.flex-wrap { + flex-wrap: wrap +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse +} + +.flex-start { + justify-content: flex-start +} + +.flex-center { + justify-content: center +} + +.flex-end { + justify-content: flex-end +} + +.flex-between { + justify-content: space-between +} + +.flex-around { + justify-content: space-around +} + +.flex-items-start { + align-items: flex-start +} + +.flex-items-center { + align-items: center +} + +.flex-items-end { + align-items: flex-end +} + +.flex-items-baseline { + align-items: baseline +} + +.flex-items-stretch { + align-items: stretch +} + +.flex-self-start { + align-self: flex-start +} + +.flex-self-center { + align-self: center +} + +.flex-self-end { + align-self: flex-end +} + +.flex-self-baseline { + align-self: baseline +} + +.flex-self-stretch { + align-self: stretch +} + +.flex-content-start { + align-content: flex-start +} + +.flex-content-center { + align-content: center +} + +.flex-content-end { + align-content: flex-end +} + +.flex-content-between { + align-content: space-between +} + +.flex-content-around { + align-content: space-around +} + +.flex-middle { + justify-content: center; + align-items: center; + align-self: center; + align-content: center +} + +.flex-grow { + flex-grow: 1 +} + +.flex-shrink { + flex-shrink: 1 +} + +.margin-0, +.m-0 { + margin: 0 !important +} + +.padding-0, +.p-0 { + padding: 0 !important +} + +.m-l-0 { + margin-left: 0 !important +} + +.p-l-0 { + padding-left: 0 !important +} + +.margin-left-0 { + margin-left: 0 !important +} + +.padding-left-0 { + padding-left: 0 !important +} + +.m-t-0 { + margin-top: 0 !important +} + +.p-t-0 { + padding-top: 0 !important +} + +.margin-top-0 { + margin-top: 0 !important +} + +.padding-top-0 { + padding-top: 0 !important +} + +.m-r-0 { + margin-right: 0 !important +} + +.p-r-0 { + padding-right: 0 !important +} + +.margin-right-0 { + margin-right: 0 !important +} + +.padding-right-0 { + padding-right: 0 !important +} + +.m-b-0 { + margin-bottom: 0 !important +} + +.p-b-0 { + padding-bottom: 0 !important +} + +.margin-bottom-0 { + margin-bottom: 0 !important +} + +.padding-bottom-0 { + padding-bottom: 0 !important +} + +.margin-2, +.m-2 { + margin: 2px !important +} + +.padding-2, +.p-2 { + padding: 2px !important +} + +.m-l-2 { + margin-left: 2px !important +} + +.p-l-2 { + padding-left: 2px !important +} + +.margin-left-2 { + margin-left: 2px !important +} + +.padding-left-2 { + padding-left: 2px !important +} + +.m-t-2 { + margin-top: 2px !important +} + +.p-t-2 { + padding-top: 2px !important +} + +.margin-top-2 { + margin-top: 2px !important +} + +.padding-top-2 { + padding-top: 2px !important +} + +.m-r-2 { + margin-right: 2px !important +} + +.p-r-2 { + padding-right: 2px !important +} + +.margin-right-2 { + margin-right: 2px !important +} + +.padding-right-2 { + padding-right: 2px !important +} + +.m-b-2 { + margin-bottom: 2px !important +} + +.p-b-2 { + padding-bottom: 2px !important +} + +.margin-bottom-2 { + margin-bottom: 2px !important +} + +.padding-bottom-2 { + padding-bottom: 2px !important +} + +.margin-4, +.m-4 { + margin: 4px !important +} + +.padding-4, +.p-4 { + padding: 4px !important +} + +.m-l-4 { + margin-left: 4px !important +} + +.p-l-4 { + padding-left: 4px !important +} + +.margin-left-4 { + margin-left: 4px !important +} + +.padding-left-4 { + padding-left: 4px !important +} + +.m-t-4 { + margin-top: 4px !important +} + +.p-t-4 { + padding-top: 4px !important +} + +.margin-top-4 { + margin-top: 4px !important +} + +.padding-top-4 { + padding-top: 4px !important +} + +.m-r-4 { + margin-right: 4px !important +} + +.p-r-4 { + padding-right: 4px !important +} + +.margin-right-4 { + margin-right: 4px !important +} + +.padding-right-4 { + padding-right: 4px !important +} + +.m-b-4 { + margin-bottom: 4px !important +} + +.p-b-4 { + padding-bottom: 4px !important +} + +.margin-bottom-4 { + margin-bottom: 4px !important +} + +.padding-bottom-4 { + padding-bottom: 4px !important +} + +.margin-5, +.m-5 { + margin: 5px !important +} + +.padding-5, +.p-5 { + padding: 5px !important +} + +.m-l-5 { + margin-left: 5px !important +} + +.p-l-5 { + padding-left: 5px !important +} + +.margin-left-5 { + margin-left: 5px !important +} + +.padding-left-5 { + padding-left: 5px !important +} + +.m-t-5 { + margin-top: 5px !important +} + +.p-t-5 { + padding-top: 5px !important +} + +.margin-top-5 { + margin-top: 5px !important +} + +.padding-top-5 { + padding-top: 5px !important +} + +.m-r-5 { + margin-right: 5px !important +} + +.p-r-5 { + padding-right: 5px !important +} + +.margin-right-5 { + margin-right: 5px !important +} + +.padding-right-5 { + padding-right: 5px !important +} + +.m-b-5 { + margin-bottom: 5px !important +} + +.p-b-5 { + padding-bottom: 5px !important +} + +.margin-bottom-5 { + margin-bottom: 5px !important +} + +.padding-bottom-5 { + padding-bottom: 5px !important +} + +.margin-6, +.m-6 { + margin: 6px !important +} + +.padding-6, +.p-6 { + padding: 6px !important +} + +.m-l-6 { + margin-left: 6px !important +} + +.p-l-6 { + padding-left: 6px !important +} + +.margin-left-6 { + margin-left: 6px !important +} + +.padding-left-6 { + padding-left: 6px !important +} + +.m-t-6 { + margin-top: 6px !important +} + +.p-t-6 { + padding-top: 6px !important +} + +.margin-top-6 { + margin-top: 6px !important +} + +.padding-top-6 { + padding-top: 6px !important +} + +.m-r-6 { + margin-right: 6px !important +} + +.p-r-6 { + padding-right: 6px !important +} + +.margin-right-6 { + margin-right: 6px !important +} + +.padding-right-6 { + padding-right: 6px !important +} + +.m-b-6 { + margin-bottom: 6px !important +} + +.p-b-6 { + padding-bottom: 6px !important +} + +.margin-bottom-6 { + margin-bottom: 6px !important +} + +.padding-bottom-6 { + padding-bottom: 6px !important +} + +.margin-8, +.m-8 { + margin: 8px !important +} + +.padding-8, +.p-8 { + padding: 8px !important +} + +.m-l-8 { + margin-left: 8px !important +} + +.p-l-8 { + padding-left: 8px !important +} + +.margin-left-8 { + margin-left: 8px !important +} + +.padding-left-8 { + padding-left: 8px !important +} + +.m-t-8 { + margin-top: 8px !important +} + +.p-t-8 { + padding-top: 8px !important +} + +.margin-top-8 { + margin-top: 8px !important +} + +.padding-top-8 { + padding-top: 8px !important +} + +.m-r-8 { + margin-right: 8px !important +} + +.p-r-8 { + padding-right: 8px !important +} + +.margin-right-8 { + margin-right: 8px !important +} + +.padding-right-8 { + padding-right: 8px !important +} + +.m-b-8 { + margin-bottom: 8px !important +} + +.p-b-8 { + padding-bottom: 8px !important +} + +.margin-bottom-8 { + margin-bottom: 8px !important +} + +.padding-bottom-8 { + padding-bottom: 8px !important +} + +.margin-10, +.m-10 { + margin: 10px !important +} + +.padding-10, +.p-10 { + padding: 10px !important +} + +.m-l-10 { + margin-left: 10px !important +} + +.p-l-10 { + padding-left: 10px !important +} + +.margin-left-10 { + margin-left: 10px !important +} + +.padding-left-10 { + padding-left: 10px !important +} + +.m-t-10 { + margin-top: 10px !important +} + +.p-t-10 { + padding-top: 10px !important +} + +.margin-top-10 { + margin-top: 10px !important +} + +.padding-top-10 { + padding-top: 10px !important +} + +.m-r-10 { + margin-right: 10px !important +} + +.p-r-10 { + padding-right: 10px !important +} + +.margin-right-10 { + margin-right: 10px !important +} + +.padding-right-10 { + padding-right: 10px !important +} + +.m-b-10 { + margin-bottom: 10px !important +} + +.p-b-10 { + padding-bottom: 10px !important +} + +.margin-bottom-10 { + margin-bottom: 10px !important +} + +.padding-bottom-10 { + padding-bottom: 10px !important +} + +.margin-12, +.m-12 { + margin: 12px !important +} + +.padding-12, +.p-12 { + padding: 12px !important +} + +.m-l-12 { + margin-left: 12px !important +} + +.p-l-12 { + padding-left: 12px !important +} + +.margin-left-12 { + margin-left: 12px !important +} + +.padding-left-12 { + padding-left: 12px !important +} + +.m-t-12 { + margin-top: 12px !important +} + +.p-t-12 { + padding-top: 12px !important +} + +.margin-top-12 { + margin-top: 12px !important +} + +.padding-top-12 { + padding-top: 12px !important +} + +.m-r-12 { + margin-right: 12px !important +} + +.p-r-12 { + padding-right: 12px !important +} + +.margin-right-12 { + margin-right: 12px !important +} + +.padding-right-12 { + padding-right: 12px !important +} + +.m-b-12 { + margin-bottom: 12px !important +} + +.p-b-12 { + padding-bottom: 12px !important +} + +.margin-bottom-12 { + margin-bottom: 12px !important +} + +.padding-bottom-12 { + padding-bottom: 12px !important +} + +.margin-14, +.m-14 { + margin: 14px !important +} + +.padding-14, +.p-14 { + padding: 14px !important +} + +.m-l-14 { + margin-left: 14px !important +} + +.p-l-14 { + padding-left: 14px !important +} + +.margin-left-14 { + margin-left: 14px !important +} + +.padding-left-14 { + padding-left: 14px !important +} + +.m-t-14 { + margin-top: 14px !important +} + +.p-t-14 { + padding-top: 14px !important +} + +.margin-top-14 { + margin-top: 14px !important +} + +.padding-top-14 { + padding-top: 14px !important +} + +.m-r-14 { + margin-right: 14px !important +} + +.p-r-14 { + padding-right: 14px !important +} + +.margin-right-14 { + margin-right: 14px !important +} + +.padding-right-14 { + padding-right: 14px !important +} + +.m-b-14 { + margin-bottom: 14px !important +} + +.p-b-14 { + padding-bottom: 14px !important +} + +.margin-bottom-14 { + margin-bottom: 14px !important +} + +.padding-bottom-14 { + padding-bottom: 14px !important +} + +.margin-15, +.m-15 { + margin: 15px !important +} + +.padding-15, +.p-15 { + padding: 15px !important +} + +.m-l-15 { + margin-left: 15px !important +} + +.p-l-15 { + padding-left: 15px !important +} + +.margin-left-15 { + margin-left: 15px !important +} + +.padding-left-15 { + padding-left: 15px !important +} + +.m-t-15 { + margin-top: 15px !important +} + +.p-t-15 { + padding-top: 15px !important +} + +.margin-top-15 { + margin-top: 15px !important +} + +.padding-top-15 { + padding-top: 15px !important +} + +.m-r-15 { + margin-right: 15px !important +} + +.p-r-15 { + padding-right: 15px !important +} + +.margin-right-15 { + margin-right: 15px !important +} + +.padding-right-15 { + padding-right: 15px !important +} + +.m-b-15 { + margin-bottom: 15px !important +} + +.p-b-15 { + padding-bottom: 15px !important +} + +.margin-bottom-15 { + margin-bottom: 15px !important +} + +.padding-bottom-15 { + padding-bottom: 15px !important +} + +.margin-16, +.m-16 { + margin: 16px !important +} + +.padding-16, +.p-16 { + padding: 16px !important +} + +.m-l-16 { + margin-left: 16px !important +} + +.p-l-16 { + padding-left: 16px !important +} + +.margin-left-16 { + margin-left: 16px !important +} + +.padding-left-16 { + padding-left: 16px !important +} + +.m-t-16 { + margin-top: 16px !important +} + +.p-t-16 { + padding-top: 16px !important +} + +.margin-top-16 { + margin-top: 16px !important +} + +.padding-top-16 { + padding-top: 16px !important +} + +.m-r-16 { + margin-right: 16px !important +} + +.p-r-16 { + padding-right: 16px !important +} + +.margin-right-16 { + margin-right: 16px !important +} + +.padding-right-16 { + padding-right: 16px !important +} + +.m-b-16 { + margin-bottom: 16px !important +} + +.p-b-16 { + padding-bottom: 16px !important +} + +.margin-bottom-16 { + margin-bottom: 16px !important +} + +.padding-bottom-16 { + padding-bottom: 16px !important +} + +.margin-18, +.m-18 { + margin: 18px !important +} + +.padding-18, +.p-18 { + padding: 18px !important +} + +.m-l-18 { + margin-left: 18px !important +} + +.p-l-18 { + padding-left: 18px !important +} + +.margin-left-18 { + margin-left: 18px !important +} + +.padding-left-18 { + padding-left: 18px !important +} + +.m-t-18 { + margin-top: 18px !important +} + +.p-t-18 { + padding-top: 18px !important +} + +.margin-top-18 { + margin-top: 18px !important +} + +.padding-top-18 { + padding-top: 18px !important +} + +.m-r-18 { + margin-right: 18px !important +} + +.p-r-18 { + padding-right: 18px !important +} + +.margin-right-18 { + margin-right: 18px !important +} + +.padding-right-18 { + padding-right: 18px !important +} + +.m-b-18 { + margin-bottom: 18px !important +} + +.p-b-18 { + padding-bottom: 18px !important +} + +.margin-bottom-18 { + margin-bottom: 18px !important +} + +.padding-bottom-18 { + padding-bottom: 18px !important +} + +.margin-20, +.m-20 { + margin: 20px !important +} + +.padding-20, +.p-20 { + padding: 20px !important +} + +.m-l-20 { + margin-left: 20px !important +} + +.p-l-20 { + padding-left: 20px !important +} + +.margin-left-20 { + margin-left: 20px !important +} + +.padding-left-20 { + padding-left: 20px !important +} + +.m-t-20 { + margin-top: 20px !important +} + +.p-t-20 { + padding-top: 20px !important +} + +.margin-top-20 { + margin-top: 20px !important +} + +.padding-top-20 { + padding-top: 20px !important +} + +.m-r-20 { + margin-right: 20px !important +} + +.p-r-20 { + padding-right: 20px !important +} + +.margin-right-20 { + margin-right: 20px !important +} + +.padding-right-20 { + padding-right: 20px !important +} + +.m-b-20 { + margin-bottom: 20px !important +} + +.p-b-20 { + padding-bottom: 20px !important +} + +.margin-bottom-20 { + margin-bottom: 20px !important +} + +.padding-bottom-20 { + padding-bottom: 20px !important +} + +.margin-22, +.m-22 { + margin: 22px !important +} + +.padding-22, +.p-22 { + padding: 22px !important +} + +.m-l-22 { + margin-left: 22px !important +} + +.p-l-22 { + padding-left: 22px !important +} + +.margin-left-22 { + margin-left: 22px !important +} + +.padding-left-22 { + padding-left: 22px !important +} + +.m-t-22 { + margin-top: 22px !important +} + +.p-t-22 { + padding-top: 22px !important +} + +.margin-top-22 { + margin-top: 22px !important +} + +.padding-top-22 { + padding-top: 22px !important +} + +.m-r-22 { + margin-right: 22px !important +} + +.p-r-22 { + padding-right: 22px !important +} + +.margin-right-22 { + margin-right: 22px !important +} + +.padding-right-22 { + padding-right: 22px !important +} + +.m-b-22 { + margin-bottom: 22px !important +} + +.p-b-22 { + padding-bottom: 22px !important +} + +.margin-bottom-22 { + margin-bottom: 22px !important +} + +.padding-bottom-22 { + padding-bottom: 22px !important +} + +.margin-24, +.m-24 { + margin: 24px !important +} + +.padding-24, +.p-24 { + padding: 24px !important +} + +.m-l-24 { + margin-left: 24px !important +} + +.p-l-24 { + padding-left: 24px !important +} + +.margin-left-24 { + margin-left: 24px !important +} + +.padding-left-24 { + padding-left: 24px !important +} + +.m-t-24 { + margin-top: 24px !important +} + +.p-t-24 { + padding-top: 24px !important +} + +.margin-top-24 { + margin-top: 24px !important +} + +.padding-top-24 { + padding-top: 24px !important +} + +.m-r-24 { + margin-right: 24px !important +} + +.p-r-24 { + padding-right: 24px !important +} + +.margin-right-24 { + margin-right: 24px !important +} + +.padding-right-24 { + padding-right: 24px !important +} + +.m-b-24 { + margin-bottom: 24px !important +} + +.p-b-24 { + padding-bottom: 24px !important +} + +.margin-bottom-24 { + margin-bottom: 24px !important +} + +.padding-bottom-24 { + padding-bottom: 24px !important +} + +.margin-25, +.m-25 { + margin: 25px !important +} + +.padding-25, +.p-25 { + padding: 25px !important +} + +.m-l-25 { + margin-left: 25px !important +} + +.p-l-25 { + padding-left: 25px !important +} + +.margin-left-25 { + margin-left: 25px !important +} + +.padding-left-25 { + padding-left: 25px !important +} + +.m-t-25 { + margin-top: 25px !important +} + +.p-t-25 { + padding-top: 25px !important +} + +.margin-top-25 { + margin-top: 25px !important +} + +.padding-top-25 { + padding-top: 25px !important +} + +.m-r-25 { + margin-right: 25px !important +} + +.p-r-25 { + padding-right: 25px !important +} + +.margin-right-25 { + margin-right: 25px !important +} + +.padding-right-25 { + padding-right: 25px !important +} + +.m-b-25 { + margin-bottom: 25px !important +} + +.p-b-25 { + padding-bottom: 25px !important +} + +.margin-bottom-25 { + margin-bottom: 25px !important +} + +.padding-bottom-25 { + padding-bottom: 25px !important +} + +.margin-26, +.m-26 { + margin: 26px !important +} + +.padding-26, +.p-26 { + padding: 26px !important +} + +.m-l-26 { + margin-left: 26px !important +} + +.p-l-26 { + padding-left: 26px !important +} + +.margin-left-26 { + margin-left: 26px !important +} + +.padding-left-26 { + padding-left: 26px !important +} + +.m-t-26 { + margin-top: 26px !important +} + +.p-t-26 { + padding-top: 26px !important +} + +.margin-top-26 { + margin-top: 26px !important +} + +.padding-top-26 { + padding-top: 26px !important +} + +.m-r-26 { + margin-right: 26px !important +} + +.p-r-26 { + padding-right: 26px !important +} + +.margin-right-26 { + margin-right: 26px !important +} + +.padding-right-26 { + padding-right: 26px !important +} + +.m-b-26 { + margin-bottom: 26px !important +} + +.p-b-26 { + padding-bottom: 26px !important +} + +.margin-bottom-26 { + margin-bottom: 26px !important +} + +.padding-bottom-26 { + padding-bottom: 26px !important +} + +.margin-28, +.m-28 { + margin: 28px !important +} + +.padding-28, +.p-28 { + padding: 28px !important +} + +.m-l-28 { + margin-left: 28px !important +} + +.p-l-28 { + padding-left: 28px !important +} + +.margin-left-28 { + margin-left: 28px !important +} + +.padding-left-28 { + padding-left: 28px !important +} + +.m-t-28 { + margin-top: 28px !important +} + +.p-t-28 { + padding-top: 28px !important +} + +.margin-top-28 { + margin-top: 28px !important +} + +.padding-top-28 { + padding-top: 28px !important +} + +.m-r-28 { + margin-right: 28px !important +} + +.p-r-28 { + padding-right: 28px !important +} + +.margin-right-28 { + margin-right: 28px !important +} + +.padding-right-28 { + padding-right: 28px !important +} + +.m-b-28 { + margin-bottom: 28px !important +} + +.p-b-28 { + padding-bottom: 28px !important +} + +.margin-bottom-28 { + margin-bottom: 28px !important +} + +.padding-bottom-28 { + padding-bottom: 28px !important +} + +.margin-30, +.m-30 { + margin: 30px !important +} + +.padding-30, +.p-30 { + padding: 30px !important +} + +.m-l-30 { + margin-left: 30px !important +} + +.p-l-30 { + padding-left: 30px !important +} + +.margin-left-30 { + margin-left: 30px !important +} + +.padding-left-30 { + padding-left: 30px !important +} + +.m-t-30 { + margin-top: 30px !important +} + +.p-t-30 { + padding-top: 30px !important +} + +.margin-top-30 { + margin-top: 30px !important +} + +.padding-top-30 { + padding-top: 30px !important +} + +.m-r-30 { + margin-right: 30px !important +} + +.p-r-30 { + padding-right: 30px !important +} + +.margin-right-30 { + margin-right: 30px !important +} + +.padding-right-30 { + padding-right: 30px !important +} + +.m-b-30 { + margin-bottom: 30px !important +} + +.p-b-30 { + padding-bottom: 30px !important +} + +.margin-bottom-30 { + margin-bottom: 30px !important +} + +.padding-bottom-30 { + padding-bottom: 30px !important +} + +.margin-32, +.m-32 { + margin: 32px !important +} + +.padding-32, +.p-32 { + padding: 32px !important +} + +.m-l-32 { + margin-left: 32px !important +} + +.p-l-32 { + padding-left: 32px !important +} + +.margin-left-32 { + margin-left: 32px !important +} + +.padding-left-32 { + padding-left: 32px !important +} + +.m-t-32 { + margin-top: 32px !important +} + +.p-t-32 { + padding-top: 32px !important +} + +.margin-top-32 { + margin-top: 32px !important +} + +.padding-top-32 { + padding-top: 32px !important +} + +.m-r-32 { + margin-right: 32px !important +} + +.p-r-32 { + padding-right: 32px !important +} + +.margin-right-32 { + margin-right: 32px !important +} + +.padding-right-32 { + padding-right: 32px !important +} + +.m-b-32 { + margin-bottom: 32px !important +} + +.p-b-32 { + padding-bottom: 32px !important +} + +.margin-bottom-32 { + margin-bottom: 32px !important +} + +.padding-bottom-32 { + padding-bottom: 32px !important +} + +.margin-34, +.m-34 { + margin: 34px !important +} + +.padding-34, +.p-34 { + padding: 34px !important +} + +.m-l-34 { + margin-left: 34px !important +} + +.p-l-34 { + padding-left: 34px !important +} + +.margin-left-34 { + margin-left: 34px !important +} + +.padding-left-34 { + padding-left: 34px !important +} + +.m-t-34 { + margin-top: 34px !important +} + +.p-t-34 { + padding-top: 34px !important +} + +.margin-top-34 { + margin-top: 34px !important +} + +.padding-top-34 { + padding-top: 34px !important +} + +.m-r-34 { + margin-right: 34px !important +} + +.p-r-34 { + padding-right: 34px !important +} + +.margin-right-34 { + margin-right: 34px !important +} + +.padding-right-34 { + padding-right: 34px !important +} + +.m-b-34 { + margin-bottom: 34px !important +} + +.p-b-34 { + padding-bottom: 34px !important +} + +.margin-bottom-34 { + margin-bottom: 34px !important +} + +.padding-bottom-34 { + padding-bottom: 34px !important +} + +.margin-35, +.m-35 { + margin: 35px !important +} + +.padding-35, +.p-35 { + padding: 35px !important +} + +.m-l-35 { + margin-left: 35px !important +} + +.p-l-35 { + padding-left: 35px !important +} + +.margin-left-35 { + margin-left: 35px !important +} + +.padding-left-35 { + padding-left: 35px !important +} + +.m-t-35 { + margin-top: 35px !important +} + +.p-t-35 { + padding-top: 35px !important +} + +.margin-top-35 { + margin-top: 35px !important +} + +.padding-top-35 { + padding-top: 35px !important +} + +.m-r-35 { + margin-right: 35px !important +} + +.p-r-35 { + padding-right: 35px !important +} + +.margin-right-35 { + margin-right: 35px !important +} + +.padding-right-35 { + padding-right: 35px !important +} + +.m-b-35 { + margin-bottom: 35px !important +} + +.p-b-35 { + padding-bottom: 35px !important +} + +.margin-bottom-35 { + margin-bottom: 35px !important +} + +.padding-bottom-35 { + padding-bottom: 35px !important +} + +.margin-36, +.m-36 { + margin: 36px !important +} + +.padding-36, +.p-36 { + padding: 36px !important +} + +.m-l-36 { + margin-left: 36px !important +} + +.p-l-36 { + padding-left: 36px !important +} + +.margin-left-36 { + margin-left: 36px !important +} + +.padding-left-36 { + padding-left: 36px !important +} + +.m-t-36 { + margin-top: 36px !important +} + +.p-t-36 { + padding-top: 36px !important +} + +.margin-top-36 { + margin-top: 36px !important +} + +.padding-top-36 { + padding-top: 36px !important +} + +.m-r-36 { + margin-right: 36px !important +} + +.p-r-36 { + padding-right: 36px !important +} + +.margin-right-36 { + margin-right: 36px !important +} + +.padding-right-36 { + padding-right: 36px !important +} + +.m-b-36 { + margin-bottom: 36px !important +} + +.p-b-36 { + padding-bottom: 36px !important +} + +.margin-bottom-36 { + margin-bottom: 36px !important +} + +.padding-bottom-36 { + padding-bottom: 36px !important +} + +.margin-38, +.m-38 { + margin: 38px !important +} + +.padding-38, +.p-38 { + padding: 38px !important +} + +.m-l-38 { + margin-left: 38px !important +} + +.p-l-38 { + padding-left: 38px !important +} + +.margin-left-38 { + margin-left: 38px !important +} + +.padding-left-38 { + padding-left: 38px !important +} + +.m-t-38 { + margin-top: 38px !important +} + +.p-t-38 { + padding-top: 38px !important +} + +.margin-top-38 { + margin-top: 38px !important +} + +.padding-top-38 { + padding-top: 38px !important +} + +.m-r-38 { + margin-right: 38px !important +} + +.p-r-38 { + padding-right: 38px !important +} + +.margin-right-38 { + margin-right: 38px !important +} + +.padding-right-38 { + padding-right: 38px !important +} + +.m-b-38 { + margin-bottom: 38px !important +} + +.p-b-38 { + padding-bottom: 38px !important +} + +.margin-bottom-38 { + margin-bottom: 38px !important +} + +.padding-bottom-38 { + padding-bottom: 38px !important +} + +.margin-40, +.m-40 { + margin: 40px !important +} + +.padding-40, +.p-40 { + padding: 40px !important +} + +.m-l-40 { + margin-left: 40px !important +} + +.p-l-40 { + padding-left: 40px !important +} + +.margin-left-40 { + margin-left: 40px !important +} + +.padding-left-40 { + padding-left: 40px !important +} + +.m-t-40 { + margin-top: 40px !important +} + +.p-t-40 { + padding-top: 40px !important +} + +.margin-top-40 { + margin-top: 40px !important +} + +.padding-top-40 { + padding-top: 40px !important +} + +.m-r-40 { + margin-right: 40px !important +} + +.p-r-40 { + padding-right: 40px !important +} + +.margin-right-40 { + margin-right: 40px !important +} + +.padding-right-40 { + padding-right: 40px !important +} + +.m-b-40 { + margin-bottom: 40px !important +} + +.p-b-40 { + padding-bottom: 40px !important +} + +.margin-bottom-40 { + margin-bottom: 40px !important +} + +.padding-bottom-40 { + padding-bottom: 40px !important +} + +.margin-42, +.m-42 { + margin: 42px !important +} + +.padding-42, +.p-42 { + padding: 42px !important +} + +.m-l-42 { + margin-left: 42px !important +} + +.p-l-42 { + padding-left: 42px !important +} + +.margin-left-42 { + margin-left: 42px !important +} + +.padding-left-42 { + padding-left: 42px !important +} + +.m-t-42 { + margin-top: 42px !important +} + +.p-t-42 { + padding-top: 42px !important +} + +.margin-top-42 { + margin-top: 42px !important +} + +.padding-top-42 { + padding-top: 42px !important +} + +.m-r-42 { + margin-right: 42px !important +} + +.p-r-42 { + padding-right: 42px !important +} + +.margin-right-42 { + margin-right: 42px !important +} + +.padding-right-42 { + padding-right: 42px !important +} + +.m-b-42 { + margin-bottom: 42px !important +} + +.p-b-42 { + padding-bottom: 42px !important +} + +.margin-bottom-42 { + margin-bottom: 42px !important +} + +.padding-bottom-42 { + padding-bottom: 42px !important +} + +.margin-44, +.m-44 { + margin: 44px !important +} + +.padding-44, +.p-44 { + padding: 44px !important +} + +.m-l-44 { + margin-left: 44px !important +} + +.p-l-44 { + padding-left: 44px !important +} + +.margin-left-44 { + margin-left: 44px !important +} + +.padding-left-44 { + padding-left: 44px !important +} + +.m-t-44 { + margin-top: 44px !important +} + +.p-t-44 { + padding-top: 44px !important +} + +.margin-top-44 { + margin-top: 44px !important +} + +.padding-top-44 { + padding-top: 44px !important +} + +.m-r-44 { + margin-right: 44px !important +} + +.p-r-44 { + padding-right: 44px !important +} + +.margin-right-44 { + margin-right: 44px !important +} + +.padding-right-44 { + padding-right: 44px !important +} + +.m-b-44 { + margin-bottom: 44px !important +} + +.p-b-44 { + padding-bottom: 44px !important +} + +.margin-bottom-44 { + margin-bottom: 44px !important +} + +.padding-bottom-44 { + padding-bottom: 44px !important +} + +.margin-45, +.m-45 { + margin: 45px !important +} + +.padding-45, +.p-45 { + padding: 45px !important +} + +.m-l-45 { + margin-left: 45px !important +} + +.p-l-45 { + padding-left: 45px !important +} + +.margin-left-45 { + margin-left: 45px !important +} + +.padding-left-45 { + padding-left: 45px !important +} + +.m-t-45 { + margin-top: 45px !important +} + +.p-t-45 { + padding-top: 45px !important +} + +.margin-top-45 { + margin-top: 45px !important +} + +.padding-top-45 { + padding-top: 45px !important +} + +.m-r-45 { + margin-right: 45px !important +} + +.p-r-45 { + padding-right: 45px !important +} + +.margin-right-45 { + margin-right: 45px !important +} + +.padding-right-45 { + padding-right: 45px !important +} + +.m-b-45 { + margin-bottom: 45px !important +} + +.p-b-45 { + padding-bottom: 45px !important +} + +.margin-bottom-45 { + margin-bottom: 45px !important +} + +.padding-bottom-45 { + padding-bottom: 45px !important +} + +.margin-46, +.m-46 { + margin: 46px !important +} + +.padding-46, +.p-46 { + padding: 46px !important +} + +.m-l-46 { + margin-left: 46px !important +} + +.p-l-46 { + padding-left: 46px !important +} + +.margin-left-46 { + margin-left: 46px !important +} + +.padding-left-46 { + padding-left: 46px !important +} + +.m-t-46 { + margin-top: 46px !important +} + +.p-t-46 { + padding-top: 46px !important +} + +.margin-top-46 { + margin-top: 46px !important +} + +.padding-top-46 { + padding-top: 46px !important +} + +.m-r-46 { + margin-right: 46px !important +} + +.p-r-46 { + padding-right: 46px !important +} + +.margin-right-46 { + margin-right: 46px !important +} + +.padding-right-46 { + padding-right: 46px !important +} + +.m-b-46 { + margin-bottom: 46px !important +} + +.p-b-46 { + padding-bottom: 46px !important +} + +.margin-bottom-46 { + margin-bottom: 46px !important +} + +.padding-bottom-46 { + padding-bottom: 46px !important +} + +.margin-48, +.m-48 { + margin: 48px !important +} + +.padding-48, +.p-48 { + padding: 48px !important +} + +.m-l-48 { + margin-left: 48px !important +} + +.p-l-48 { + padding-left: 48px !important +} + +.margin-left-48 { + margin-left: 48px !important +} + +.padding-left-48 { + padding-left: 48px !important +} + +.m-t-48 { + margin-top: 48px !important +} + +.p-t-48 { + padding-top: 48px !important +} + +.margin-top-48 { + margin-top: 48px !important +} + +.padding-top-48 { + padding-top: 48px !important +} + +.m-r-48 { + margin-right: 48px !important +} + +.p-r-48 { + padding-right: 48px !important +} + +.margin-right-48 { + margin-right: 48px !important +} + +.padding-right-48 { + padding-right: 48px !important +} + +.m-b-48 { + margin-bottom: 48px !important +} + +.p-b-48 { + padding-bottom: 48px !important +} + +.margin-bottom-48 { + margin-bottom: 48px !important +} + +.padding-bottom-48 { + padding-bottom: 48px !important +} + +.margin-50, +.m-50 { + margin: 50px !important +} + +.padding-50, +.p-50 { + padding: 50px !important +} + +.m-l-50 { + margin-left: 50px !important +} + +.p-l-50 { + padding-left: 50px !important +} + +.margin-left-50 { + margin-left: 50px !important +} + +.padding-left-50 { + padding-left: 50px !important +} + +.m-t-50 { + margin-top: 50px !important +} + +.p-t-50 { + padding-top: 50px !important +} + +.margin-top-50 { + margin-top: 50px !important +} + +.padding-top-50 { + padding-top: 50px !important +} + +.m-r-50 { + margin-right: 50px !important +} + +.p-r-50 { + padding-right: 50px !important +} + +.margin-right-50 { + margin-right: 50px !important +} + +.padding-right-50 { + padding-right: 50px !important +} + +.m-b-50 { + margin-bottom: 50px !important +} + +.p-b-50 { + padding-bottom: 50px !important +} + +.margin-bottom-50 { + margin-bottom: 50px !important +} + +.padding-bottom-50 { + padding-bottom: 50px !important +} + +.margin-52, +.m-52 { + margin: 52px !important +} + +.padding-52, +.p-52 { + padding: 52px !important +} + +.m-l-52 { + margin-left: 52px !important +} + +.p-l-52 { + padding-left: 52px !important +} + +.margin-left-52 { + margin-left: 52px !important +} + +.padding-left-52 { + padding-left: 52px !important +} + +.m-t-52 { + margin-top: 52px !important +} + +.p-t-52 { + padding-top: 52px !important +} + +.margin-top-52 { + margin-top: 52px !important +} + +.padding-top-52 { + padding-top: 52px !important +} + +.m-r-52 { + margin-right: 52px !important +} + +.p-r-52 { + padding-right: 52px !important +} + +.margin-right-52 { + margin-right: 52px !important +} + +.padding-right-52 { + padding-right: 52px !important +} + +.m-b-52 { + margin-bottom: 52px !important +} + +.p-b-52 { + padding-bottom: 52px !important +} + +.margin-bottom-52 { + margin-bottom: 52px !important +} + +.padding-bottom-52 { + padding-bottom: 52px !important +} + +.margin-54, +.m-54 { + margin: 54px !important +} + +.padding-54, +.p-54 { + padding: 54px !important +} + +.m-l-54 { + margin-left: 54px !important +} + +.p-l-54 { + padding-left: 54px !important +} + +.margin-left-54 { + margin-left: 54px !important +} + +.padding-left-54 { + padding-left: 54px !important +} + +.m-t-54 { + margin-top: 54px !important +} + +.p-t-54 { + padding-top: 54px !important +} + +.margin-top-54 { + margin-top: 54px !important +} + +.padding-top-54 { + padding-top: 54px !important +} + +.m-r-54 { + margin-right: 54px !important +} + +.p-r-54 { + padding-right: 54px !important +} + +.margin-right-54 { + margin-right: 54px !important +} + +.padding-right-54 { + padding-right: 54px !important +} + +.m-b-54 { + margin-bottom: 54px !important +} + +.p-b-54 { + padding-bottom: 54px !important +} + +.margin-bottom-54 { + margin-bottom: 54px !important +} + +.padding-bottom-54 { + padding-bottom: 54px !important +} + +.margin-55, +.m-55 { + margin: 55px !important +} + +.padding-55, +.p-55 { + padding: 55px !important +} + +.m-l-55 { + margin-left: 55px !important +} + +.p-l-55 { + padding-left: 55px !important +} + +.margin-left-55 { + margin-left: 55px !important +} + +.padding-left-55 { + padding-left: 55px !important +} + +.m-t-55 { + margin-top: 55px !important +} + +.p-t-55 { + padding-top: 55px !important +} + +.margin-top-55 { + margin-top: 55px !important +} + +.padding-top-55 { + padding-top: 55px !important +} + +.m-r-55 { + margin-right: 55px !important +} + +.p-r-55 { + padding-right: 55px !important +} + +.margin-right-55 { + margin-right: 55px !important +} + +.padding-right-55 { + padding-right: 55px !important +} + +.m-b-55 { + margin-bottom: 55px !important +} + +.p-b-55 { + padding-bottom: 55px !important +} + +.margin-bottom-55 { + margin-bottom: 55px !important +} + +.padding-bottom-55 { + padding-bottom: 55px !important +} + +.margin-56, +.m-56 { + margin: 56px !important +} + +.padding-56, +.p-56 { + padding: 56px !important +} + +.m-l-56 { + margin-left: 56px !important +} + +.p-l-56 { + padding-left: 56px !important +} + +.margin-left-56 { + margin-left: 56px !important +} + +.padding-left-56 { + padding-left: 56px !important +} + +.m-t-56 { + margin-top: 56px !important +} + +.p-t-56 { + padding-top: 56px !important +} + +.margin-top-56 { + margin-top: 56px !important +} + +.padding-top-56 { + padding-top: 56px !important +} + +.m-r-56 { + margin-right: 56px !important +} + +.p-r-56 { + padding-right: 56px !important +} + +.margin-right-56 { + margin-right: 56px !important +} + +.padding-right-56 { + padding-right: 56px !important +} + +.m-b-56 { + margin-bottom: 56px !important +} + +.p-b-56 { + padding-bottom: 56px !important +} + +.margin-bottom-56 { + margin-bottom: 56px !important +} + +.padding-bottom-56 { + padding-bottom: 56px !important +} + +.margin-58, +.m-58 { + margin: 58px !important +} + +.padding-58, +.p-58 { + padding: 58px !important +} + +.m-l-58 { + margin-left: 58px !important +} + +.p-l-58 { + padding-left: 58px !important +} + +.margin-left-58 { + margin-left: 58px !important +} + +.padding-left-58 { + padding-left: 58px !important +} + +.m-t-58 { + margin-top: 58px !important +} + +.p-t-58 { + padding-top: 58px !important +} + +.margin-top-58 { + margin-top: 58px !important +} + +.padding-top-58 { + padding-top: 58px !important +} + +.m-r-58 { + margin-right: 58px !important +} + +.p-r-58 { + padding-right: 58px !important +} + +.margin-right-58 { + margin-right: 58px !important +} + +.padding-right-58 { + padding-right: 58px !important +} + +.m-b-58 { + margin-bottom: 58px !important +} + +.p-b-58 { + padding-bottom: 58px !important +} + +.margin-bottom-58 { + margin-bottom: 58px !important +} + +.padding-bottom-58 { + padding-bottom: 58px !important +} + +.margin-60, +.m-60 { + margin: 60px !important +} + +.padding-60, +.p-60 { + padding: 60px !important +} + +.m-l-60 { + margin-left: 60px !important +} + +.p-l-60 { + padding-left: 60px !important +} + +.margin-left-60 { + margin-left: 60px !important +} + +.padding-left-60 { + padding-left: 60px !important +} + +.m-t-60 { + margin-top: 60px !important +} + +.p-t-60 { + padding-top: 60px !important +} + +.margin-top-60 { + margin-top: 60px !important +} + +.padding-top-60 { + padding-top: 60px !important +} + +.m-r-60 { + margin-right: 60px !important +} + +.p-r-60 { + padding-right: 60px !important +} + +.margin-right-60 { + margin-right: 60px !important +} + +.padding-right-60 { + padding-right: 60px !important +} + +.m-b-60 { + margin-bottom: 60px !important +} + +.p-b-60 { + padding-bottom: 60px !important +} + +.margin-bottom-60 { + margin-bottom: 60px !important +} + +.padding-bottom-60 { + padding-bottom: 60px !important +} + +.margin-62, +.m-62 { + margin: 62px !important +} + +.padding-62, +.p-62 { + padding: 62px !important +} + +.m-l-62 { + margin-left: 62px !important +} + +.p-l-62 { + padding-left: 62px !important +} + +.margin-left-62 { + margin-left: 62px !important +} + +.padding-left-62 { + padding-left: 62px !important +} + +.m-t-62 { + margin-top: 62px !important +} + +.p-t-62 { + padding-top: 62px !important +} + +.margin-top-62 { + margin-top: 62px !important +} + +.padding-top-62 { + padding-top: 62px !important +} + +.m-r-62 { + margin-right: 62px !important +} + +.p-r-62 { + padding-right: 62px !important +} + +.margin-right-62 { + margin-right: 62px !important +} + +.padding-right-62 { + padding-right: 62px !important +} + +.m-b-62 { + margin-bottom: 62px !important +} + +.p-b-62 { + padding-bottom: 62px !important +} + +.margin-bottom-62 { + margin-bottom: 62px !important +} + +.padding-bottom-62 { + padding-bottom: 62px !important +} + +.margin-64, +.m-64 { + margin: 64px !important +} + +.padding-64, +.p-64 { + padding: 64px !important +} + +.m-l-64 { + margin-left: 64px !important +} + +.p-l-64 { + padding-left: 64px !important +} + +.margin-left-64 { + margin-left: 64px !important +} + +.padding-left-64 { + padding-left: 64px !important +} + +.m-t-64 { + margin-top: 64px !important +} + +.p-t-64 { + padding-top: 64px !important +} + +.margin-top-64 { + margin-top: 64px !important +} + +.padding-top-64 { + padding-top: 64px !important +} + +.m-r-64 { + margin-right: 64px !important +} + +.p-r-64 { + padding-right: 64px !important +} + +.margin-right-64 { + margin-right: 64px !important +} + +.padding-right-64 { + padding-right: 64px !important +} + +.m-b-64 { + margin-bottom: 64px !important +} + +.p-b-64 { + padding-bottom: 64px !important +} + +.margin-bottom-64 { + margin-bottom: 64px !important +} + +.padding-bottom-64 { + padding-bottom: 64px !important +} + +.margin-65, +.m-65 { + margin: 65px !important +} + +.padding-65, +.p-65 { + padding: 65px !important +} + +.m-l-65 { + margin-left: 65px !important +} + +.p-l-65 { + padding-left: 65px !important +} + +.margin-left-65 { + margin-left: 65px !important +} + +.padding-left-65 { + padding-left: 65px !important +} + +.m-t-65 { + margin-top: 65px !important +} + +.p-t-65 { + padding-top: 65px !important +} + +.margin-top-65 { + margin-top: 65px !important +} + +.padding-top-65 { + padding-top: 65px !important +} + +.m-r-65 { + margin-right: 65px !important +} + +.p-r-65 { + padding-right: 65px !important +} + +.margin-right-65 { + margin-right: 65px !important +} + +.padding-right-65 { + padding-right: 65px !important +} + +.m-b-65 { + margin-bottom: 65px !important +} + +.p-b-65 { + padding-bottom: 65px !important +} + +.margin-bottom-65 { + margin-bottom: 65px !important +} + +.padding-bottom-65 { + padding-bottom: 65px !important +} + +.margin-66, +.m-66 { + margin: 66px !important +} + +.padding-66, +.p-66 { + padding: 66px !important +} + +.m-l-66 { + margin-left: 66px !important +} + +.p-l-66 { + padding-left: 66px !important +} + +.margin-left-66 { + margin-left: 66px !important +} + +.padding-left-66 { + padding-left: 66px !important +} + +.m-t-66 { + margin-top: 66px !important +} + +.p-t-66 { + padding-top: 66px !important +} + +.margin-top-66 { + margin-top: 66px !important +} + +.padding-top-66 { + padding-top: 66px !important +} + +.m-r-66 { + margin-right: 66px !important +} + +.p-r-66 { + padding-right: 66px !important +} + +.margin-right-66 { + margin-right: 66px !important +} + +.padding-right-66 { + padding-right: 66px !important +} + +.m-b-66 { + margin-bottom: 66px !important +} + +.p-b-66 { + padding-bottom: 66px !important +} + +.margin-bottom-66 { + margin-bottom: 66px !important +} + +.padding-bottom-66 { + padding-bottom: 66px !important +} + +.margin-68, +.m-68 { + margin: 68px !important +} + +.padding-68, +.p-68 { + padding: 68px !important +} + +.m-l-68 { + margin-left: 68px !important +} + +.p-l-68 { + padding-left: 68px !important +} + +.margin-left-68 { + margin-left: 68px !important +} + +.padding-left-68 { + padding-left: 68px !important +} + +.m-t-68 { + margin-top: 68px !important +} + +.p-t-68 { + padding-top: 68px !important +} + +.margin-top-68 { + margin-top: 68px !important +} + +.padding-top-68 { + padding-top: 68px !important +} + +.m-r-68 { + margin-right: 68px !important +} + +.p-r-68 { + padding-right: 68px !important +} + +.margin-right-68 { + margin-right: 68px !important +} + +.padding-right-68 { + padding-right: 68px !important +} + +.m-b-68 { + margin-bottom: 68px !important +} + +.p-b-68 { + padding-bottom: 68px !important +} + +.margin-bottom-68 { + margin-bottom: 68px !important +} + +.padding-bottom-68 { + padding-bottom: 68px !important +} + +.margin-70, +.m-70 { + margin: 70px !important +} + +.padding-70, +.p-70 { + padding: 70px !important +} + +.m-l-70 { + margin-left: 70px !important +} + +.p-l-70 { + padding-left: 70px !important +} + +.margin-left-70 { + margin-left: 70px !important +} + +.padding-left-70 { + padding-left: 70px !important +} + +.m-t-70 { + margin-top: 70px !important +} + +.p-t-70 { + padding-top: 70px !important +} + +.margin-top-70 { + margin-top: 70px !important +} + +.padding-top-70 { + padding-top: 70px !important +} + +.m-r-70 { + margin-right: 70px !important +} + +.p-r-70 { + padding-right: 70px !important +} + +.margin-right-70 { + margin-right: 70px !important +} + +.padding-right-70 { + padding-right: 70px !important +} + +.m-b-70 { + margin-bottom: 70px !important +} + +.p-b-70 { + padding-bottom: 70px !important +} + +.margin-bottom-70 { + margin-bottom: 70px !important +} + +.padding-bottom-70 { + padding-bottom: 70px !important +} + +.margin-72, +.m-72 { + margin: 72px !important +} + +.padding-72, +.p-72 { + padding: 72px !important +} + +.m-l-72 { + margin-left: 72px !important +} + +.p-l-72 { + padding-left: 72px !important +} + +.margin-left-72 { + margin-left: 72px !important +} + +.padding-left-72 { + padding-left: 72px !important +} + +.m-t-72 { + margin-top: 72px !important +} + +.p-t-72 { + padding-top: 72px !important +} + +.margin-top-72 { + margin-top: 72px !important +} + +.padding-top-72 { + padding-top: 72px !important +} + +.m-r-72 { + margin-right: 72px !important +} + +.p-r-72 { + padding-right: 72px !important +} + +.margin-right-72 { + margin-right: 72px !important +} + +.padding-right-72 { + padding-right: 72px !important +} + +.m-b-72 { + margin-bottom: 72px !important +} + +.p-b-72 { + padding-bottom: 72px !important +} + +.margin-bottom-72 { + margin-bottom: 72px !important +} + +.padding-bottom-72 { + padding-bottom: 72px !important +} + +.margin-74, +.m-74 { + margin: 74px !important +} + +.padding-74, +.p-74 { + padding: 74px !important +} + +.m-l-74 { + margin-left: 74px !important +} + +.p-l-74 { + padding-left: 74px !important +} + +.margin-left-74 { + margin-left: 74px !important +} + +.padding-left-74 { + padding-left: 74px !important +} + +.m-t-74 { + margin-top: 74px !important +} + +.p-t-74 { + padding-top: 74px !important +} + +.margin-top-74 { + margin-top: 74px !important +} + +.padding-top-74 { + padding-top: 74px !important +} + +.m-r-74 { + margin-right: 74px !important +} + +.p-r-74 { + padding-right: 74px !important +} + +.margin-right-74 { + margin-right: 74px !important +} + +.padding-right-74 { + padding-right: 74px !important +} + +.m-b-74 { + margin-bottom: 74px !important +} + +.p-b-74 { + padding-bottom: 74px !important +} + +.margin-bottom-74 { + margin-bottom: 74px !important +} + +.padding-bottom-74 { + padding-bottom: 74px !important +} + +.margin-75, +.m-75 { + margin: 75px !important +} + +.padding-75, +.p-75 { + padding: 75px !important +} + +.m-l-75 { + margin-left: 75px !important +} + +.p-l-75 { + padding-left: 75px !important +} + +.margin-left-75 { + margin-left: 75px !important +} + +.padding-left-75 { + padding-left: 75px !important +} + +.m-t-75 { + margin-top: 75px !important +} + +.p-t-75 { + padding-top: 75px !important +} + +.margin-top-75 { + margin-top: 75px !important +} + +.padding-top-75 { + padding-top: 75px !important +} + +.m-r-75 { + margin-right: 75px !important +} + +.p-r-75 { + padding-right: 75px !important +} + +.margin-right-75 { + margin-right: 75px !important +} + +.padding-right-75 { + padding-right: 75px !important +} + +.m-b-75 { + margin-bottom: 75px !important +} + +.p-b-75 { + padding-bottom: 75px !important +} + +.margin-bottom-75 { + margin-bottom: 75px !important +} + +.padding-bottom-75 { + padding-bottom: 75px !important +} + +.margin-76, +.m-76 { + margin: 76px !important +} + +.padding-76, +.p-76 { + padding: 76px !important +} + +.m-l-76 { + margin-left: 76px !important +} + +.p-l-76 { + padding-left: 76px !important +} + +.margin-left-76 { + margin-left: 76px !important +} + +.padding-left-76 { + padding-left: 76px !important +} + +.m-t-76 { + margin-top: 76px !important +} + +.p-t-76 { + padding-top: 76px !important +} + +.margin-top-76 { + margin-top: 76px !important +} + +.padding-top-76 { + padding-top: 76px !important +} + +.m-r-76 { + margin-right: 76px !important +} + +.p-r-76 { + padding-right: 76px !important +} + +.margin-right-76 { + margin-right: 76px !important +} + +.padding-right-76 { + padding-right: 76px !important +} + +.m-b-76 { + margin-bottom: 76px !important +} + +.p-b-76 { + padding-bottom: 76px !important +} + +.margin-bottom-76 { + margin-bottom: 76px !important +} + +.padding-bottom-76 { + padding-bottom: 76px !important +} + +.margin-78, +.m-78 { + margin: 78px !important +} + +.padding-78, +.p-78 { + padding: 78px !important +} + +.m-l-78 { + margin-left: 78px !important +} + +.p-l-78 { + padding-left: 78px !important +} + +.margin-left-78 { + margin-left: 78px !important +} + +.padding-left-78 { + padding-left: 78px !important +} + +.m-t-78 { + margin-top: 78px !important +} + +.p-t-78 { + padding-top: 78px !important +} + +.margin-top-78 { + margin-top: 78px !important +} + +.padding-top-78 { + padding-top: 78px !important +} + +.m-r-78 { + margin-right: 78px !important +} + +.p-r-78 { + padding-right: 78px !important +} + +.margin-right-78 { + margin-right: 78px !important +} + +.padding-right-78 { + padding-right: 78px !important +} + +.m-b-78 { + margin-bottom: 78px !important +} + +.p-b-78 { + padding-bottom: 78px !important +} + +.margin-bottom-78 { + margin-bottom: 78px !important +} + +.padding-bottom-78 { + padding-bottom: 78px !important +} + +.margin-80, +.m-80 { + margin: 80px !important +} + +.padding-80, +.p-80 { + padding: 80px !important +} + +.m-l-80 { + margin-left: 80px !important +} + +.p-l-80 { + padding-left: 80px !important +} + +.margin-left-80 { + margin-left: 80px !important +} + +.padding-left-80 { + padding-left: 80px !important +} + +.m-t-80 { + margin-top: 80px !important +} + +.p-t-80 { + padding-top: 80px !important +} + +.margin-top-80 { + margin-top: 80px !important +} + +.padding-top-80 { + padding-top: 80px !important +} + +.m-r-80 { + margin-right: 80px !important +} + +.p-r-80 { + padding-right: 80px !important +} + +.margin-right-80 { + margin-right: 80px !important +} + +.padding-right-80 { + padding-right: 80px !important +} + +.m-b-80 { + margin-bottom: 80px !important +} + +.p-b-80 { + padding-bottom: 80px !important +} + +.margin-bottom-80 { + margin-bottom: 80px !important +} + +.padding-bottom-80 { + padding-bottom: 80px !important +} \ No newline at end of file diff --git a/src/utils/auth.js b/src/utils/auth.js new file mode 100644 index 0000000..e547b43 --- /dev/null +++ b/src/utils/auth.js @@ -0,0 +1,115 @@ +/** + * 认证工具函数 + */ + +const TOKEN_KEY = 'token' +const USER_INFO_KEY = 'user_info' + +/** + * 获取token + * @returns {string|null} + */ +export function getToken() { + return localStorage.getItem(TOKEN_KEY) +} + +/** + * 设置token + * @param {string} token + */ +export function setToken(token) { + localStorage.setItem(TOKEN_KEY, token) +} + +/** + * 移除token + */ +export function removeToken() { + localStorage.removeItem(TOKEN_KEY) +} + +/** + * 获取用户信息 + * @returns {object|null} + */ +export function getUserInfo() { + const userInfo = localStorage.getItem(USER_INFO_KEY) + return userInfo ? JSON.parse(userInfo) : null +} + +/** + * 设置用户信息 + * @param {object} userInfo + */ +export function setUserInfo(userInfo) { + localStorage.setItem(USER_INFO_KEY, JSON.stringify(userInfo)) +} + +/** + * 移除用户信息 + */ +export function removeUserInfo() { + localStorage.removeItem(USER_INFO_KEY) +} + +/** + * 登出 + */ +export function logout() { + removeToken() + removeUserInfo() + + // 清理其他相关存储 + sessionStorage.clear() + + // 重定向到登录页 + if (window.router) { + window.router.push('/login') + } +} + +/** + * 检查是否已登录 + * @returns {boolean} + */ +export function isLoggedIn() { + return !!getToken() +} + +/** + * 获取权限列表 + * @returns {array} + */ +export function getPermissions() { + const userInfo = getUserInfo() + return userInfo?.permissions || [] +} + +/** + * 检查是否有权限 + * @param {string} permission - 权限标识 + * @returns {boolean} + */ +export function hasPermission(permission) { + const permissions = getPermissions() + return permissions.includes(permission) +} + +/** + * 获取用户角色 + * @returns {array} + */ +export function getRoles() { + const userInfo = getUserInfo() + return userInfo?.roles || [] +} + +/** + * 检查是否有角色 + * @param {string} role - 角色标识 + * @returns {boolean} + */ +export function hasRole(role) { + const roles = getRoles() + return roles.includes(role) +} \ No newline at end of file diff --git a/src/utils/constants.js b/src/utils/constants.js new file mode 100644 index 0000000..3f0a184 --- /dev/null +++ b/src/utils/constants.js @@ -0,0 +1,121 @@ +// 通用常量定义 +export const API_BASE_URL = '/dxsz_client_api'; + +// 设备相关常量 +export const DEVICE_TYPES = { + HUB: 'hub', + CA_DEVICE: 'ca_device' +}; + +// 连接状态 +export const CONNECTION_STATUS = { + CONNECTED: 'connected', + DISCONNECTED: 'disconnected', + CONNECTING: 'connecting' +}; + +// 错误码 +export const ERROR_CODES = { + NETWORK_ERROR: 500, + AUTH_ERROR: 401, + NOT_FOUND: 404, + BUSINESS_ERROR: 402 +}; + +// 时间相关 +export const TIMEOUT_SECONDS = 300; +export const RECONNECT_INTERVAL = 2000; + +// 系统检测项目 +export const SYSTEM_CHECK_ITEMS = { + HOST_NAME: 'host_name', + NETWORK_STATE: 'network_state', + FIREWALL_STATUS: 'firewall_status', + FILES_EXIST: 'files_exist', + CERTIFICATE_EXIST: 'certificate_exist', + TEST_PATTERN: 'test_pattern', + DRIVE_EXIST: 'drive_exist', + OWNERSHIP: 'ownership', + WEB_SERVE: 'web_serve', + SOCKET_SERVE: 'socket_serve', + PROGRAM_INTEGRITY: 'program_integrity' +}; + +// 文件路径 +export const FILE_PATHS = { + CORE_PROGRAM: 'release/1.0.0/win-unpacked/云企通安全云锁客户端.exe', + DRIVER_FILE: 'C:/Windows/System32/drivers/usbip_vhci_ude.sys', + CERTIFICATE: 'USBIP Test' +}; + +// API端点 +export const API_ENDPOINTS = { + AUTH: { + LOGIN: '/auth/login', + PHONE_LOGIN: '/auth/phone_login', + COMPANY_LOGIN: '/auth/company_login', + SET_LOGIN_CACHE: '/auth/set_login_cache', + LOGOUT: '/auth/logout' + }, + USER: { + INFO: '/user/info', + COMPANY_LIST: '/user/company_list', + GET_USER_ID: '/user/get_user_id_by_login', + CHANGE_PASSWORD: '/user/change_password', + UPDATE: '/user', + MY_RULE: '/user/my_rule', + GET_USER_CONNECT_DATA: '/user/get_user_connect_data' + }, + COMPANY: { + INFO: '/company_user/info', + SWITCH: '/auth/company_login', + LIST: '/company/list', + INFO_DETAIL: '/company/info' + }, + DEVICE: { + LIST: '/ca_device_server/get_all_hub_device_list_by_group_v2', + TYPES: '/ca_relation_device/type_list', + CONNECT: '/ca_use_approve/connect_ca_relation_device_list_v2', + LOGS: '/ca_use_logs/get_user_use_device_log_list_v2', + APPROVE: '/ca_use_approve/add', + REVOKE: '/ca_use_approve/revoke', + PURPOSE_LIST: '/ca_use_approve/purpose_list', + TIME_LIST: '/ca_use_approve/device_use_time_list', + PORT_LIST: '/ca_device_server/get_port_list', + PORT_STATUS: '/ca_device_server/get_port_status', + // CA关系设备相关 + CA_CONNECT: '/ca_relation_device/connect', + CA_DISCONNECT: '/ca_relation_device/disconnect', + CA_CHANGE: '/ca_relation_device/change', + CA_LIST: '/ca_relation_device/list', + CA_INFO: '/ca_relation_device/info', + CA_ADD: '/ca_relation_device/add', + CA_UPDATE: '/ca_relation_device/update', + CA_DELETE: '/ca_relation_device/delete', + CA_FORCE_DISCONNECT: '/ca_relation_device/force_disconnect', + CA_REQUEST_CONNECT: '/ca_relation_device/request_connect', + CA_GET_ALL_HUB_DEVICE_LIST_BY_GROUP: '/ca_relation_device/get_all_hub_device_list_by_group_v2', + CA_GET_DEVICE_TIME_LIST: '/ca_relation_device/get_device_time_list', + CA_CONNECT_DEVICE_LIST: '/ca_relation_device/connect_ca_relation_device_list_v2', + CA_GET_RELATION_DEVICE_LIST_BY_GROUP: '/ca_relation_device/get_relation_device_list_by_group' + }, + COMMON: { + VERIFICATION_CODE: '/common/verification_code', + WECHAT_QRCODE: '/wechat_mini_program/create_qrcode', + CHECK_SCAN: '/wechat_mini_program/check_scan_status' + }, + AUTHORIZATION_CENTER: { + USER_LIST: '/authorization_center/authorization_center_user_list', + USER_DELETE: '/authorization_center/authorization_center_user_delete', + USER_ADD: '/authorization_center/authorization_center_user_add', + USER_INFO: '/authorization_center/authorization_center_user_info', + USER_EDIT: '/authorization_center/authorization_center_user_edit', + IMPORT: '/authorization_center/import' + }, + SYSTEM: { + GET_VERSION: '/get_version', + VERSION_REPORT: '/version_report', + CHECK_UPDATE: '/check_update', + DOWNLOAD_UPDATE: '/download' + } +}; \ No newline at end of file diff --git a/src/utils/credentials.js b/src/utils/credentials.js new file mode 100644 index 0000000..11835fb --- /dev/null +++ b/src/utils/credentials.js @@ -0,0 +1,74 @@ +/** + * 凭证管理工具 + * 用于在Electron环境下保存、获取和删除用户凭证 + */ + +const { ipcRenderer } = window.require ? window.require('electron') : { ipcRenderer: null } + +/** + * 保存用户凭证 + * @param {string} username - 用户名 + * @param {string} password - 密码 + * @returns {Promise} + */ +export async function saveCredentials(username, password) { + if (!ipcRenderer) { + console.warn('Electron环境未找到,使用localStorage替代') + localStorage.setItem('credentials', JSON.stringify({ username, password })) + return + } + + try { + await ipcRenderer.invoke('save-credentials', { username, password }) + } catch (error) { + console.error('保存凭证失败:', error) + throw error + } +} + +/** + * 获取用户凭证 + * @returns {Promise<{username: string, password: string}|null>} + */ +export async function getCredentials() { + if (!ipcRenderer) { + console.warn('Electron环境未找到,使用localStorage替代') + const credentials = localStorage.getItem('credentials') + return credentials ? JSON.parse(credentials) : null + } + + try { + return await ipcRenderer.invoke('get-credentials') + } catch (error) { + console.error('获取凭证失败:', error) + return null + } +} + +/** + * 删除用户凭证 + * @returns {Promise} + */ +export async function clearCredentials() { + if (!ipcRenderer) { + console.warn('Electron环境未找到,使用localStorage替代') + localStorage.removeItem('credentials') + return + } + + try { + await ipcRenderer.invoke('delete-credentials') + } catch (error) { + console.error('删除凭证失败:', error) + throw error + } +} + +/** + * 检查是否有保存的凭证 + * @returns {Promise} + */ +export async function hasCredentials() { + const credentials = await getCredentials() + return credentials !== null && credentials.username && credentials.password +} \ No newline at end of file diff --git a/src/utils/device-connection-manager.js b/src/utils/device-connection-manager.js new file mode 100644 index 0000000..bc7c85f --- /dev/null +++ b/src/utils/device-connection-manager.js @@ -0,0 +1,410 @@ +/** + * 设备连接管理工具类 + * 处理设备连接、状态监控、超时处理、重连机制等 + */ + +import { store } from '../store/index.js'; +import networkManager from './network-manager.js'; +import wsClient from './websocket-client.js'; + +class DeviceConnectionManager { + constructor() { + this.activeConnections = new Map(); + this.connectionTimeouts = new Map(); + this.heartbeatIntervals = new Map(); + this.reconnectAttempts = new Map(); + this.maxReconnectAttempts = 3; + this.defaultTimeout = 300000; // 5分钟 + this.heartbeatInterval = 30000; // 30秒 + } + + /** + * 连接设备 + */ + async connectDevice(deviceId, options = {}) { + const { + timeout = this.defaultTimeout, + autoReconnect = true, + showNotification = true + } = options; + + try { + // 检查网络连接 + const networkStatus = await networkManager.checkNetworkConnection(); + if (networkStatus.status !== 'connected') { + throw new Error('网络连接不可用'); + } + + // 检查设备是否已连接 + if (this.activeConnections.has(deviceId)) { + console.log(`设备 ${deviceId} 已连接`); + return this.activeConnections.get(deviceId); + } + + // 更新Vuex状态 + store.commit('device/UPDATE_DEVICE_STATUS', { + deviceId, + status: 'connecting' + }); + + // 调用API连接设备 + const response = await store.dispatch('device/connectToDevice', { + deviceId, + timeout + }); + + if (response.success) { + // 建立连接 + this.activeConnections.set(deviceId, { + deviceId, + connectedAt: new Date(), + timeout, + autoReconnect, + ...response.data + }); + + // 设置超时处理 + this.setupConnectionTimeout(deviceId, timeout); + + // 启动心跳检测 + this.startHeartbeat(deviceId); + + // 订阅WebSocket消息 + this.subscribeToDeviceUpdates(deviceId); + + // 更新Vuex状态 + store.commit('device/ADD_CONNECTED_DEVICE', { + deviceId, + status: 'connected', + connectedAt: new Date() + }); + + if (showNotification) { + this.showNotification('设备连接成功', `设备 ${deviceId} 已连接`); + } + + return { + success: true, + deviceId, + connection: this.activeConnections.get(deviceId) + }; + } else { + throw new Error(response.message || '连接失败'); + } + } catch (error) { + console.error('连接设备失败:', error); + + // 更新Vuex状态 + store.commit('device/UPDATE_DEVICE_STATUS', { + deviceId, + status: 'disconnected', + error: error.message + }); + + if (autoReconnect && this.reconnectAttempts.get(deviceId) < this.maxReconnectAttempts) { + this.scheduleReconnect(deviceId, options); + } + + throw error; + } + } + + /** + * 断开设备连接 + */ + async disconnectDevice(deviceId, reason = '用户主动断开') { + try { + // 清除超时定时器 + this.clearConnectionTimeout(deviceId); + + // 清除心跳检测 + this.stopHeartbeat(deviceId); + + // 取消WebSocket订阅 + this.unsubscribeFromDeviceUpdates(deviceId); + + // 调用API断开连接 + await store.dispatch('device/disconnectDevice', deviceId); + + // 移除连接记录 + this.activeConnections.delete(deviceId); + this.reconnectAttempts.delete(deviceId); + + // 更新Vuex状态 + store.commit('device/UPDATE_DEVICE_STATUS', { + deviceId, + status: 'disconnected', + disconnectedAt: new Date(), + reason + }); + + this.showNotification('设备已断开', `设备 ${deviceId} 已断开连接`); + + return { + success: true, + deviceId, + reason + }; + } catch (error) { + console.error('断开设备连接失败:', error); + throw error; + } + } + + /** + * 设置连接超时 + */ + setupConnectionTimeout(deviceId, timeout) { + this.clearConnectionTimeout(deviceId); + + const timeoutId = setTimeout(() => { + this.handleConnectionTimeout(deviceId); + }, timeout); + + this.connectionTimeouts.set(deviceId, timeoutId); + } + + /** + * 清除连接超时 + */ + clearConnectionTimeout(deviceId) { + const timeoutId = this.connectionTimeouts.get(deviceId); + if (timeoutId) { + clearTimeout(timeoutId); + this.connectionTimeouts.delete(deviceId); + } + } + + /** + * 处理连接超时 + */ + async handleConnectionTimeout(deviceId) { + console.warn(`设备 ${deviceId} 连接超时`); + + // 更新Vuex状态 + store.commit('device/UPDATE_DEVICE_STATUS', { + deviceId, + status: 'timeout', + timeoutAt: new Date() + }); + + // 显示超时弹窗 + this.showTimeoutModal(deviceId); + + // 自动重连 + const connection = this.activeConnections.get(deviceId); + if (connection && connection.autoReconnect) { + this.scheduleReconnect(deviceId); + } + } + + /** + * 启动心跳检测 + */ + startHeartbeat(deviceId) { + this.stopHeartbeat(deviceId); + + const intervalId = setInterval(async () => { + try { + const isAlive = await this.checkDeviceHeartbeat(deviceId); + if (!isAlive) { + console.warn(`设备 ${deviceId} 心跳检测失败`); + this.handleConnectionLost(deviceId); + } + } catch (error) { + console.error('心跳检测错误:', error); + } + }, this.heartbeatInterval); + + this.heartbeatIntervals.set(deviceId, intervalId); + } + + /** + * 停止心跳检测 + */ + stopHeartbeat(deviceId) { + const intervalId = this.heartbeatIntervals.get(deviceId); + if (intervalId) { + clearInterval(intervalId); + this.heartbeatIntervals.delete(deviceId); + } + } + + /** + * 检查设备心跳 + */ + async checkDeviceHeartbeat(deviceId) { + try { + const response = await store.dispatch('device/checkDeviceStatus', deviceId); + return response.success && response.data.status === 'connected'; + } catch (error) { + return false; + } + } + + /** + * 处理连接丢失 + */ + async handleConnectionLost(deviceId) { + console.error(`设备 ${deviceId} 连接丢失`); + + // 更新状态 + store.commit('device/UPDATE_DEVICE_STATUS', { + deviceId, + status: 'lost', + lostAt: new Date() + }); + + // 尝试重连 + const connection = this.activeConnections.get(deviceId); + if (connection && connection.autoReconnect) { + this.scheduleReconnect(deviceId); + } + } + + /** + * 计划重连 + */ + scheduleReconnect(deviceId, options = {}) { + const attempts = this.reconnectAttempts.get(deviceId) || 0; + + if (attempts >= this.maxReconnectAttempts) { + console.warn(`设备 ${deviceId} 重连次数已达上限`); + return; + } + + this.reconnectAttempts.set(deviceId, attempts + 1); + + const delay = Math.pow(2, attempts) * 1000; // 指数退避 + + setTimeout(async () => { + try { + console.log(`尝试重连设备 ${deviceId} (第${attempts + 1}次)`); + await this.connectDevice(deviceId, { ...options, autoReconnect: true }); + this.reconnectAttempts.delete(deviceId); // 重置重连计数 + } catch (error) { + console.error('重连失败:', error); + } + }, delay); + } + + /** + * 订阅设备更新 + */ + subscribeToDeviceUpdates(deviceId) { + wsClient.on('deviceStatus', (data) => { + if (data.deviceId === deviceId) { + this.handleDeviceStatusUpdate(deviceId, data); + } + }); + } + + /** + * 取消订阅设备更新 + */ + unsubscribeFromDeviceUpdates(deviceId) { + // WebSocket客户端会自动处理事件清理 + } + + /** + * 处理设备状态更新 + */ + handleDeviceStatusUpdate(deviceId, data) { + store.commit('device/UPDATE_DEVICE_STATUS', { + deviceId, + ...data + }); + } + + /** + * 显示通知 + */ + showNotification(title, message) { + if (window.electronAPI && window.electronAPI.notification) { + window.electronAPI.notification.show({ title, message }); + } + } + + /** + * 显示超时弹窗 + */ + showTimeoutModal(deviceId) { + store.commit('app/SHOW_TIMEOUT_MODAL', { + deviceId, + visible: true + }); + } + + /** + * 获取所有活跃连接 + */ + getActiveConnections() { + return Array.from(this.activeConnections.values()); + } + + /** + * 获取设备连接状态 + */ + getDeviceConnectionStatus(deviceId) { + const connection = this.activeConnections.get(deviceId); + const vuexDevice = store.getters['device/getDeviceById'](deviceId); + + return { + deviceId, + isConnected: !!connection, + connection, + vuexStatus: vuexDevice?.status || 'unknown', + lastHeartbeat: connection?.lastHeartbeat || null + }; + } + + /** + * 批量检查设备连接状态 + */ + async checkDevicesStatus(deviceIds) { + const results = []; + + for (const deviceId of deviceIds) { + try { + const status = await this.getDeviceConnectionStatus(deviceId); + results.push(status); + } catch (error) { + results.push({ + deviceId, + error: error.message + }); + } + } + + return results; + } + + /** + * 断开所有设备连接 + */ + async disconnectAllDevices(reason = '应用关闭') { + const deviceIds = Array.from(this.activeConnections.keys()); + const results = []; + + for (const deviceId of deviceIds) { + try { + const result = await this.disconnectDevice(deviceId, reason); + results.push(result); + } catch (error) { + results.push({ + deviceId, + success: false, + error: error.message + }); + } + } + + return results; + } +} + +// 创建单例实例 +const deviceConnectionManager = new DeviceConnectionManager(); + +export default deviceConnectionManager; +export { DeviceConnectionManager }; \ No newline at end of file diff --git a/src/utils/device.js b/src/utils/device.js new file mode 100644 index 0000000..7079a83 --- /dev/null +++ b/src/utils/device.js @@ -0,0 +1,252 @@ +/** + * 设备管理工具函数 + * 包含设备状态判断、时间格式化、类型映射等功能 + */ + +// 设备类型映射 +export const DEVICE_TYPES = { + 1: { name: '手机', icon: 'el-icon-mobile-phone', color: '#409EFF' }, + 2: { name: '平板', icon: 'el-icon-monitor', color: '#67C23A' }, + 3: { name: '路由器', icon: 'el-icon-connection', color: '#E6A23C' }, + 4: { name: '摄像头', icon: 'el-icon-video-camera', color: '#F56C6C' }, + 5: { name: '其他', icon: 'el-icon-cpu', color: '#909399' } +} + +// 使用方式映射 +export const USE_MODES = { + 1: { name: '共享', type: 'success', description: '所有用户可连接' }, + 2: { name: '审批', type: 'warning', description: '需要管理员审批' } +} + +// 设备状态映射 +export const DEVICE_STATUS = { + IDLE: { name: '空闲', type: 'success', color: '#67C23A' }, + OCCUPIED: { name: '占用中', type: 'danger', color: '#F56C6C' }, + PENDING: { name: '待审批', type: 'warning', color: '#E6A23C' }, + CONNECTING: { name: '连接中', type: 'info', color: '#909399' } +} + +/** + * 获取设备类型信息 + * @param {number} type 设备类型ID + * @returns {Object} 设备类型信息 + */ +export function getDeviceTypeInfo(type) { + return DEVICE_TYPES[type] || DEVICE_TYPES[5] +} + +/** + * 获取使用方式信息 + * @param {number} mode 使用方式ID + * @returns {Object} 使用方式信息 + */ +export function getUseModeInfo(mode) { + return USE_MODES[mode] || USE_MODES[1] +} + +/** + * 获取设备状态信息 + * @param {Object} device 设备对象 + * @returns {Object} 设备状态信息 + */ +export function getDeviceStatusInfo(device) { + if (device.connect_user_id) { + return DEVICE_STATUS.OCCUPIED + } + return DEVICE_STATUS.IDLE +} + +/** + * 格式化连接时长 + * @param {number} startTime 开始时间戳 + * @returns {string} 格式化后的时长 + */ +export function formatDuration(startTime) { + if (!startTime) return '-' + + const now = Date.now() + const duration = Math.floor((now - startTime) / 1000) + + if (duration < 60) return `${duration}秒` + if (duration < 3600) return `${Math.floor(duration / 60)}分钟` + if (duration < 86400) return `${Math.floor(duration / 3600)}小时` + return `${Math.floor(duration / 86400)}天` +} + +/** + * 格式化日期时间 + * @param {number} timestamp 时间戳 + * @returns {string} 格式化后的日期时间 + */ +export function formatDateTime(timestamp) { + if (!timestamp) return '-' + + const date = new Date(timestamp) + return date.toLocaleString('zh-CN', { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit' + }) +} + +/** + * 判断用户是否有权限操作设备 + * @param {Object} device 设备对象 + * @param {number} userId 当前用户ID + * @param {boolean} isAdmin 是否为管理员 + * @returns {boolean} 是否有权限 + */ +export function hasDevicePermission(device, userId, isAdmin = false) { + if (!device || !userId) return false + + // 管理员有全部权限 + if (isAdmin) return true + + // 设备空闲时所有用户可连接 + if (!device.connect_user_id) return true + + // 设备占用时只有当前连接用户可断开 + return device.connect_user_id === userId +} + +/** + * 获取设备状态颜色 + * @param {Object} device 设备对象 + * @returns {string} 状态颜色 + */ +export function getDeviceStatusColor(device) { + const status = getDeviceStatusInfo(device) + return status.color +} + +/** + * 获取设备状态文本 + * @param {Object} device 设备对象 + * @returns {string} 状态文本 + */ +export function getDeviceStatusText(device) { + const status = getDeviceStatusInfo(device) + return status.name +} + +/** + * 获取设备状态类型 + * @param {Object} device 设备对象 + * @returns {string} 状态类型 + */ +export function getDeviceStatusType(device) { + const status = getDeviceStatusInfo(device) + return status.type +} + +/** + * 生成设备唯一标识 + * @param {Object} device 设备对象 + * @returns {string} 设备标识 + */ +export function generateDeviceKey(device) { + return `device_${device.id}_${device.port_name}` +} + +/** + * 验证设备表单数据 + * @param {Object} form 表单数据 + * @returns {Object} 验证结果 + */ +export function validateDeviceForm(form) { + const errors = [] + + if (!form.name || form.name.trim().length < 2) { + errors.push('设备名称不能为空且至少2个字符') + } + + if (!form.port_name || form.port_name.trim().length < 1) { + errors.push('端口名称不能为空') + } + + if (!form.type || !DEVICE_TYPES[form.type]) { + errors.push('请选择有效的设备类型') + } + + if (![1, 2].includes(form.use_mode)) { + errors.push('请选择有效的使用方式') + } + + return { + valid: errors.length === 0, + errors + } +} + +/** + * 创建设备筛选条件 + * @param {Object} filters 筛选条件 + * @returns {Object} 格式化后的筛选条件 + */ +export function createDeviceFilters(filters) { + const result = {} + + if (filters.name) result.name = filters.name.trim() + if (filters.port_name) result.port_name = filters.port_name.trim() + if (filters.type) result.type = filters.type + if (filters.use_mode) result.use_mode = filters.use_mode + if (filters.status !== undefined) result.status = filters.status + + return result +} + +/** + * 计算设备使用统计 + * @param {Array} devices 设备列表 + * @returns {Object} 统计信息 + */ +export function calculateDeviceStats(devices) { + if (!Array.isArray(devices)) return { total: 0, idle: 0, occupied: 0 } + + const total = devices.length + const idle = devices.filter(d => !d.connect_user_id).length + const occupied = total - idle + + return { + total, + idle, + occupied, + idleRate: total > 0 ? (idle / total * 100).toFixed(1) : 0, + occupiedRate: total > 0 ? (occupied / total * 100).toFixed(1) : 0 + } +} + +/** + * 设备排序函数 + * @param {Array} devices 设备列表 + * @param {string} sortBy 排序字段 + * @param {string} order 排序顺序(asc/desc) + * @returns {Array} 排序后的设备列表 + */ +export function sortDevices(devices, sortBy = 'name', order = 'asc') { + if (!Array.isArray(devices)) return [] + + const sorted = [...devices].sort((a, b) => { + let valueA = a[sortBy] + let valueB = b[sortBy] + + if (sortBy === 'connect_time') { + valueA = valueA || 0 + valueB = valueB || 0 + } + + if (typeof valueA === 'string') { + valueA = valueA.toLowerCase() + valueB = valueB.toLowerCase() + } + + if (valueA < valueB) return order === 'asc' ? -1 : 1 + if (valueA > valueB) return order === 'asc' ? 1 : -1 + return 0 + }) + + return sorted +} \ No newline at end of file diff --git a/src/utils/file-logger.js b/src/utils/file-logger.js new file mode 100644 index 0000000..8ff9beb --- /dev/null +++ b/src/utils/file-logger.js @@ -0,0 +1,249 @@ +/** + * 文件日志管理工具类 + * 处理基于文件系统的日志管理,包括日志文件创建、清理、写入等功能 + * 从混淆代码中提取的业务逻辑 + */ + +import path from 'path'; +import fs from 'fs'; +import dayjs from 'dayjs'; + +class FileLogger { + constructor() { + this.logsDir = path.join(process.cwd(), 'logs'); + this.logQueue = []; + this.maxLogAge = 7; // 7天 + this.isInitialized = false; + } + + /** + * 初始化日志目录 + */ + async init() { + try { + if (!fs.existsSync(this.logsDir)) { + await fs.promises.mkdir(this.logsDir, { recursive: true }); + } + this.isInitialized = true; + } catch (error) { + console.error('初始化日志目录失败:', error); + throw error; + } + } + + /** + * 清理7天前的日志文件 + */ + async cleanOldLogs() { + try { + await this.init(); + + const files = await fs.promises.readdir(this.logsDir); + const cutoffDate = dayjs().subtract(this.maxLogAge, 'day'); + + for (const file of files) { + const filePath = path.join(this.logsDir, file); + const stats = await fs.promises.stat(filePath); + + if (dayjs(stats.ctime).isBefore(cutoffDate)) { + await fs.promises.unlink(filePath); + console.log(`已删除旧日志文件: ${file}`); + } + } + } catch (error) { + console.error('清理旧日志失败:', error); + } + } + + /** + * 写入日志到文件 + */ + async writeToFile() { + if (this.logQueue.length === 0) return; + + try { + await this.init(); + await this.cleanOldLogs(); + + const today = dayjs().format('YYYY-MM-DD'); + const logFile = path.join(this.logsDir, `${today}.log`); + + // 读取现有内容 + let existingContent = ''; + try { + existingContent = await fs.promises.readFile(logFile, 'utf-8'); + } catch (error) { + // 文件不存在,创建新文件 + } + + // 格式化日志内容 + const logContent = this.logQueue.map(log => + `[${log.timestamp}] [${log.level.toUpperCase()}] ${log.message}` + ).join('\n'); + + // 写入文件 + await fs.promises.writeFile(logFile, `${existingContent}\n${logContent}`.trim()); + + // 清空队列 + this.logQueue.length = 0; + + } catch (error) { + console.error('写入日志文件失败:', error); + } + } + + /** + * 记录日志 + */ + async log(message, level = 'debug') { + const logEntry = { + timestamp: dayjs().format('YYYY-MM-DD HH:mm:ss'), + level, + message: typeof message === 'object' ? JSON.stringify(message) : String(message) + }; + + this.logQueue.push(logEntry); + + // 立即写入文件 + await this.writeToFile(); + } + + /** + * 记录错误日志 + */ + async error(message, error = null) { + const errorMessage = error ? `${message} - ${error.message}\n${error.stack}` : message; + await this.log(errorMessage, 'error'); + } + + /** + * 记录警告日志 + */ + async warn(message) { + await this.log(message, 'warn'); + } + + /** + * 记录信息日志 + */ + async info(message) { + await this.log(message, 'info'); + } + + /** + * 记录调试日志 + */ + async debug(message) { + await this.log(message, 'debug'); + } + + /** + * 获取指定日期的日志 + */ + async getLogs(date = null) { + try { + await this.init(); + + const targetDate = date ? dayjs(date).format('YYYY-MM-DD') : dayjs().format('YYYY-MM-DD'); + const logFile = path.join(this.logsDir, `${targetDate}.log`); + + if (!fs.existsSync(logFile)) { + return []; + } + + const content = await fs.promises.readFile(logFile, 'utf-8'); + return content.split('\n').filter(line => line.trim()); + + } catch (error) { + console.error('读取日志文件失败:', error); + return []; + } + } + + /** + * 获取所有日志文件列表 + */ + async getLogFiles() { + try { + await this.init(); + + const files = await fs.promises.readdir(this.logsDir); + return files + .filter(file => file.endsWith('.log')) + .map(file => ({ + name: file, + path: path.join(this.logsDir, file), + date: file.replace('.log', ''), + size: fs.statSync(path.join(this.logsDir, file)).size + })) + .sort((a, b) => b.date.localeCompare(a.date)); + + } catch (error) { + console.error('获取日志文件列表失败:', error); + return []; + } + } + + /** + * 导出日志文件 + */ + async exportLogs(startDate = null, endDate = null) { + try { + const files = await this.getLogFiles(); + let allLogs = []; + + for (const file of files) { + const fileDate = dayjs(file.date); + + if (startDate && fileDate.isBefore(dayjs(startDate))) continue; + if (endDate && fileDate.isAfter(dayjs(endDate))) continue; + + const logs = await this.getLogs(file.date); + allLogs = allLogs.concat(logs); + } + + return allLogs; + + } catch (error) { + console.error('导出日志失败:', error); + return []; + } + } + + /** + * 清空所有日志 + */ + async clearAllLogs() { + try { + await this.init(); + + const files = await fs.promises.readdir(this.logsDir); + for (const file of files) { + if (file.endsWith('.log')) { + await fs.promises.unlink(path.join(this.logsDir, file)); + } + } + + console.log('已清空所有日志文件'); + } catch (error) { + console.error('清空日志失败:', error); + } + } +} + +// 创建单例实例 +const fileLogger = new FileLogger(); + +// 快捷方法 +const fileLog = { + error: fileLogger.error.bind(fileLogger), + warn: fileLogger.warn.bind(fileLogger), + info: fileLogger.info.bind(fileLogger), + debug: fileLogger.debug.bind(fileLogger), + clean: fileLogger.cleanOldLogs.bind(fileLogger), + export: fileLogger.exportLogs.bind(fileLogger), + clear: fileLogger.clearAllLogs.bind(fileLogger) +}; + +export default fileLogger; +export { FileLogger, fileLog }; \ No newline at end of file diff --git a/src/utils/index.js b/src/utils/index.js new file mode 100644 index 0000000..e7af905 --- /dev/null +++ b/src/utils/index.js @@ -0,0 +1,184 @@ +/** + * 工具类导出文件 + * 统一导出所有工具类,方便在项目中使用 + */ + +// 网络管理 +export { default as networkManager } from './network-manager.js'; +export { NetworkManager } from './network-manager.js'; + +// WebSocket客户端 +export { default as wsClient } from './websocket-client.js'; +export { WebSocketClient } from './websocket-client.js'; + +// 设备连接管理 +export { default as deviceConnectionManager } from './device-connection-manager.js'; +export { DeviceConnectionManager } from './device-connection-manager.js'; + +// 通知管理 +export { default as notificationManager } from './notification-manager.js'; +export { NotificationManager } from './notification-manager.js'; + +// 日志管理 +export { default as logger, log } from './logger.js'; +export { Logger } from './logger.js'; + +// 系统检测 +export { + checkNetworkConnectionState, + checkSystemHostName, + checkSystemFirewallStatus, + checkCoreProgramFiles, + checkSystemCertificate, + checkSystemTestMode, + checkSystemDriver, + checkSystemAdminRights, + checkPortService, + performSystemCheck +} from './system-check.js'; + +// 重新导出现有的工具 +export { default as request } from './request.js'; +export { validateForm } from './validation.js'; +export { encrypt, decrypt } from './crypto.js'; +export { getDeviceMacAddress } from './device.js'; + +// 工具函数集合 +export const utils = { + // 延迟函数 + delay: (ms) => new Promise(resolve => setTimeout(resolve, ms)), + + // 防抖函数 + debounce: (func, wait) => { + let timeout; + return function executedFunction(...args) { + const later = () => { + clearTimeout(timeout); + func(...args); + }; + clearTimeout(timeout); + timeout = setTimeout(later, wait); + }; + }, + + // 节流函数 + throttle: (func, limit) => { + let inThrottle; + return function() { + const args = arguments; + const context = this; + if (!inThrottle) { + func.apply(context, args); + inThrottle = true; + setTimeout(() => inThrottle = false, limit); + } + }; + }, + + // 深拷贝 + deepClone: (obj) => { + if (obj === null || typeof obj !== 'object') return obj; + if (obj instanceof Date) return new Date(obj.getTime()); + if (obj instanceof Array) return obj.map(item => utils.deepClone(item)); + if (typeof obj === 'object') { + const clonedObj = {}; + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + clonedObj[key] = utils.deepClone(obj[key]); + } + } + return clonedObj; + } + }, + + // 生成唯一ID + generateId: (prefix = '') => { + const timestamp = Date.now().toString(36); + const random = Math.random().toString(36).substr(2, 9); + return prefix ? `${prefix}_${timestamp}_${random}` : `${timestamp}_${random}`; + }, + + // 格式化文件大小 + formatFileSize: (bytes) => { + if (bytes === 0) return '0 Bytes'; + const k = 1024; + const sizes = ['Bytes', 'KB', 'MB', 'GB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + }, + + // 格式化时间 + formatDuration: (ms) => { + const seconds = Math.floor(ms / 1000); + const minutes = Math.floor(seconds / 60); + const hours = Math.floor(minutes / 60); + + if (hours > 0) { + return `${hours}小时${minutes % 60}分钟`; + } else if (minutes > 0) { + return `${minutes}分钟${seconds % 60}秒`; + } else { + return `${seconds}秒`; + } + }, + + // 判断是否为移动设备 + isMobile: () => { + return /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test( + navigator.userAgent + ); + }, + + // 判断是否为Electron环境 + isElectron: () => { + return typeof window !== 'undefined' && + window.process && + window.process.type === 'renderer'; + }, + + // 安全地解析JSON + safeParseJSON: (str, defaultValue = {}) => { + try { + return JSON.parse(str); + } catch { + return defaultValue; + } + }, + + // 获取URL参数 + getQueryParam: (name) => { + const url = new URL(window.location.href); + return url.searchParams.get(name); + }, + + // 设置URL参数 + setQueryParam: (name, value) => { + const url = new URL(window.location.href); + url.searchParams.set(name, value); + window.history.replaceState({}, '', url); + }, + + // 下载文件 + downloadFile: (content, filename, type = 'text/plain') => { + const blob = new Blob([content], { type }); + const url = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = url; + a.download = filename; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } +}; + +// 默认导出所有工具 +export default { + networkManager, + wsClient, + deviceConnectionManager, + notificationManager, + logger, + log, + ...utils +}; \ No newline at end of file diff --git a/src/utils/logger.js b/src/utils/logger.js new file mode 100644 index 0000000..0b1d84b --- /dev/null +++ b/src/utils/logger.js @@ -0,0 +1,349 @@ +/** + * 日志管理工具类 + * 处理应用日志记录、错误追踪、调试信息等功能 + */ + +class Logger { + constructor() { + this.levels = { + ERROR: 0, + WARN: 1, + INFO: 2, + DEBUG: 3 + }; + this.currentLevel = this.levels.INFO; + this.logs = []; + this.maxLogs = 1000; + this.isDevelopment = process.env.NODE_ENV === 'development'; + + // 初始化日志系统 + this.init(); + } + + /** + * 初始化日志系统 + */ + init() { + // 监听全局错误 + if (typeof window !== 'undefined') { + window.addEventListener('error', (event) => { + this.error('Global Error', event.error); + }); + + window.addEventListener('unhandledrejection', (event) => { + this.error('Unhandled Promise Rejection', event.reason); + }); + } + + // 设置日志级别 + this.setLogLevel( + this.isDevelopment ? this.levels.DEBUG : this.levels.INFO + ); + } + + /** + * 设置日志级别 + */ + setLogLevel(level) { + if (typeof level === 'string') { + const levelMap = { + 'error': this.levels.ERROR, + 'warn': this.levels.WARN, + 'info': this.levels.INFO, + 'debug': this.levels.DEBUG + }; + this.currentLevel = levelMap[level.toLowerCase()] || this.levels.INFO; + } else { + this.currentLevel = level; + } + } + + /** + * 记录错误日志 + */ + error(message, error = null, context = {}) { + if (this.currentLevel >= this.levels.ERROR) { + const logEntry = this.createLogEntry('ERROR', message, error, context); + this.addLog(logEntry); + this.outputLog('error', logEntry); + } + } + + /** + * 记录警告日志 + */ + warn(message, data = null, context = {}) { + if (this.currentLevel >= this.levels.WARN) { + const logEntry = this.createLogEntry('WARN', message, data, context); + this.addLog(logEntry); + this.outputLog('warn', logEntry); + } + } + + /** + * 记录信息日志 + */ + info(message, data = null, context = {}) { + if (this.currentLevel >= this.levels.INFO) { + const logEntry = this.createLogEntry('INFO', message, data, context); + this.addLog(logEntry); + this.outputLog('info', logEntry); + } + } + + /** + * 记录调试日志 + */ + debug(message, data = null, context = {}) { + if (this.currentLevel >= this.levels.DEBUG) { + const logEntry = this.createLogEntry('DEBUG', message, data, context); + this.addLog(logEntry); + this.outputLog('debug', logEntry); + } + } + + /** + * 创建日志条目 + */ + createLogEntry(level, message, data, context) { + return { + level, + message, + data: this.serializeData(data), + context: this.serializeData(context), + timestamp: new Date().toISOString(), + userAgent: typeof navigator !== 'undefined' ? navigator.userAgent : 'Node.js', + url: typeof window !== 'undefined' ? window.location.href : '', + stack: this.getStackTrace() + }; + } + + /** + * 添加日志到内存队列 + */ + addLog(logEntry) { + this.logs.push(logEntry); + + // 限制内存中的日志数量 + if (this.logs.length > this.maxLogs) { + this.logs.shift(); + } + } + + /** + * 输出日志到控制台 + */ + outputLog(method, logEntry) { + const formattedMessage = this.formatLogMessage(logEntry); + + if (typeof console !== 'undefined' && console[method]) { + console[method](formattedMessage, logEntry.data || ''); + } + + // 发送到远程日志服务(生产环境) + if (!this.isDevelopment) { + this.sendToRemote(logEntry); + } + } + + /** + * 格式化日志消息 + */ + formatLogMessage(logEntry) { + const { level, timestamp, message, context } = logEntry; + const time = new Date(timestamp).toLocaleTimeString(); + const contextStr = Object.keys(context).length > 0 ? ` [${JSON.stringify(context)}]` : ''; + return `[${time}] ${level}: ${message}${contextStr}`; + } + + /** + * 序列化数据 + */ + serializeData(data) { + if (data === null || data === undefined) { + return null; + } + + if (typeof data === 'string') { + return data; + } + + if (data instanceof Error) { + return { + name: data.name, + message: data.message, + stack: data.stack + }; + } + + try { + return JSON.parse(JSON.stringify(data)); + } catch (error) { + return String(data); + } + } + + /** + * 获取堆栈跟踪 + */ + getStackTrace() { + try { + const error = new Error(); + const stack = error.stack || ''; + return stack.split('\n').slice(3).join('\n'); // 移除Logger自身的堆栈 + } catch (error) { + return ''; + } + } + + /** + * 发送到远程日志服务 + */ + async sendToRemote(logEntry) { + try { + // 这里可以集成远程日志服务,如Sentry、LogRocket等 + // 暂时只发送到Electron主进程 + if (window.electronAPI && window.electronAPI.log) { + await window.electronAPI.log.send(logEntry); + } + } catch (error) { + // 远程日志发送失败时不影响应用运行 + console.error('发送日志到远程服务失败:', error); + } + } + + /** + * 获取日志列表 + */ + getLogs(level = null, limit = 100) { + let filteredLogs = this.logs; + + if (level) { + const levelValue = typeof level === 'string' ? + this.levels[level.toUpperCase()] : level; + filteredLogs = this.logs.filter(log => + this.levels[log.level] >= levelValue + ); + } + + return filteredLogs.slice(-limit); + } + + /** + * 清除日志 + */ + clearLogs() { + this.logs = []; + } + + /** + * 导出日志 + */ + exportLogs(format = 'json') { + const logs = this.getLogs(); + + switch (format) { + case 'json': + return JSON.stringify(logs, null, 2); + case 'csv': + return this.convertToCSV(logs); + case 'text': + return logs.map(log => this.formatLogMessage(log)).join('\n'); + default: + return JSON.stringify(logs); + } + } + + /** + * 转换为CSV格式 + */ + convertToCSV(logs) { + if (logs.length === 0) return ''; + + const headers = ['timestamp', 'level', 'message', 'data', 'context']; + const csvContent = [ + headers.join(','), + ...logs.map(log => [ + log.timestamp, + log.level, + `"${log.message.replace(/"/g, '""')}"`, + `"${JSON.stringify(log.data || '').replace(/"/g, '""')}"`, + `"${JSON.stringify(log.context || '').replace(/"/g, '""')}"` + ].join(',')) + ].join('\n'); + + return csvContent; + } + + /** + * 下载日志文件 + */ + downloadLogs(format = 'json', filename = null) { + const content = this.exportLogs(format); + const blob = new Blob([content], { type: 'text/plain' }); + const url = URL.createObjectURL(blob); + + const a = document.createElement('a'); + a.href = url; + a.download = filename || `app-logs-${new Date().toISOString().split('T')[0]}.${format}`; + document.body.appendChild(a); + a.click(); + document.body.removeChild(a); + URL.revokeObjectURL(url); + } + + /** + * 记录性能指标 + */ + performance(name, duration, context = {}) { + this.info(`Performance: ${name}`, { + duration, + ...context + }); + } + + /** + * 记录API调用 + */ + apiCall(method, url, duration, status, responseSize = null) { + this.info(`API Call: ${method} ${url}`, { + method, + url, + duration, + status, + responseSize + }); + } + + /** + * 记录用户操作 + */ + userAction(action, data = {}) { + this.info(`User Action: ${action}`, data); + } + + /** + * 记录异常 + */ + exception(error, context = {}) { + this.error('Exception', error, context); + } +} + +// 创建单例实例 +const logger = new Logger(); + +// 快捷方法 +const log = { + error: logger.error.bind(logger), + warn: logger.warn.bind(logger), + info: logger.info.bind(logger), + debug: logger.debug.bind(logger), + performance: logger.performance.bind(logger), + api: logger.apiCall.bind(logger), + action: logger.userAction.bind(logger), + exception: logger.exception.bind(logger) +}; + +export default logger; +export { Logger, log }; \ No newline at end of file diff --git a/src/utils/network-manager.js b/src/utils/network-manager.js new file mode 100644 index 0000000..23332be --- /dev/null +++ b/src/utils/network-manager.js @@ -0,0 +1,259 @@ +/** + * 网络连接管理工具类 + * 处理网络状态检测、端口扫描、连接测试等功能 + */ + +import axios from 'axios'; +import { ipcRenderer } from 'electron'; + +class NetworkManager { + constructor() { + this.timeout = 5000; + this.retryCount = 3; + this.retryDelay = 1000; + } + + /** + * 检查网络连接状态 + */ + async checkNetworkConnection() { + try { + const startTime = Date.now(); + const response = await axios.get('https://www.baidu.com', { + timeout: this.timeout, + validateStatus: (status) => status < 500 + }); + + const responseTime = Date.now() - startTime; + + return { + status: response.status === 200 ? 'connected' : 'limited', + responseTime, + message: response.status === 200 ? '网络连接正常' : '网络连接受限' + }; + } catch (error) { + return { + status: 'disconnected', + responseTime: -1, + message: '网络连接失败', + error: error.message + }; + } + } + + /** + * 检查特定端口是否可用 + */ + async checkPortAvailability(port, host = 'localhost') { + try { + // 使用Electron主进程检查端口 + const isInUse = await ipcRenderer.invoke('check-port-status', port); + return { + port, + host, + available: !isInUse, + message: isInUse ? `端口 ${port} 已被占用` : `端口 ${port} 可用` + }; + } catch (error) { + return { + port, + host, + available: false, + message: `检查端口失败: ${error.message}`, + error: error.message + }; + } + } + + /** + * 批量检查端口 + */ + async checkMultiplePorts(ports, host = 'localhost') { + const results = []; + + for (const port of ports) { + const result = await this.checkPortAvailability(port, host); + results.push(result); + } + + return results; + } + + /** + * 测试服务器连接 + */ + async testServerConnection(url, timeout = this.timeout) { + try { + const startTime = Date.now(); + const response = await axios.get(url, { + timeout, + validateStatus: (status) => true + }); + + const responseTime = Date.now() - startTime; + + return { + status: 'success', + responseTime, + statusCode: response.status, + message: `服务器响应正常 (${response.status})` + }; + } catch (error) { + return { + status: 'failed', + responseTime: -1, + message: `连接失败: ${error.message}`, + error: error.message + }; + } + } + + /** + * 获取网络延迟 + */ + async getNetworkLatency(target = 'https://www.baidu.com') { + const results = []; + + for (let i = 0; i < 3; i++) { + const startTime = Date.now(); + try { + await axios.get(target, { + timeout: this.timeout + }); + const latency = Date.now() - startTime; + results.push(latency); + } catch (error) { + results.push(-1); + } + + if (i < 2) { + await this.delay(1000); + } + } + + const validResults = results.filter(r => r > 0); + const averageLatency = validResults.length > 0 + ? Math.round(validResults.reduce((a, b) => a + b, 0) / validResults.length) + : -1; + + return { + results, + averageLatency, + status: averageLatency > 0 ? 'ok' : 'failed' + }; + } + + /** + * 检测网络类型 + */ + async detectNetworkType() { + try { + // 使用navigator.connection API(如果可用) + if (navigator.connection) { + const connection = navigator.connection; + return { + type: connection.effectiveType || 'unknown', + downlink: connection.downlink, + rtt: connection.rtt, + saveData: connection.saveData, + source: 'navigator' + }; + } + + // 回退到基本检测 + const connection = await this.checkNetworkConnection(); + return { + type: connection.status === 'connected' ? 'wifi' : 'none', + downlink: null, + rtt: null, + saveData: false, + source: 'fallback' + }; + } catch (error) { + return { + type: 'unknown', + downlink: null, + rtt: null, + saveData: false, + source: 'error', + error: error.message + }; + } + } + + /** + * 重试机制包装 + */ + async retry(operation, maxRetries = this.retryCount) { + let lastError; + + for (let attempt = 1; attempt <= maxRetries; attempt++) { + try { + return await operation(); + } catch (error) { + lastError = error; + if (attempt < maxRetries) { + await this.delay(this.retryDelay * attempt); + } + } + } + + throw lastError; + } + + /** + * 延迟工具 + */ + delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + /** + * 获取综合网络状态报告 + */ + async getNetworkStatusReport() { + const [connection, latency, networkType] = await Promise.all([ + this.checkNetworkConnection(), + this.getNetworkLatency(), + this.detectNetworkType() + ]); + + return { + timestamp: new Date().toISOString(), + connection, + latency, + networkType, + summary: { + overall: connection.status === 'connected' ? 'healthy' : 'unhealthy', + issues: this.generateIssuesReport(connection, latency, networkType) + } + }; + } + + /** + * 生成问题报告 + */ + generateIssuesReport(connection, latency, networkType) { + const issues = []; + + if (connection.status !== 'connected') { + issues.push('网络连接失败'); + } + + if (latency.averageLatency > 1000) { + issues.push('网络延迟过高'); + } + + if (networkType.type === '2g' || networkType.type === 'slow-2g') { + issues.push('网络速度较慢'); + } + + return issues; + } +} + +// 创建单例实例 +const networkManager = new NetworkManager(); + +export default networkManager; +export { NetworkManager }; \ No newline at end of file diff --git a/src/utils/notification-manager.js b/src/utils/notification-manager.js new file mode 100644 index 0000000..636bbc0 --- /dev/null +++ b/src/utils/notification-manager.js @@ -0,0 +1,380 @@ +/** + * 通知管理工具类 + * 处理系统通知、弹窗提醒、消息推送等功能 + */ + +class NotificationManager { + constructor() { + this.notificationQueue = []; + this.isProcessing = false; + this.defaultOptions = { + type: 'info', + duration: 3000, + showClose: true, + position: 'top-right' + }; + } + + /** + * 显示系统通知 + */ + async showSystemNotification(options) { + const { + title, + message, + type = 'info', + duration = 5000, + icon = null, + actions = [] + } = options; + + try { + // 使用Electron原生通知 + if (window.electronAPI && window.electronAPI.notification) { + return await window.electronAPI.notification.show({ + title, + message, + icon, + actions + }); + } + + // 回退到Web Notification + if ('Notification' in window && Notification.permission === 'granted') { + const notification = new Notification(title, { + body: message, + icon: icon || '/icon.png', + tag: `notification-${Date.now()}` + }); + + if (actions.length > 0) { + notification.addEventListener('click', () => { + this.handleNotificationClick(actions[0]); + }); + } + + return notification; + } + + // 使用自定义弹窗 + return this.showCustomNotification(options); + } catch (error) { + console.error('显示通知失败:', error); + return this.showCustomNotification(options); + } + } + + /** + * 显示自定义通知弹窗 + */ + showCustomNotification(options) { + const { title, message, type, duration, showClose, position } = { + ...this.defaultOptions, + ...options + }; + + // 创建通知元素 + const notification = this.createNotificationElement({ + title, + message, + type, + showClose, + position + }); + + // 添加到DOM + document.body.appendChild(notification); + + // 自动关闭 + if (duration > 0) { + setTimeout(() => { + this.removeNotification(notification); + }, duration); + } + + return notification; + } + + /** + * 创建通知DOM元素 + */ + createNotificationElement(options) { + const { title, message, type, showClose, position } = options; + + const notification = document.createElement('div'); + notification.className = `custom-notification notification-${type} notification-${position}`; + notification.style.cssText = ` + position: fixed; + z-index: 9999; + padding: 16px 24px; + border-radius: 4px; + box-shadow: 0 4px 12px rgba(0,0,0,0.15); + background: ${this.getTypeColor(type)}; + color: white; + min-width: 300px; + max-width: 500px; + animation: notificationSlideIn 0.3s ease; + `; + + const titleEl = document.createElement('div'); + titleEl.className = 'notification-title'; + titleEl.textContent = title; + titleEl.style.fontWeight = 'bold'; + titleEl.style.marginBottom = '4px'; + + const messageEl = document.createElement('div'); + messageEl.className = 'notification-message'; + messageEl.textContent = message; + + notification.appendChild(titleEl); + notification.appendChild(messageEl); + + if (showClose) { + const closeBtn = document.createElement('button'); + closeBtn.className = 'notification-close'; + closeBtn.innerHTML = '×'; + closeBtn.style.cssText = ` + position: absolute; + top: 8px; + right: 8px; + background: none; + border: none; + color: white; + font-size: 18px; + cursor: pointer; + `; + closeBtn.onclick = () => this.removeNotification(notification); + notification.appendChild(closeBtn); + } + + return notification; + } + + /** + * 获取类型对应的颜色 + */ + getTypeColor(type) { + const colors = { + success: '#67c23a', + warning: '#e6a23c', + error: '#f56c6c', + info: '#909399' + }; + return colors[type] || colors.info; + } + + /** + * 移除通知元素 + */ + removeNotification(notification) { + if (notification && notification.parentNode) { + notification.style.animation = 'notificationSlideOut 0.3s ease'; + setTimeout(() => { + notification.parentNode.removeChild(notification); + }, 300); + } + } + + /** + * 显示成功通知 + */ + success(title, message, options = {}) { + return this.showSystemNotification({ + title, + message, + type: 'success', + ...options + }); + } + + /** + * 显示错误通知 + */ + error(title, message, options = {}) { + return this.showSystemNotification({ + title, + message, + type: 'error', + ...options + }); + } + + /** + * 显示警告通知 + */ + warning(title, message, options = {}) { + return this.showSystemNotification({ + title, + message, + type: 'warning', + ...options + }); + } + + /** + * 显示信息通知 + */ + info(title, message, options = {}) { + return this.showSystemNotification({ + title, + message, + type: 'info', + ...options + }); + } + + /** + * 显示设备连接通知 + */ + showDeviceConnected(deviceName, deviceId) { + return this.success('设备已连接', `${deviceName} (${deviceId}) 已成功连接`); + } + + /** + * 显示设备断开通知 + */ + showDeviceDisconnected(deviceName, deviceId, reason = '') { + const message = reason ? `${deviceName} 已断开连接 (${reason})` : `${deviceName} 已断开连接`; + return this.warning('设备已断开', message); + } + + /** + * 显示连接超时通知 + */ + showConnectionTimeout(deviceName, deviceId) { + return this.error('连接超时', `${deviceName} (${deviceId}) 连接超时,请检查网络或设备状态`); + } + + /** + * 显示系统错误通知 + */ + showSystemError(error, context = '') { + const message = context ? `${context}: ${error.message || error}` : error.message || error; + return this.error('系统错误', message, { duration: 0 }); + } + + /** + * 显示网络状态通知 + */ + showNetworkStatus(status) { + const messages = { + connected: '网络连接已恢复', + disconnected: '网络连接已断开', + limited: '网络连接受限' + }; + + const type = status === 'connected' ? 'success' : 'warning'; + return this[type]('网络状态', messages[status] || '网络状态未知'); + } + + /** + * 批量显示通知 + */ + async showBatchNotifications(notifications) { + for (const notification of notifications) { + await this.delay(100); // 避免同时显示多个通知 + this.showSystemNotification(notification); + } + } + + /** + * 请求通知权限 + */ + async requestNotificationPermission() { + if ('Notification' in window && Notification.permission === 'default') { + const permission = await Notification.requestPermission(); + return permission === 'granted'; + } + return false; + } + + /** + * 检查通知权限 + */ + checkNotificationPermission() { + if ('Notification' in window) { + return Notification.permission; + } + return 'unsupported'; + } + + /** + * 延迟工具 + */ + delay(ms) { + return new Promise(resolve => setTimeout(resolve, ms)); + } + + /** + * 添加CSS样式 + */ + addNotificationStyles() { + if (document.getElementById('notification-styles')) { + return; + } + + const style = document.createElement('style'); + style.id = 'notification-styles'; + style.textContent = ` + @keyframes notificationSlideIn { + from { + transform: translateX(100%); + opacity: 0; + } + to { + transform: translateX(0); + opacity: 1; + } + } + + @keyframes notificationSlideOut { + from { + transform: translateX(0); + opacity: 1; + } + to { + transform: translateX(100%); + opacity: 0; + } + } + + .custom-notification { + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + font-size: 14px; + line-height: 1.4; + } + + .notification-top-right { + top: 20px; + right: 20px; + } + + .notification-top-left { + top: 20px; + left: 20px; + } + + .notification-bottom-right { + bottom: 20px; + right: 20px; + } + + .notification-bottom-left { + bottom: 20px; + left: 20px; + } + `; + document.head.appendChild(style); + } +} + +// 创建单例实例 +const notificationManager = new NotificationManager(); + +// 自动添加样式 +if (typeof window !== 'undefined') { + notificationManager.addNotificationStyles(); +} + +export default notificationManager; +export { NotificationManager }; \ No newline at end of file diff --git a/src/utils/request.js b/src/utils/request.js new file mode 100644 index 0000000..5584623 --- /dev/null +++ b/src/utils/request.js @@ -0,0 +1,138 @@ +import axios from 'axios' +import { ElMessage, ElLoading } from 'element-plus' +import { getToken, removeToken } from './auth' + +// 创建axios实例 +const service = axios.create({ + baseURL: process.env.VUE_APP_BASE_API || '/', + timeout: 30000 // 30秒超时 +}) + +// 请求拦截器 +service.interceptors.request.use( + config => { + // 添加token + const token = getToken() + if (token) { + config.headers['Authorization'] = `Bearer ${token}` + } + + // 添加请求头 + config.headers['Content-Type'] = 'application/json;charset=UTF-8' + + return config + }, + error => { + console.error('请求错误:', error) + return Promise.reject(error) + } +) + +// 响应拦截器 +service.interceptors.response.use( + response => { + const { data, config } = response + + // 处理文件下载 + if (config.responseType === 'blob') { + return response + } + + // 处理正常响应 + if (data.code === 200 || data.success) { + return data + } else { + ElMessage.error(data.message || '请求失败') + return Promise.reject(new Error(data.message || 'Error')) + } + }, + error => { + console.error('响应错误:', error) + + const { response } = error + + if (response) { + const { status, data } = response + + switch (status) { + case 400: + ElMessage.error(data.message || '请求参数错误') + break + case 401: + ElMessage.error('登录已过期,请重新登录') + removeToken() + window.location.href = '/login' + break + case 403: + ElMessage.error('没有权限访问') + break + case 404: + ElMessage.error('请求的资源不存在') + break + case 500: + ElMessage.error('服务器内部错误') + break + default: + ElMessage.error(data.message || '请求失败') + } + } else { + ElMessage.error('网络连接错误') + } + + return Promise.reject(error) + } +) + +// 封装请求方法 +export default service + +// 导出常用方法 +export function get(url, params = {}, config = {}) { + return service.get(url, { params, ...config }) +} + +export function post(url, data = {}, config = {}) { + return service.post(url, data, config) +} + +export function put(url, data = {}, config = {}) { + return service.put(url, data, config) +} + +export function del(url, config = {}) { + return service.delete(url, config) +} + +// 文件上传 +export function upload(url, file, data = {}) { + const formData = new FormData() + formData.append('file', file) + + Object.keys(data).forEach(key => { + formData.append(key, data[key]) + }) + + return service.post(url, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) +} + +// 文件下载 +export function download(url, params = {}, filename = '') { + return service.get(url, { + params, + responseType: 'blob' + }).then(response => { + const blob = new Blob([response.data]) + const downloadUrl = window.URL.createObjectURL(blob) + const link = document.createElement('a') + link.href = downloadUrl + link.download = filename || 'download' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) + window.URL.revokeObjectURL(downloadUrl) + }) +} \ No newline at end of file diff --git a/src/utils/system-check.js b/src/utils/system-check.js new file mode 100644 index 0000000..545e8b7 --- /dev/null +++ b/src/utils/system-check.js @@ -0,0 +1,418 @@ +// 系统检测工具类 +import { exec } from 'child_process'; +import axios from 'axios'; +import fs from 'fs'; +import os from 'os'; +import path from 'path'; +import net from 'net'; +import { ipcRenderer } from 'electron'; +import iconv from 'iconv-lite'; + +// 系统检测日志记录 +async function logSystemCheck(message) { + console.log(`[System Check] ${message}`); +} + +// 发送消息到主进程 +function sendMessage(data) { + ipcRenderer.send('send-message', JSON.stringify(data)); +} + +// 响应系统检测数据 +function respondSystemCheckData(data) { + const response = { + status: true, + msg: '请求获取设备信息成功', + data: data + }; + process.send(JSON.stringify(response)); +} + +// 检查系统主机名 +export async function checkSystemHostName(params) { + const testItem = '系统主机名'; + const description = '获取当前使用计算机的主机名'; + let result = ''; + let suggestion = ''; + + try { + const hostname = os.hostname(); + await logSystemCheck(`HOSTNAME: ${hostname}`); + result = hostname || '无法获取主机名'; + if (!hostname) suggestion = '暂时获取不了主机名'; + } catch (error) { + result = '获取失败'; + suggestion = error.message; + } + + return { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }; +} + +// 检查网络连接状态 +export async function checkNetworkConnectionState(params) { + const testItem = '客户端网络状态'; + const description = '获取客户端网络是否通畅'; + let result = ''; + let suggestion = ''; + + try { + const response = await axios.get('https://www.baidu.com', { timeout: 5000 }); + if (response.status === 200) { + result = '网络通畅'; + } else { + result = '网络不通'; + suggestion = '请检查网线是否正确插拔'; + } + await logSystemCheck(response.status === 200 ? '网络通畅' : '网络不通'); + } catch (error) { + result = '网络不通'; + suggestion = '请检查网络连接'; + await logSystemCheck(`networkstate_error: 网络连通 ${error.message}`); + } + + return { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }; +} + +// 检查系统防火墙状态 +export async function checkSystemFirewallStatus(params) { + const testItem = '检查防火墙设置'; + const description = '检查防火墙有没有开启'; + let result = ''; + let suggestion = ''; + + return new Promise((resolve) => { + exec('netsh advfirewall show currentprofile', async (error, stdout, stderr) => { + if (error || stderr) { + await logSystemCheck(`error: ${error?.message || stderr}`); + resolve({ + status: false, + msg: '未知错误', + data: { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type + } + }); + return; + } + + const isEnabled = stdout.includes('State ON'); + await logSystemCheck(`防火墙状态: ${isEnabled ? '开启' : '关闭'}`); + result = isEnabled ? '开启' : '关闭'; + if (!isEnabled) suggestion = '请自行百度开启防火墙的方法'; + + resolve({ + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }); + }); + }); +} + +// 检查核心程序文件 +export async function checkCoreProgramFiles(params) { + const testItem = '核心文件'; + const description = '检查核心启动文件是否存在'; + let result = ''; + let suggestion = ''; + + try { + const corePath = path.join(process.cwd(), 'release', '1.0.0', 'win-unpacked', '云企通安全云锁客户端.exe'); + const exists = fs.existsSync(corePath); + await logSystemCheck(`核心文件是否存在: ${exists ? '存在' : '不存在'}`); + result = exists ? '存在' : '不存在'; + if (!exists) suggestion = '请前去官网下载程序,然后重新安装'; + } catch (error) { + result = '检查失败'; + suggestion = error.message; + } + + return { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }; +} + +// 检查系统驱动 +export async function checkSystemDriver(params) { + const testItem = '检查驱动'; + const description = '检查驱动是否存在'; + let result = ''; + let suggestion = ''; + + try { + const driverPath = 'C://Windows//System32//drivers//usbip_vhci_ude.sys'; + const exists = fs.existsSync(driverPath); + await logSystemCheck(`驱动文件是否存在: ${exists ? '存在' : '不存在'}`); + result = exists ? '存在' : '不存在'; + if (!exists) suggestion = '请重新安装程序试试'; + } catch (error) { + result = '检查失败'; + suggestion = error.message; + } + + return { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }; +} + +// 检查系统测试模式 +export async function checkSystemTestMode(params) { + const testItem = '测试模式'; + const description = '检查测试模式是否开启,如果电脑为win7,则需要开启测试模式'; + let result = ''; + let suggestion = ''; + + return new Promise((resolve) => { + exec('bcdedit', async (error, stdout) => { + if (error) { + await logSystemCheck(`执行错误: ${error.message}`); + resolve({ + status: false, + msg: '未知错误', + data: { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type + } + }); + return; + } + + let testMode = ''; + const lines = stdout.split('\n'); + for (let line of lines) { + if (line.includes('testsigning')) { + testMode = line.split(' ').pop().trim() === 'Yes' ? '是' : '否'; + break; + } + } + + result = testMode || '否'; + if (result === '否') suggestion = '请在命令行执行命令开启'; + + resolve({ + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }); + }); + }); +} + +// 检查系统证书 +export async function checkSystemCertificate(params) { + const testItem = '检查证书'; + const description = '检查证书是否存在'; + let result = ''; + let suggestion = ''; + + return new Promise((resolve) => { + if (os.platform() === 'win32' && os.release().startsWith('7')) { + result = '存在'; + resolve({ + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }); + return; + } + + exec('certutil -store root "USBIP Test"', async (error, stdout, stderr) => { + if (error || stderr) { + await logSystemCheck(`执行错误: ${error?.message || stderr}`); + resolve({ + status: false, + msg: '未知错误', + data: { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type + } + }); + return; + } + + const exists = stdout.includes('USBIP Test'); + await logSystemCheck(`证书是否存在: ${exists ? '存在' : '不存在'}`); + result = exists ? '存在' : '不存在'; + if (!exists) suggestion = '请重新安装程序试试'; + + resolve({ + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }); + }); + }); +} + +// 检查端口服务 +export async function checkPortService(port, host = '127.0.0.1') { + return new Promise((resolve) => { + const socket = new net.Socket(); + const timeout = 2000; + + socket.setTimeout(timeout); + socket.on('connect', () => { + socket.destroy(); + resolve(true); + }); + + socket.on('timeout', () => { + socket.destroy(); + resolve(false); + }); + + socket.on('error', () => { + resolve(false); + }); + + socket.connect(port, host); + }); +} + +// 检查系统管理员权限 +export async function checkSystemAdminRights(params) { + const testItem = '管理员权限'; + const description = '检查当前用户是否拥有管理员权限'; + let result = ''; + let suggestion = ''; + + return new Promise((resolve) => { + exec('net session', async (error) => { + await logSystemCheck(`当前访问是否具有管理员权限: ${error ? '没有' : '有'}`); + result = error ? '没有' : '有'; + if (error) suggestion = '请点击右键以管理员权限打开本程序'; + + resolve({ + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: testItem, + project_description: description, + checkout_result: result, + repairing_suggestion: suggestion + }); + }); + }); +} + +// 检查程序完整性 +export async function checkApplicationIntegrity(params) { + return { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: '程序完整', + project_description: '检查程序文件是否完整', + checkout_result: '完整', + repairing_suggestion: '' + }; +} + +// 执行系统检测 +export async function performSystemCheck(params) { + await logSystemCheck(`checkout_type: ${params.checkout_type}`); + + try { + switch (params.checkout_type) { + case 'host_name': + return await checkSystemHostName(params); + case 'network_state': + return await checkNetworkConnectionState(params); + case 'firewall_status': + return await checkSystemFirewallStatus(params); + case 'files_exist': + return await checkCoreProgramFiles(params); + case 'certificate_exist': + return await checkSystemCertificate(params); + case 'test_pattern': + return await checkSystemTestMode(params); + case 'drive_exist': + return await checkSystemDriver(params); + case 'ownership': + return await checkSystemAdminRights(params); + case 'web_serve': + const webStatus = await checkPortService(25525); + return { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: 'web服务', + project_description: '检查web服务是否开启成功', + checkout_result: webStatus ? '已开启' : '关闭', + repairing_suggestion: webStatus ? '' : '请重启程序尝试一下' + }; + case 'socket_serve': + const socketStatus = await checkPortService(801); + return { + user_id: params.user_id || '', + type: params.type, + checkout_type: params.checkout_type, + test_item: 'socket服务', + project_description: '检查socket服务是否开启成功', + checkout_result: socketStatus ? '已开启' : '关闭', + repairing_suggestion: socketStatus ? '' : '请重启程序尝试一下' + }; + case 'program_integrity': + return await checkApplicationIntegrity(params); + default: + return { + status: false, + msg: '不存在的检测类型', + data: { user_id: params.user_id || '' } + }; + } + } catch (error) { + return { + status: false, + msg: `检测失败: ${error.message}`, + data: { user_id: params.user_id || '' } + }; + } +} \ No newline at end of file diff --git a/src/utils/tools.js b/src/utils/tools.js new file mode 100644 index 0000000..b1a3aae --- /dev/null +++ b/src/utils/tools.js @@ -0,0 +1,639 @@ +/** + * 工具函数集合 + * 包含从混淆代码中提取的各种实用工具函数 + */ + +import { ipcRenderer } from 'electron'; +import dayjs from 'dayjs'; + +/** + * 类型检查工具 + */ +export const typeUtils = { + /** + * 检查是否为Buffer + */ + isBuffer(obj) { + return obj != null && obj.constructor != null && + typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj); + }, + + /** + * 检查是否为ArrayBuffer + */ + isArrayBuffer(val) { + return val && typeof val === 'object' && val.constructor === ArrayBuffer; + }, + + /** + * 检查是否为FormData + */ + isFormData(val) { + return typeof FormData !== 'undefined' && val instanceof FormData; + }, + + /** + * 检查是否为Blob + */ + 是Blob(val) { + return typeof Blob !== 'undefined' && val instanceof Blob; + }, + + /** + * 检查是否为字符串 + */ + isString(val) { + return typeof val === 'string'; + }, + + /** + * 检查是否为数字 + */ + isNumber(val) { + return typeof val === 'number'; + }, + + /** + * 检查是否为函数 + */ + isFunction(val) { + return typeof val === 'function'; + }, + + /** + * 检查是否为对象 + */ + isObject(val) { + return val !== null && typeof val === 'object'; + }, + + /** + * 检查是否为数组 + */ + isArray(val) { + return Array.isArray(val); + }, + + /** + * 检查是否为日期 + */ + isDate(val) { + return val instanceof Date; + }, + + /** + * 检查是否为undefined + */ + isUndefined(val) { + return typeof val === 'undefined'; + }, + + /** + * 检查是否为null + */ + isNull(val) { + return val === null; + } +}; + +/** + * 对象操作工具 + */ +export const objectUtils = { + /** + * 深拷贝 + */ + deepClone(obj) { + if (obj === null || typeof obj !== 'object') return obj; + if (obj instanceof Date) return new Date(obj.getTime()); + if (obj instanceof Array) return obj.map(item => this.deepClone(item)); + if (typeof obj === 'object') { + const clonedObj = {}; + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + clonedObj[key] = this.deepClone(obj[key]); + } + } + return clonedObj; + } + }, + + /** + * 深度合并对象 + */ + deepMerge(target, source) { + if (!typeUtils.isObject(target) || !typeUtils.isObject(source)) { + return source; + } + + for (const key in source) { + if (source.hasOwnProperty(key)) { + if (typeUtils.isObject(source[key])) { + if (!target[key] || !typeUtils.isObject(target[key])) { + target[key] = {}; + } + this.deepMerge(target[key], source[key]); + } else { + target[key] = source[key]; + } + } + } + + return target; + }, + + /** + * 获取对象属性值 + */ + get(obj, path, defaultValue = undefined) { + if (!typeUtils.isObject(obj) || !path) { + return defaultValue; + } + + const keys = path.split('.'); + let result = obj; + + for (const key of keys) { + if (result == null || !result.hasOwnProperty(key)) { + return defaultValue; + } + result = result[key]; + } + + return result; + }, + + /** + * 设置对象属性值 + */ + set(obj, path, value) { + if (!typeUtils.isObject(obj) || !path) { + return obj; + } + + const keys = path.split('.'); + let current = obj; + + for (let i = 0; i < keys.length - 1; i++) { + const key = keys[i]; + if (!current[key] || !typeUtils.isObject(current[key])) { + current[key] = {}; + } + current = current[key]; + } + + current[keys[keys.length - 1]] = value; + return obj; + }, + + /** + * 删除对象属性 + */ + delete(obj, path) { + if (!typeUtils.isObject(obj) || !path) { + return obj; + } + + const keys = path.split('.'); + let current = obj; + + for (let i = 0; i < keys.length - 1; i++) { + const key = keys[i]; + if (!current[key] || !typeUtils.isObject(current[key])) { + return obj; + } + current = current[key]; + } + + delete current[keys[keys.length - 1]]; + return obj; + }, + + /** + * 对象扁平化 + */ + flatten(obj, prefix = '', result = {}) { + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + const newKey = prefix ? `${prefix}.${key}` : key; + if (typeUtils.isObject(obj[key]) && obj[key] !== null) { + this.flatten(obj[key], newKey, result); + } else { + result[newKey] = obj[key]; + } + } + } + return result; + }, + + /** + * 对象反扁平化 + */ + unflatten(obj) { + const result = {}; + for (const key in obj) { + if (obj.hasOwnProperty(key)) { + this.set(result, key, obj[key]); + } + } + return result; + } +}; + +/** + * 字符串操作工具 + */ +export const stringUtils = { + /** + * 首字母大写 + */ + capitalize(str) { + if (!typeUtils.isString(str)) return str; + return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase(); + }, + + /** + * 驼峰命名 + */ + camelCase(str) { + if (!typeUtils.isString(str)) return str; + return str.replace(/[-_\s]+(.)?/g, (_, char) => char ? char.toUpperCase() : ''); + }, + + /** + * 下划线命名 + */ + snakeCase(str) { + if (!typeUtils.isString(str)) return str; + return str.replace(/[A-Z]/g, letter => `_${letter.toLowerCase()}`) + .replace(/[-\s]+/g, '_') + .replace(/^_|_$/g, ''); + }, + + /** + * 截断字符串 + */ + truncate(str, length = 100, suffix = '...') { + if (!typeUtils.isString(str)) return str; + return str.length > length ? str.substring(0, length) + suffix : str; + }, + + /** + * 去除空格 + */ + trim(str, chars = null) { + if (!typeUtils.isString(str)) return str; + if (!chars) return str.trim(); + + const regex = new RegExp(`^[${chars}]+|[${chars}]+$`, 'g'); + return str.replace(regex, ''); + }, + + /** + * 随机字符串 + */ + randomString(length = 8) { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + let result = ''; + for (let i = 0; i < length; i++) { + result += chars.charAt(Math.floor(Math.random() * chars.length)); + } + return result; + }, + + /** + * 格式化文件大小 + */ + formatFileSize(bytes) { + if (bytes === 0) return '0 B'; + const k = 1024; + const sizes = ['B', 'KB', 'MB', 'GB', 'TB']; + const i = Math.floor(Math.log(bytes) / Math.log(k)); + return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i]; + } +}; + +/** + * 数组操作工具 + */ +export const arrayUtils = { + /** + * 数组去重 + */ + unique(arr) { + if (!typeUtils.isArray(arr)) return arr; + return [...new Set(arr)]; + }, + + /** + * 数组分组 + */ + groupBy(arr, key) { + if (!typeUtils.isArray(arr)) return {}; + + return arr.reduce((groups, item) => { + const groupKey = typeof key === 'function' ? key(item) : item[key]; + if (!groups[groupKey]) { + groups[groupKey] = []; + } + groups[groupKey].push(item); + return groups; + }, {}); + }, + + /** + * 数组扁平化 + */ + flatten(arr) { + if (!typeUtils.isArray(arr)) return arr; + return arr.reduce((flat, item) => { + return flat.concat(typeUtils.isArray(item) ? this.flatten(item) : item); + }, []); + }, + + /** + * 数组分页 + */ + paginate(arr, pageSize, pageNumber = 1) { + if (!typeUtils.isArray(arr)) return []; + const start = (pageNumber - 1) * pageSize; + return arr.slice(start, start + pageSize); + }, + + /** + * 随机打乱数组 + */ + shuffle(arr) { + if (!typeUtils.isArray(arr)) return arr; + const newArr = [...arr]; + for (let i = newArr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [newArr[i], newArr[j]] = [newArr[j], newArr[i]]; + } + return newArr; + } +}; + +/** + * 日期时间工具 + */ +export const dateUtils = { + /** + * 格式化日期 + */ + format(date, format = 'YYYY-MM-DD HH:mm:ss') { + return dayjs(date).format(format); + }, + + /** + * 获取相对时间 + */ + fromNow(date) { + return dayjs(date).fromNow(); + }, + + /** + * 获取时间差 + */ + diff(start, end, unit = 'millisecond') { + return dayjs(end).diff(dayjs(start), unit); + }, + + /** + * 添加时间 + */ + add(date, amount, unit) { + return dayjs(date).add(amount, unit); + }, + + /** + * 减去时间 + */ + subtract(date, amount, unit) { + return dayjs(date).subtract(amount, unit); + }, + + /** + * 获取当前时间戳 + */ + timestamp() { + return dayjs().valueOf(); + }, + + /** + * 获取当前日期 + */ + today() { + return dayjs().format('YYYY-MM-DD'); + }, + + /** + * 获取当前时间 + */ + now() { + return dayjs().format('YYYY-MM-DD HH:mm:ss'); + } +}; + +/** + * 网络工具 + */ +export const networkUtils = { + /** + * 检查网络连接 + */ + async checkNetwork() { + try { + const response = await fetch('https://www.baidu.com', { + method: 'HEAD', + mode: 'no-cors', + cache: 'no-cache' + }); + return true; + } catch { + return false; + } + }, + + /** + * 获取网络信息 + */ + async getNetworkInfo() { + if (!navigator.connection) { + return null; + } + + const connection = navigator.connection; + return { + effectiveType: connection.effectiveType, + downlink: connection.downlink, + rtt: connection.rtt, + saveData: connection.saveData + }; + }, + + /** + * 检查端口是否可用 + */ + async checkPort(port) { + try { + const { ipcRenderer } = require('electron'); + const result = await ipcRenderer.invoke('check-port', port); + return result.available; + } catch { + return false; + } + } +}; + +/** + * 文件工具 + */ +export const fileUtils = { + /** + * 获取文件扩展名 + */ + getExtension(filename) { + return filename.slice(((filename.lastIndexOf('.') - 1) >>> 0) + 2); + }, + + /** + * 获取文件名 + */ + getFilename(path) { + return path.split('/').pop().split('\\').pop(); + }, + + /** + * 获取文件目录 + */ + getDirname(path) { + return path.replace(/\\[^\\]*$/, '').replace(/\/[^\/]*$/, ''); + }, + + /** + * 检查是否为图片文件 + */ + isImage(filename) { + const ext = this.getExtension(filename).toLowerCase(); + return ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg'].includes(ext); + }, + + /** + * 检查是否为视频文件 + */ + isVideo(filename) { + const ext = this.getExtension(filename).toLowerCase(); + return ['mp4', 'avi', 'mkv', 'mov', 'wmv', 'flv', 'webm'].includes(ext); + } +}; + +/** + * 验证工具 + */ +export const validationUtils = { + /** + * 验证邮箱 + */ + isEmail(email) { + const regex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + return regex.test(email); + }, + + /** + * 验证手机号 + */ + isPhone(phone) { + const regex = /^1[3-9]\d{9}$/; + return regex.test(phone); + }, + + /** + * 验证IP地址 + */ + isIP(ip) { + const regex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/; + return regex.test(ip); + }, + + /** + * 验证端口 + */ + isPort(port) { + const num = parseInt(port); + return num >= 1 && num <= 65535; + }, + + /** + * 验证URL + */ + isURL(url) { + try { + new URL(url); + return true; + } catch { + return false; + } + } +}; + +/** + * 缓存工具 + */ +export const cacheUtils = { + /** + * 设置本地存储 + */ + set(key, value, expire = null) { + const data = { value, expire: expire ? Date.now() + expire * 1000 : null }; + localStorage.setItem(key, JSON.stringify(data)); + }, + + /** + * 获取本地存储 + */ + get(key, defaultValue = null) { + const data = localStorage.getItem(key); + if (!data) return defaultValue; + + try { + const parsed = JSON.parse(data); + if (parsed.expire && Date.now() > parsed.expire) { + localStorage.removeItem(key); + return defaultValue; + } + return parsed.value; + } catch { + return defaultValue; + } + }, + + /** + * 删除本地存储 + */ + remove(key) { + localStorage.removeItem(key); + }, + + /** + * 清空本地存储 + */ + clear() { + localStorage.clear(); + } +}; + +/** + * 导出所有工具 + */ +export default { + typeUtils, + objectUtils, + stringUtils, + arrayUtils, + dateUtils, + networkUtils, + fileUtils, + validationUtils, + cacheUtils +}; \ No newline at end of file diff --git a/src/utils/validate.js b/src/utils/validate.js new file mode 100644 index 0000000..1785ca7 --- /dev/null +++ b/src/utils/validate.js @@ -0,0 +1,128 @@ +/** + * 验证工具函数 + */ + +/** + * 验证手机号格式 + * @param {string} mobile - 手机号 + * @returns {boolean} + */ +export function validateMobile(mobile) { + const mobileRegex = /^1[3-9]\d{9}$/ + return mobileRegex.test(mobile) +} + +/** + * 验证邮箱格式 + * @param {string} email - 邮箱 + * @returns {boolean} + */ +export function validateEmail(email) { + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/ + return emailRegex.test(email) +} + +/** + * 验证用户名格式 + * @param {string} username - 用户名 + * @returns {boolean} + */ +export function validateUsername(username) { + const usernameRegex = /^[a-zA-Z0-9_]{4,20}$/ + return usernameRegex.test(username) +} + +/** + * 验证密码强度 + * @param {string} password - 密码 + * @returns {object} - 包含强度等级和提示信息 + */ +export function validatePasswordStrength(password) { + if (!password || password.length < 6) { + return { level: 0, message: '密码长度至少6位' } + } + + let strength = 0 + + // 检查包含的字符类型 + if (/[a-z]/.test(password)) strength++ + if (/[A-Z]/.test(password)) strength++ + if (/[0-9]/.test(password)) strength++ + if (/[^a-zA-Z0-9]/.test(password)) strength++ + + const levels = [ + { level: 0, message: '密码强度太弱' }, + { level: 1, message: '密码强度较弱' }, + { level: 2, message: '密码强度中等' }, + { level: 3, message: '密码强度较强' }, + { level: 4, message: '密码强度很强' } + ] + + return levels[Math.min(strength, 4)] +} + +/** + * 验证IP地址格式 + * @param {string} ip - IP地址 + * @returns {boolean} + */ +export function validateIP(ip) { + const ipRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/ + return ipRegex.test(ip) +} + +/** + * 验证端口号 + * @param {number|string} port - 端口号 + * @returns {boolean} + */ +export function validatePort(port) { + const portNum = parseInt(port) + return portNum >= 1 && portNum <= 65535 +} + +/** + * 验证MAC地址格式 + * @param {string} mac - MAC地址 + * @returns {boolean} + */ +export function validateMAC(mac) { + const macRegex = /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/ + return macRegex.test(mac) +} + +/** + * 验证URL格式 + * @param {string} url - URL地址 + * @returns {boolean} + */ +export function validateURL(url) { + try { + new URL(url) + return true + } catch { + return false + } +} + +/** + * 验证数字范围 + * @param {number} value - 数值 + * @param {number} min - 最小值 + * @param {number} max - 最大值 + * @returns {boolean} + */ +export function validateNumberRange(value, min, max) { + const num = Number(value) + return !isNaN(num) && num >= min && num <= max +} + +/** + * 验证是否为正整数 + * @param {number|string} value - 数值 + * @returns {boolean} + */ +export function validatePositiveInteger(value) { + const num = Number(value) + return Number.isInteger(num) && num > 0 +} \ No newline at end of file diff --git a/src/utils/websocket-client.js b/src/utils/websocket-client.js new file mode 100644 index 0000000..fc79f43 --- /dev/null +++ b/src/utils/websocket-client.js @@ -0,0 +1,187 @@ +/** + * WebSocket客户端管理模块 + * 负责与后端WebSocket服务器通信,处理实时消息和状态更新 + */ + +import { EventEmitter } from 'events'; + +class WebSocketClient extends EventEmitter { + constructor(url = 'ws://localhost:801') { + super(); + this.url = url; + this.socket = null; + this.isConnected = false; + this.reconnectInterval = 5000; + this.maxReconnectAttempts = 5; + this.reconnectAttempts = 0; + this.messageQueue = []; + this.heartbeatInterval = null; + this.heartbeatTimeout = 30000; + } + + /** + * 连接到WebSocket服务器 + */ + connect() { + if (this.socket && this.socket.readyState === WebSocket.OPEN) { + console.log('WebSocket已连接'); + return; + } + + try { + this.socket = new WebSocket(this.url); + + this.socket.onopen = () => { + console.log('WebSocket连接已建立'); + this.isConnected = true; + this.reconnectAttempts = 0; + this.emit('connected'); + this.processMessageQueue(); + this.startHeartbeat(); + }; + + this.socket.onmessage = (event) => { + try { + const data = JSON.parse(event.data); + this.emit('message', data); + this.handleMessage(data); + } catch (error) { + console.error('解析WebSocket消息失败:', error); + this.emit('error', error); + } + }; + + this.socket.onclose = (event) => { + console.log('WebSocket连接关闭:', event.code, event.reason); + this.isConnected = false; + this.stopHeartbeat(); + this.emit('disconnected', event); + + if (!event.wasClean && this.reconnectAttempts < this.maxReconnectAttempts) { + this.scheduleReconnect(); + } + }; + + this.socket.onerror = (error) => { + console.error('WebSocket错误:', error); + this.emit('error', error); + }; + } catch (error) { + console.error('创建WebSocket连接失败:', error); + this.emit('error', error); + } + } + + /** + * 断开连接 + */ + disconnect() { + if (this.socket) { + this.socket.close(1000, '正常关闭'); + this.socket = null; + this.isConnected = false; + this.stopHeartbeat(); + } + } + + /** + * 发送消息 + */ + send(message) { + if (this.isConnected && this.socket.readyState === WebSocket.OPEN) { + this.socket.send(JSON.stringify(message)); + } else { + this.messageQueue.push(message); + } + } + + /** + * 处理消息队列 + */ + processMessageQueue() { + while (this.messageQueue.length > 0) { + const message = this.messageQueue.shift(); + this.send(message); + } + } + + /** + * 处理接收到的消息 + */ + handleMessage(data) { + switch (data.type) { + case 'heartbeat': + this.handleHeartbeatResponse(data); + break; + case 'device_status': + this.emit('deviceStatus', data.payload); + break; + case 'port_status': + this.emit('portStatus', data.payload); + break; + case 'system_notification': + this.emit('notification', data.payload); + break; + default: + this.emit('customMessage', data); + } + } + + /** + * 启动心跳检测 + */ + startHeartbeat() { + this.heartbeatInterval = setInterval(() => { + if (this.isConnected) { + this.send({ type: 'heartbeat', timestamp: Date.now() }); + } + }, this.heartbeatTimeout); + } + + /** + * 停止心跳检测 + */ + stopHeartbeat() { + if (this.heartbeatInterval) { + clearInterval(this.heartbeatInterval); + this.heartbeatInterval = null; + } + } + + /** + * 处理心跳响应 + */ + handleHeartbeatResponse(data) { + // 心跳响应处理逻辑 + console.log('收到心跳响应:', data.timestamp); + } + + /** + * 计划重连 + */ + scheduleReconnect() { + this.reconnectAttempts++; + console.log(`计划第 ${this.reconnectAttempts} 次重连,${this.reconnectInterval}ms后`); + + setTimeout(() => { + this.connect(); + }, this.reconnectInterval); + } + + /** + * 获取连接状态 + */ + getConnectionStatus() { + return { + isConnected: this.isConnected, + url: this.url, + reconnectAttempts: this.reconnectAttempts + }; + } +} + +// 创建单例实例 +const wsClient = new WebSocketClient(); + +export default wsClient; +export { WebSocketClient }; \ No newline at end of file diff --git a/src/utils/websocket.js b/src/utils/websocket.js new file mode 100644 index 0000000..d96938e --- /dev/null +++ b/src/utils/websocket.js @@ -0,0 +1,181 @@ +/** + * WebSocket 工具类 + * 用于设备状态的实时更新 + */ + +class WebSocketManager { + constructor(url, options = {}) { + this.url = url + this.options = { + reconnectInterval: 3000, + maxReconnectAttempts: 5, + ...options + } + + this.ws = null + this.reconnectAttempts = 0 + this.listeners = new Map() + this.isConnected = false + } + + connect() { + try { + this.ws = new WebSocket(this.url) + + this.ws.onopen = () => { + console.log('WebSocket连接成功') + this.isConnected = true + this.reconnectAttempts = 0 + this.emit('connected') + } + + this.ws.onmessage = (event) => { + try { + const data = JSON.parse(event.data) + this.emit('message', data) + } catch (error) { + console.error('WebSocket消息解析失败:', error) + } + } + + this.ws.onclose = () => { + console.log('WebSocket连接关闭') + this.isConnected = false + this.emit('disconnected') + + if (this.reconnectAttempts < this.options.maxReconnectAttempts) { + setTimeout(() => { + this.reconnectAttempts++ + this.connect() + }, this.options.reconnectInterval) + } + } + + this.ws.onerror = (error) => { + console.error('WebSocket错误:', error) + this.emit('error', error) + } + } catch (error) { + console.error('WebSocket连接失败:', error) + } + } + + disconnect() { + if (this.ws) { + this.ws.close() + this.ws = null + } + } + + send(data) { + if (this.isConnected && this.ws) { + this.ws.send(typeof data === 'string' ? data : JSON.stringify(data)) + } else { + console.warn('WebSocket未连接,无法发送消息') + } + } + + on(event, callback) { + if (!this.listeners.has(event)) { + this.listeners.set(event, []) + } + this.listeners.get(event).push(callback) + } + + off(event, callback) { + if (this.listeners.has(event)) { + const callbacks = this.listeners.get(event) + const index = callbacks.indexOf(callback) + if (index > -1) { + callbacks.splice(index, 1) + } + } + } + + emit(event, ...args) { + if (this.listeners.has(event)) { + this.listeners.get(event).forEach(callback => { + try { + callback(...args) + } catch (error) { + console.error('WebSocket事件处理错误:', error) + } + }) + } + } + + subscribeDeviceUpdates(callback) { + this.on('device-update', callback) + } + + unsubscribeDeviceUpdates(callback) { + this.off('device-update', callback) + } +} + +// 创建全局WebSocket实例 +const WS_URL = process.env.VUE_APP_WS_URL || 'ws://localhost:8080/ws' +const wsManager = new WebSocketManager(WS_URL) + +export default wsManager + +// 设备状态WebSocket管理 +export class DeviceWebSocketManager { + constructor() { + this.ws = null + this.deviceCallbacks = new Map() + } + + connect() { + if (!this.ws) { + this.ws = wsManager + this.ws.connect() + + this.ws.on('message', (data) => { + if (data.type === 'device-update') { + this.handleDeviceUpdate(data.payload) + } + }) + } + } + + disconnect() { + if (this.ws) { + this.ws.disconnect() + this.ws = null + } + } + + subscribeDevice(deviceId, callback) { + if (!this.deviceCallbacks.has(deviceId)) { + this.deviceCallbacks.set(deviceId, []) + } + this.deviceCallbacks.get(deviceId).push(callback) + } + + unsubscribeDevice(deviceId, callback) { + if (this.deviceCallbacks.has(deviceId)) { + const callbacks = this.deviceCallbacks.get(deviceId) + const index = callbacks.indexOf(callback) + if (index > -1) { + callbacks.splice(index, 1) + } + } + } + + handleDeviceUpdate(payload) { + const { deviceId, status } = payload + if (this.deviceCallbacks.has(deviceId)) { + this.deviceCallbacks.get(deviceId).forEach(callback => { + try { + callback(status) + } catch (error) { + console.error('设备状态更新回调错误:', error) + } + }) + } + } +} + +// 导出设备WebSocket管理器实例 +export const deviceWebSocket = new DeviceWebSocketManager() \ No newline at end of file diff --git a/src/views/DeviceManage.vue b/src/views/DeviceManage.vue new file mode 100644 index 0000000..be3ffec --- /dev/null +++ b/src/views/DeviceManage.vue @@ -0,0 +1,64 @@ + + + + + \ No newline at end of file diff --git a/src/views/GuanglianDaDocument.vue b/src/views/GuanglianDaDocument.vue new file mode 100644 index 0000000..8b7e863 --- /dev/null +++ b/src/views/GuanglianDaDocument.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/views/HelpCenter.vue b/src/views/HelpCenter.vue new file mode 100644 index 0000000..a4a2a4d --- /dev/null +++ b/src/views/HelpCenter.vue @@ -0,0 +1,13 @@ + + + + + \ No newline at end of file diff --git a/src/views/PortManage.vue b/src/views/PortManage.vue new file mode 100644 index 0000000..8379b52 --- /dev/null +++ b/src/views/PortManage.vue @@ -0,0 +1,27 @@ + + + + + \ No newline at end of file diff --git a/src/views/login/Login.vue b/src/views/login/Login.vue new file mode 100644 index 0000000..a1e6b1c --- /dev/null +++ b/src/views/login/Login.vue @@ -0,0 +1,321 @@ + + + + + \ No newline at end of file diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..403d78b --- /dev/null +++ b/vite.config.js @@ -0,0 +1,16 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import { fileURLToPath, URL } from 'node:url' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], + define: { + 'process.env': process.env, // 注入环境变量 + }, + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + } + } +})