commit cfdaceff260e5f92bab8b74cd1ab732b1d8115bc Author: b2894lxlx <517289602@qq.com> Date: Tue Aug 4 13:21:17 2026 +0800 260804 diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..88de588 --- /dev/null +++ b/.env.development @@ -0,0 +1,2 @@ +#VITE_API_BASE_URL=http://127.0.0.1:8787 +VITE_API_BASE_URL=https://huicai-api.wsdns.cn diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..e75f66c --- /dev/null +++ b/.env.production @@ -0,0 +1 @@ +VITE_API_BASE_URL=https://huicai-api.wsdns.cn 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/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..a7cea0b --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["Vue.volar"] +} 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.json b/package.json new file mode 100644 index 0000000..ed86195 --- /dev/null +++ b/package.json @@ -0,0 +1,23 @@ +{ + "name": "huicai", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "axios": "^1.16.1", + "element-plus": "^2.14.0", + "vite-plugin-compression": "^0.5.1", + "vue": "^3.5.34", + "vue-router": "4" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.6", + "vite": "^8.0.12" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..64b7422 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,1179 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.3.2 + version: 2.3.2(vue@3.5.34) + axios: + specifier: ^1.16.1 + version: 1.16.1 + element-plus: + specifier: ^2.14.0 + version: 2.14.0(vue@3.5.34) + vite-plugin-compression: + specifier: ^0.5.1 + version: 0.5.1(vite@8.0.12) + vue: + specifier: ^3.5.34 + version: 3.5.34 + vue-router: + specifier: '4' + version: 4.6.4(vue@3.5.34) + devDependencies: + '@vitejs/plugin-vue': + specifier: ^6.0.6 + version: 6.0.6(vite@8.0.12)(vue@3.5.34) + vite: + specifier: ^8.0.12 + version: 8.0.12 + +packages: + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.29.3': + resolution: {integrity: sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.29.0': + resolution: {integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==} + engines: {node: '>=6.9.0'} + + '@ctrl/tinycolor@4.2.0': + resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} + engines: {node: '>=14'} + + '@element-plus/icons-vue@2.3.2': + resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==} + peerDependencies: + vue: ^3.2.0 + + '@emnapi/core@1.10.0': + resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + + '@emnapi/runtime@1.10.0': + resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + + '@emnapi/wasi-threads@1.2.1': + resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} + + '@floating-ui/core@1.7.5': + resolution: {integrity: sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==} + + '@floating-ui/dom@1.7.6': + resolution: {integrity: sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==} + + '@floating-ui/utils@0.2.11': + resolution: {integrity: sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@napi-rs/wasm-runtime@1.1.4': + resolution: {integrity: sha512-3NQNNgA1YSlJb/kMH1ildASP9HW7/7kYnRI2szWJaofaS1hWmbGI4H+d3+22aGzXXN9IJ+n+GiFVcGipJP18ow==} + peerDependencies: + '@emnapi/core': ^1.7.1 + '@emnapi/runtime': ^1.7.1 + + '@oxc-project/types@0.129.0': + resolution: {integrity: sha512-3oz8m3FGdr2nDXVqmFUw7jolKliC4MoyXYIG2c7gpjBnzUWQpUGIYcXYKxTdTi+N2jusvt610ckTMkxdwHkYEg==} + + '@rolldown/binding-android-arm64@1.0.0': + resolution: {integrity: sha512-TWMZnRLMe63C2Lhyicviu7ZHaU4kxa6PS3rofvc9GmcvptzNN11BcfQ4Sl7MwTOsisQoa2keB/EBdNCAnUo8vA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0': + resolution: {integrity: sha512-6XcD+8k0gPVItNagEw78/qqcBDwKcwDYS8V2hRmVsfUSIrd8cWe/CBvRDI5toqFyPfj+FJr6t8U6Xj2P2prEew==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0': + resolution: {integrity: sha512-iN/tWVXRQDWvmZlKdceP1Dwug9GDpEymhb9p4xnEe6zvCg5lFmzVljl+1qR1NVx3yfGpr2Na+CuLmv5IU8uzfQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0': + resolution: {integrity: sha512-jjQMDvvwSOuhOwMszD/klSOjyWMM3zI64hWTj9KT5x4MxRbZAf+7vLQ6qouRhtsLVFHr3f0ILaJAfgENPiQdAQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + resolution: {integrity: sha512-d//Dtg2x6/m3mbV64yUGNnDGNZaDGRpDLLNGerHQUVObuNaIQaaDp25yUiqGXtHEXX+NP2d0wAlmKgpYgIAJ2A==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0': + resolution: {integrity: sha512-n7Ofp0mx+aB2cC+Sdy5YtMnXtY9lchnHbY+3Yt0uq9JsWQExf4f5Whu0tK0R8Jdc9S6RchTHjIFY7uc92puOVQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-arm64-musl@1.0.0': + resolution: {integrity: sha512-EIVjy2cgd7uuMMo94FVkBp7F6DhcZAUwNURkSG3RwUmvAXR6s0ISxM81U+IydcZByPG0pZIHsf1b6kTxoFDgJA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + resolution: {integrity: sha512-JEwwOPcwTLAcpDQlqSmjEmfs63xJnSiUNIGvLcDLUHCWK4XowpS/7c7tUsUH6uT/ct6bMUTdXKfI8967FYj6mg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-s390x-gnu@1.0.0': + resolution: {integrity: sha512-0wjCFhLrihtAubnT9iA0N++0pSV0z5Hg7tNGdNJ4RFaINceHadoF+kiFGyY1qSSNVIAZtLotG8Ju1bgDPkjnFA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-gnu@1.0.0': + resolution: {integrity: sha512-Dfn7iak9BcMMePxcoJfpSbWqnEyrp/dRF63/8qW/eHBdOZov6x5aShLLEYGYdIeSJ6vMLK/XCVB+lGIxm41bQA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@rolldown/binding-linux-x64-musl@1.0.0': + resolution: {integrity: sha512-5/utzzDmD/pD/bmuaUcbTf/sZYy0aztwIVlfpoW1fTjCZ0BaPOMVWGZL1zvgxyi7ZIVYWlxKONHmSbHuiOh8Jw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + libc: [musl] + + '@rolldown/binding-openharmony-arm64@1.0.0': + resolution: {integrity: sha512-ouJs8VcUomfLfpbUECqFMRqdV4x6aeAK3MA4m6vTrJJjKyWTV5KnxZx7Jd9G+GlDaQQxubcba00x16OyJ1meig==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0': + resolution: {integrity: sha512-E+oHKGiDA+lsKMmFtffDDw91EryDT7uJocrIuCHqhm6bCTM6xFK+3gaCkYOHfPwQr0cCNarSM2xaELoQDz9jJg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0': + resolution: {integrity: sha512-yYK02n8Rngo+gbm1y6G0+7jk1sJ/2Wt7K0me0Y7k/ErBpyf+LJ2gFpqWVTcRV1rUepBlQRmpgWkTQCiiwrK0Ow==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0': + resolution: {integrity: sha512-14bpChMahXRRXiTwahSl+zzHPW6qQTXtkMuJBFlbo+pqSAews2d4BdCSHfrJ/MBsCZtpmTafsY+1QhBzitcmdg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + + '@rolldown/pluginutils@1.0.0': + resolution: {integrity: sha512-aKs/3GSWyV0mrhNmt/96/Z3yczC3yvrzYATCiCXQebBsGyYzjNdUphRVLeJQ67ySKVXRfMxt2lm12pmXvbPFQQ==} + + '@rolldown/pluginutils@1.0.0-rc.13': + resolution: {integrity: sha512-3ngTAv6F/Py35BsYbeeLeecvhMKdsKm4AoOETVhAA+Qc8nrA2I0kF7oa93mE9qnIurngOSpMnQ0x2nQY2FPviA==} + + '@sxzz/popperjs-es@2.11.8': + resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==} + + '@tybys/wasm-util@0.10.2': + resolution: {integrity: sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.24': + resolution: {integrity: sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + + '@vitejs/plugin-vue@6.0.6': + resolution: {integrity: sha512-u9HHgfrq3AjXlysn0eINFnWQOJQLO9WN6VprZ8FXl7A2bYisv3Hui9Ij+7QZ41F/WYWarHjwBbXtD7dKg3uxbg==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.34': + resolution: {integrity: sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==} + + '@vue/compiler-dom@3.5.34': + resolution: {integrity: sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==} + + '@vue/compiler-sfc@3.5.34': + resolution: {integrity: sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==} + + '@vue/compiler-ssr@3.5.34': + resolution: {integrity: sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/reactivity@3.5.34': + resolution: {integrity: sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==} + + '@vue/runtime-core@3.5.34': + resolution: {integrity: sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==} + + '@vue/runtime-dom@3.5.34': + resolution: {integrity: sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==} + + '@vue/server-renderer@3.5.34': + resolution: {integrity: sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==} + peerDependencies: + vue: 3.5.34 + + '@vue/shared@3.5.34': + resolution: {integrity: sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==} + + '@vueuse/core@14.3.0': + resolution: {integrity: sha512-aHfz47g0ZhMtTVHmIzMVpJy8ePhhOy68GY5bv110+5DVtZ+W7BsOx+m61UNQqfrWyPztIHIanWa3E2tib3NFIw==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/metadata@14.3.0': + resolution: {integrity: sha512-BwxmbAzwAVF50+MW57GXOUEV61nFBGnlBvrTqj49PqWJu3uw7hdu72ztXeZ33RdZtDY6kO+bfCAE1PCn88Tktw==} + + '@vueuse/shared@14.3.0': + resolution: {integrity: sha512-bZpge9eSXwa4ToSiqJ7j6KRwhAsneMFoSz3LMWKQDkqimm3D/tbFlrklrs/IOqC8tEcYmXQZJ6N0UrjhBirVCg==} + peerDependencies: + vue: ^3.5.0 + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.16.1: + resolution: {integrity: sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + dayjs@1.11.20: + resolution: {integrity: sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==} + + debug@4.4.3: + resolution: {integrity: sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + element-plus@2.14.0: + resolution: {integrity: sha512-POgH+TtoreaEKWqYYAVQyE6i8rQMEFqAEublyF29dBA5yASWPLKY6EzfeqBTr2Uv26mPss4vSrMrNPyaK7LX5w==} + peerDependencies: + vue: ^3.3.7 + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + follow-redirects@1.16.0: + resolution: {integrity: sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.3: + resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} + engines: {node: '>= 0.4'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + jsonfile@6.2.1: + resolution: {integrity: sha512-zwOTdL3rFQ/lRdBnntKVOX6k5cKJwEc1HdilT71BWEu7J41gXIB2MRp+vxduPSwZJPWBxEzv4yH1wYLJGUHX4Q==} + + lightningcss-android-arm64@1.32.0: + resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [android] + + lightningcss-darwin-arm64@1.32.0: + resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + + lightningcss-darwin-x64@1.32.0: + resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + + lightningcss-freebsd-x64@1.32.0: + resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + + lightningcss-linux-arm-gnueabihf@1.32.0: + resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + + lightningcss-linux-arm64-gnu@1.32.0: + resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [glibc] + + lightningcss-linux-arm64-musl@1.32.0: + resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + libc: [musl] + + lightningcss-linux-x64-gnu@1.32.0: + resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [glibc] + + lightningcss-linux-x64-musl@1.32.0: + resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + libc: [musl] + + lightningcss-win32-arm64-msvc@1.32.0: + resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.32.0: + resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.32.0: + resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} + engines: {node: '>= 12.0.0'} + + lodash-es@4.18.1: + resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash@4.18.1: + resolution: {integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + nanoid@3.3.12: + resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + + postcss@8.5.14: + resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} + engines: {node: ^10 || ^12 || >=14} + + proxy-from-env@2.1.0: + resolution: {integrity: sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==} + engines: {node: '>=10'} + + rolldown@1.0.0: + resolution: {integrity: sha512-yD986aXDESFGS95spT1LAv0jssywP4npMEjmMHyN2/5+eE8qQJUype2AaKkRiLgBgyD0LFlubwAht7VmY8rGoA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + tinyglobby@0.2.16: + resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} + engines: {node: '>=12.0.0'} + + tslib@2.8.1: + resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + vite-plugin-compression@0.5.1: + resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==} + peerDependencies: + vite: '>=2.0.0' + + vite@8.0.12: + resolution: {integrity: sha512-w2dDofOWv2QB09ZITZBsvKTVAlYvPR4IAmrY/v0ir9KvLs0xybR7i48wxhM1/oyBWO34wPns+bPGw5ZrZqDpZg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + '@vitejs/devtools': ^0.1.18 + esbuild: ^0.27.0 || ^0.28.0 + jiti: '>=1.21.0' + less: ^4.0.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 + '@vitejs/devtools': + optional: true + esbuild: + optional: true + jiti: + optional: true + less: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vue-component-type-helpers@3.2.9: + resolution: {integrity: sha512-S3BiWYaLSzHxTpln665ELSrMR9UYmrIDUmhik7nVZxmJjTKL2/a+ew1hvGxksKelivm0ujjWfG1fYOiU/2e8rA==} + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue@3.5.34: + resolution: {integrity: sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + +snapshots: + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.29.3': + dependencies: + '@babel/types': 7.29.0 + + '@babel/types@7.29.0': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@ctrl/tinycolor@4.2.0': {} + + '@element-plus/icons-vue@2.3.2(vue@3.5.34)': + dependencies: + vue: 3.5.34 + + '@emnapi/core@1.10.0': + dependencies: + '@emnapi/wasi-threads': 1.2.1 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.10.0': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.2.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@floating-ui/core@1.7.5': + dependencies: + '@floating-ui/utils': 0.2.11 + + '@floating-ui/dom@1.7.6': + dependencies: + '@floating-ui/core': 1.7.5 + '@floating-ui/utils': 0.2.11 + + '@floating-ui/utils@0.2.11': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@napi-rs/wasm-runtime@1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@tybys/wasm-util': 0.10.2 + optional: true + + '@oxc-project/types@0.129.0': {} + + '@rolldown/binding-android-arm64@1.0.0': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0': + optional: true + + '@rolldown/binding-linux-ppc64-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-s390x-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0': + dependencies: + '@emnapi/core': 1.10.0 + '@emnapi/runtime': 1.10.0 + '@napi-rs/wasm-runtime': 1.1.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0': + optional: true + + '@rolldown/pluginutils@1.0.0': {} + + '@rolldown/pluginutils@1.0.0-rc.13': {} + + '@sxzz/popperjs-es@2.11.8': {} + + '@tybys/wasm-util@0.10.2': + dependencies: + tslib: 2.8.1 + optional: true + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.24 + + '@types/lodash@4.17.24': {} + + '@types/web-bluetooth@0.0.21': {} + + '@vitejs/plugin-vue@6.0.6(vite@8.0.12)(vue@3.5.34)': + dependencies: + '@rolldown/pluginutils': 1.0.0-rc.13 + vite: 8.0.12 + vue: 3.5.34 + + '@vue/compiler-core@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/shared': 3.5.34 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.34': + dependencies: + '@vue/compiler-core': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/compiler-sfc@3.5.34': + dependencies: + '@babel/parser': 7.29.3 + '@vue/compiler-core': 3.5.34 + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.14 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.34': + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/devtools-api@6.6.4': {} + + '@vue/reactivity@3.5.34': + dependencies: + '@vue/shared': 3.5.34 + + '@vue/runtime-core@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/shared': 3.5.34 + + '@vue/runtime-dom@3.5.34': + dependencies: + '@vue/reactivity': 3.5.34 + '@vue/runtime-core': 3.5.34 + '@vue/shared': 3.5.34 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.34(vue@3.5.34)': + dependencies: + '@vue/compiler-ssr': 3.5.34 + '@vue/shared': 3.5.34 + vue: 3.5.34 + + '@vue/shared@3.5.34': {} + + '@vueuse/core@14.3.0(vue@3.5.34)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.3.0 + '@vueuse/shared': 14.3.0(vue@3.5.34) + vue: 3.5.34 + + '@vueuse/metadata@14.3.0': {} + + '@vueuse/shared@14.3.0(vue@3.5.34)': + dependencies: + vue: 3.5.34 + + agent-base@6.0.2: + dependencies: + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + axios@1.16.1: + dependencies: + follow-redirects: 1.16.0 + form-data: 4.0.5 + https-proxy-agent: 5.0.1 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + - supports-color + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + csstype@3.2.3: {} + + dayjs@1.11.20: {} + + debug@4.4.3: + dependencies: + ms: 2.1.3 + + delayed-stream@1.0.0: {} + + detect-libc@2.1.2: {} + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + element-plus@2.14.0(vue@3.5.34): + dependencies: + '@ctrl/tinycolor': 4.2.0 + '@element-plus/icons-vue': 2.3.2(vue@3.5.34) + '@floating-ui/dom': 1.7.6 + '@popperjs/core': '@sxzz/popperjs-es@2.11.8' + '@types/lodash': 4.17.24 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 14.3.0(vue@3.5.34) + async-validator: 4.2.5 + dayjs: 1.11.20 + lodash: 4.18.1 + lodash-es: 4.18.1 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.34 + vue-component-type-helpers: 3.2.9 + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.3 + + estree-walker@2.0.2: {} + + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + + follow-redirects@1.16.0: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.3 + mime-types: 2.1.35 + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.2.1 + universalify: 2.0.1 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.3 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + graceful-fs@4.2.11: {} + + has-flag@4.0.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.3: + dependencies: + function-bind: 1.1.2 + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + jsonfile@6.2.1: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + lightningcss-android-arm64@1.32.0: + optional: true + + lightningcss-darwin-arm64@1.32.0: + optional: true + + lightningcss-darwin-x64@1.32.0: + optional: true + + lightningcss-freebsd-x64@1.32.0: + optional: true + + lightningcss-linux-arm-gnueabihf@1.32.0: + optional: true + + lightningcss-linux-arm64-gnu@1.32.0: + optional: true + + lightningcss-linux-arm64-musl@1.32.0: + optional: true + + lightningcss-linux-x64-gnu@1.32.0: + optional: true + + lightningcss-linux-x64-musl@1.32.0: + optional: true + + lightningcss-win32-arm64-msvc@1.32.0: + optional: true + + lightningcss-win32-x64-msvc@1.32.0: + optional: true + + lightningcss@1.32.0: + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + lightningcss-android-arm64: 1.32.0 + lightningcss-darwin-arm64: 1.32.0 + lightningcss-darwin-x64: 1.32.0 + lightningcss-freebsd-x64: 1.32.0 + lightningcss-linux-arm-gnueabihf: 1.32.0 + lightningcss-linux-arm64-gnu: 1.32.0 + lightningcss-linux-arm64-musl: 1.32.0 + lightningcss-linux-x64-gnu: 1.32.0 + lightningcss-linux-x64-musl: 1.32.0 + lightningcss-win32-arm64-msvc: 1.32.0 + lightningcss-win32-x64-msvc: 1.32.0 + + lodash-es@4.18.1: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.18.1 + lodash-es: 4.18.1 + + lodash@4.18.1: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + memoize-one@6.0.0: {} + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + ms@2.1.3: {} + + nanoid@3.3.12: {} + + normalize-wheel-es@1.2.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.4: {} + + postcss@8.5.14: + dependencies: + nanoid: 3.3.12 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + proxy-from-env@2.1.0: {} + + rolldown@1.0.0: + dependencies: + '@oxc-project/types': 0.129.0 + '@rolldown/pluginutils': 1.0.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0 + '@rolldown/binding-darwin-arm64': 1.0.0 + '@rolldown/binding-darwin-x64': 1.0.0 + '@rolldown/binding-freebsd-x64': 1.0.0 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0 + '@rolldown/binding-linux-arm64-gnu': 1.0.0 + '@rolldown/binding-linux-arm64-musl': 1.0.0 + '@rolldown/binding-linux-ppc64-gnu': 1.0.0 + '@rolldown/binding-linux-s390x-gnu': 1.0.0 + '@rolldown/binding-linux-x64-gnu': 1.0.0 + '@rolldown/binding-linux-x64-musl': 1.0.0 + '@rolldown/binding-openharmony-arm64': 1.0.0 + '@rolldown/binding-wasm32-wasi': 1.0.0 + '@rolldown/binding-win32-arm64-msvc': 1.0.0 + '@rolldown/binding-win32-x64-msvc': 1.0.0 + + source-map-js@1.2.1: {} + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + tinyglobby@0.2.16: + dependencies: + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 + + tslib@2.8.1: + optional: true + + universalify@2.0.1: {} + + vite-plugin-compression@0.5.1(vite@8.0.12): + dependencies: + chalk: 4.1.2 + debug: 4.4.3 + fs-extra: 10.1.0 + vite: 8.0.12 + transitivePeerDependencies: + - supports-color + + vite@8.0.12: + dependencies: + lightningcss: 1.32.0 + picomatch: 4.0.4 + postcss: 8.5.14 + rolldown: 1.0.0 + tinyglobby: 0.2.16 + optionalDependencies: + fsevents: 2.3.3 + + vue-component-type-helpers@3.2.9: {} + + vue-router@4.6.4(vue@3.5.34): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.34 + + vue@3.5.34: + dependencies: + '@vue/compiler-dom': 3.5.34 + '@vue/compiler-sfc': 3.5.34 + '@vue/runtime-dom': 3.5.34 + '@vue/server-renderer': 3.5.34(vue@3.5.34) + '@vue/shared': 3.5.34 diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..532213d Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..6893eb1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/public/icons.svg b/public/icons.svg new file mode 100644 index 0000000..e952219 --- /dev/null +++ b/public/icons.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..bbd8bdd --- /dev/null +++ b/src/App.vue @@ -0,0 +1,142 @@ + + + diff --git a/src/assets/cgal-active.png b/src/assets/cgal-active.png new file mode 100644 index 0000000..28580fa Binary files /dev/null and b/src/assets/cgal-active.png differ diff --git a/src/assets/cgal.png b/src/assets/cgal.png new file mode 100644 index 0000000..8dadb27 Binary files /dev/null and b/src/assets/cgal.png differ diff --git a/src/assets/edit.png b/src/assets/edit.png new file mode 100644 index 0000000..98e0abb Binary files /dev/null and b/src/assets/edit.png differ diff --git a/src/assets/header-bg.png b/src/assets/header-bg.png new file mode 100644 index 0000000..1ba5dde Binary files /dev/null and b/src/assets/header-bg.png differ diff --git a/src/assets/hero.png b/src/assets/hero.png new file mode 100644 index 0000000..02251f4 Binary files /dev/null and b/src/assets/hero.png differ diff --git a/src/assets/hxywjz.png b/src/assets/hxywjz.png new file mode 100644 index 0000000..b94b412 Binary files /dev/null and b/src/assets/hxywjz.png differ diff --git a/src/assets/image_354242819928488.png b/src/assets/image_354242819928488.png new file mode 100644 index 0000000..b2850c1 Binary files /dev/null and b/src/assets/image_354242819928488.png differ diff --git a/src/assets/logo.png b/src/assets/logo.png new file mode 100644 index 0000000..1f43470 Binary files /dev/null and b/src/assets/logo.png differ diff --git a/src/assets/mock/news-1.png b/src/assets/mock/news-1.png new file mode 100644 index 0000000..063f2f8 Binary files /dev/null and b/src/assets/mock/news-1.png differ diff --git a/src/assets/mock/news-2.png b/src/assets/mock/news-2.png new file mode 100644 index 0000000..f24d921 Binary files /dev/null and b/src/assets/mock/news-2.png differ diff --git a/src/assets/mock/news-3.png b/src/assets/mock/news-3.png new file mode 100644 index 0000000..67cf0e9 Binary files /dev/null and b/src/assets/mock/news-3.png differ diff --git a/src/assets/pdf/Page_10_docsmall.com.jpg b/src/assets/pdf/Page_10_docsmall.com.jpg new file mode 100644 index 0000000..6d61cba Binary files /dev/null and b/src/assets/pdf/Page_10_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_11_docsmall.com.jpg b/src/assets/pdf/Page_11_docsmall.com.jpg new file mode 100644 index 0000000..8293f04 Binary files /dev/null and b/src/assets/pdf/Page_11_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_13_docsmall.com.jpg b/src/assets/pdf/Page_13_docsmall.com.jpg new file mode 100644 index 0000000..0ffb659 Binary files /dev/null and b/src/assets/pdf/Page_13_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_14_docsmall.com.jpg b/src/assets/pdf/Page_14_docsmall.com.jpg new file mode 100644 index 0000000..d2b6224 Binary files /dev/null and b/src/assets/pdf/Page_14_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_15_docsmall.com.jpg b/src/assets/pdf/Page_15_docsmall.com.jpg new file mode 100644 index 0000000..f6e0f07 Binary files /dev/null and b/src/assets/pdf/Page_15_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_16_docsmall.com.jpg b/src/assets/pdf/Page_16_docsmall.com.jpg new file mode 100644 index 0000000..f8b901c Binary files /dev/null and b/src/assets/pdf/Page_16_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_17_docsmall.com.jpg b/src/assets/pdf/Page_17_docsmall.com.jpg new file mode 100644 index 0000000..fa7169e Binary files /dev/null and b/src/assets/pdf/Page_17_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_18_docsmall.com.jpg b/src/assets/pdf/Page_18_docsmall.com.jpg new file mode 100644 index 0000000..954f785 Binary files /dev/null and b/src/assets/pdf/Page_18_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_19_docsmall.com.jpg b/src/assets/pdf/Page_19_docsmall.com.jpg new file mode 100644 index 0000000..61af51d Binary files /dev/null and b/src/assets/pdf/Page_19_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_20_docsmall.com.jpg b/src/assets/pdf/Page_20_docsmall.com.jpg new file mode 100644 index 0000000..ec3decb Binary files /dev/null and b/src/assets/pdf/Page_20_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_21_docsmall.com.jpg b/src/assets/pdf/Page_21_docsmall.com.jpg new file mode 100644 index 0000000..782b3de Binary files /dev/null and b/src/assets/pdf/Page_21_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_22_docsmall.com.jpg b/src/assets/pdf/Page_22_docsmall.com.jpg new file mode 100644 index 0000000..9516a22 Binary files /dev/null and b/src/assets/pdf/Page_22_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_23_docsmall.com.jpg b/src/assets/pdf/Page_23_docsmall.com.jpg new file mode 100644 index 0000000..f45fb92 Binary files /dev/null and b/src/assets/pdf/Page_23_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_24_docsmall.com.jpg b/src/assets/pdf/Page_24_docsmall.com.jpg new file mode 100644 index 0000000..e9de8a2 Binary files /dev/null and b/src/assets/pdf/Page_24_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_25_docsmall.com.jpg b/src/assets/pdf/Page_25_docsmall.com.jpg new file mode 100644 index 0000000..cd18b45 Binary files /dev/null and b/src/assets/pdf/Page_25_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_26_docsmall.com.jpg b/src/assets/pdf/Page_26_docsmall.com.jpg new file mode 100644 index 0000000..31172af Binary files /dev/null and b/src/assets/pdf/Page_26_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_27_docsmall.com.jpg b/src/assets/pdf/Page_27_docsmall.com.jpg new file mode 100644 index 0000000..62d6a46 Binary files /dev/null and b/src/assets/pdf/Page_27_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_29_docsmall.com.jpg b/src/assets/pdf/Page_29_docsmall.com.jpg new file mode 100644 index 0000000..4cf2d8c Binary files /dev/null and b/src/assets/pdf/Page_29_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_30_docsmall.com.jpg b/src/assets/pdf/Page_30_docsmall.com.jpg new file mode 100644 index 0000000..b46210c Binary files /dev/null and b/src/assets/pdf/Page_30_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_31_docsmall.com.jpg b/src/assets/pdf/Page_31_docsmall.com.jpg new file mode 100644 index 0000000..5f81184 Binary files /dev/null and b/src/assets/pdf/Page_31_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_32_docsmall.com.jpg b/src/assets/pdf/Page_32_docsmall.com.jpg new file mode 100644 index 0000000..c3ede8a Binary files /dev/null and b/src/assets/pdf/Page_32_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_33_docsmall.com.jpg b/src/assets/pdf/Page_33_docsmall.com.jpg new file mode 100644 index 0000000..801c667 Binary files /dev/null and b/src/assets/pdf/Page_33_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_34_docsmall.com.jpg b/src/assets/pdf/Page_34_docsmall.com.jpg new file mode 100644 index 0000000..83ece8d Binary files /dev/null and b/src/assets/pdf/Page_34_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_35_docsmall.com.jpg b/src/assets/pdf/Page_35_docsmall.com.jpg new file mode 100644 index 0000000..a4bccce Binary files /dev/null and b/src/assets/pdf/Page_35_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_37_docsmall.com.jpg b/src/assets/pdf/Page_37_docsmall.com.jpg new file mode 100644 index 0000000..2ef2704 Binary files /dev/null and b/src/assets/pdf/Page_37_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_38_docsmall.com.jpg b/src/assets/pdf/Page_38_docsmall.com.jpg new file mode 100644 index 0000000..2fb86ce Binary files /dev/null and b/src/assets/pdf/Page_38_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_39_docsmall.com.jpg b/src/assets/pdf/Page_39_docsmall.com.jpg new file mode 100644 index 0000000..2bd7406 Binary files /dev/null and b/src/assets/pdf/Page_39_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_5_docsmall.com.jpg b/src/assets/pdf/Page_5_docsmall.com.jpg new file mode 100644 index 0000000..683e496 Binary files /dev/null and b/src/assets/pdf/Page_5_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_6_docsmall.com.jpg b/src/assets/pdf/Page_6_docsmall.com.jpg new file mode 100644 index 0000000..bf9e70f Binary files /dev/null and b/src/assets/pdf/Page_6_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_7_docsmall.com.jpg b/src/assets/pdf/Page_7_docsmall.com.jpg new file mode 100644 index 0000000..593f988 Binary files /dev/null and b/src/assets/pdf/Page_7_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_8_docsmall.com.jpg b/src/assets/pdf/Page_8_docsmall.com.jpg new file mode 100644 index 0000000..95fcf60 Binary files /dev/null and b/src/assets/pdf/Page_8_docsmall.com.jpg differ diff --git a/src/assets/pdf/Page_9_docsmall.com.jpg b/src/assets/pdf/Page_9_docsmall.com.jpg new file mode 100644 index 0000000..39c1bc3 Binary files /dev/null and b/src/assets/pdf/Page_9_docsmall.com.jpg differ diff --git a/src/assets/phone.png b/src/assets/phone.png new file mode 100644 index 0000000..3df02b9 Binary files /dev/null and b/src/assets/phone.png differ diff --git a/src/assets/qr.png b/src/assets/qr.png new file mode 100644 index 0000000..96c20af Binary files /dev/null and b/src/assets/qr.png differ diff --git a/src/assets/qyys_0.png b/src/assets/qyys_0.png new file mode 100644 index 0000000..002eb4f Binary files /dev/null and b/src/assets/qyys_0.png differ diff --git a/src/assets/qyys_1.png b/src/assets/qyys_1.png new file mode 100644 index 0000000..491f68a Binary files /dev/null and b/src/assets/qyys_1.png differ diff --git a/src/assets/qyys_2.png b/src/assets/qyys_2.png new file mode 100644 index 0000000..63d3b00 Binary files /dev/null and b/src/assets/qyys_2.png differ diff --git a/src/assets/qyys_3.png b/src/assets/qyys_3.png new file mode 100644 index 0000000..e2d6826 Binary files /dev/null and b/src/assets/qyys_3.png differ diff --git a/src/assets/暂无内容.png b/src/assets/暂无内容.png new file mode 100644 index 0000000..70077d9 Binary files /dev/null and b/src/assets/暂无内容.png differ diff --git a/src/components/SiteFooter.vue b/src/components/SiteFooter.vue new file mode 100644 index 0000000..279c670 --- /dev/null +++ b/src/components/SiteFooter.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/components/SiteHeader.vue b/src/components/SiteHeader.vue new file mode 100644 index 0000000..a45b312 --- /dev/null +++ b/src/components/SiteHeader.vue @@ -0,0 +1,279 @@ + + + diff --git a/src/data/siteContent.js b/src/data/siteContent.js new file mode 100644 index 0000000..a195a11 --- /dev/null +++ b/src/data/siteContent.js @@ -0,0 +1,10 @@ +export const navItems = [ + { label: '首页', to: '/' }, + { label: '关于我们', to: '/about' }, + { label: '党建文化', to: '/party-culture', dropdown: true, dropdownKey: 'partyCulture' }, + { label: '产品中心', to: '/products', dropdown: true, dropdownKey: 'products' }, + { label: '运营服务', to: '/services', dropdown: true, dropdownKey: 'services' }, + { label: '数智咨询', to: '/consulting', dropdown: true, dropdownKey: 'consulting' }, + { label: '成功案例', to: '/cases', dropdown: true, dropdownKey: 'cases' }, + { label: '新闻动态', to: '/news', dropdown: true, dropdownKey: 'news' }, +] diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..eb2cbd2 --- /dev/null +++ b/src/main.js @@ -0,0 +1,8 @@ +import { createApp } from 'vue' +import ElementPlus from 'element-plus' +import router from './router' +import 'element-plus/dist/index.css' +import './style.css' +import App from './App.vue' + +createApp(App).use(router).use(ElementPlus).mount('#app') diff --git a/src/router/index.js b/src/router/index.js new file mode 100644 index 0000000..488f5c3 --- /dev/null +++ b/src/router/index.js @@ -0,0 +1,130 @@ +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '../views/HomeView.vue' +import NewsView from '../views/NewsView.vue' +import NewsDetailView from '../views/NewsDetailView.vue' +import CasesView from '../views/CasesView.vue' +import CaseDetailView from '../views/CaseDetailView.vue' +import ConsultingView from '../views/ConsultingView.vue' +import ConsultingRequestView from '../views/ConsultingRequestView.vue' +import ServiceDetailView from '../views/ServiceDetailView.vue' +import AboutView from '../views/AboutView.vue' +import ContactView from '../views/ContactView.vue' +import NoticeView from '../views/NoticeView.vue' +import ProductsView from '../views/ProductsView.vue' +import ProductDetailView from '../views/ProductDetailView.vue' +import PartyCultureView from '../views/PartyCultureView.vue' +import PartyCultureDetailView from '../views/PartyCultureDetailView.vue' +import ServicesView from '../views/ServicesView.vue' + +const router = createRouter({ + history: createWebHistory(), + routes: [ + { + path: '/', + name: 'home', + component: HomeView, + meta: { title: '首页' }, + }, + { + path: '/news/:slug', + name: 'news-detail', + component: NewsDetailView, + meta: { title: '新闻详情' }, + }, + { + path: '/news', + name: 'news', + component: NewsView, + meta: { title: '新闻动态' }, + }, + { + path: '/cases', + name: 'cases', + component: CasesView, + meta: { title: '成功案例' }, + }, + { + path: '/cases/:slug', + name: 'case-detail', + component: CaseDetailView, + meta: { title: '案例详情' }, + }, + { + path: '/consulting', + name: 'consulting', + component: ConsultingView, + meta: { title: '数智咨询' }, + }, + { + path: '/consulting/:slug', + name: 'consulting-detail', + component: ServiceDetailView, + meta: { title: '咨询详情' }, + }, + { + path: '/consulting/request', + name: 'consulting-request', + component: ConsultingRequestView, + meta: { title: '咨询需求' }, + }, + { + path: '/about', + name: 'about', + component: AboutView, + meta: { title: '关于我们' }, + }, + { + path: '/contact', + name: 'contact', + component: ContactView, + meta: { title: '联系我们' }, + }, + { + path: '/notice', + name: 'notice', + component: NoticeView, + meta: { title: '公告声明' }, + }, + { + path: '/products', + name: 'products', + component: ProductsView, + meta: { title: '产品中心' }, + }, + { + path: '/party-culture', + name: 'party-culture', + component: PartyCultureView, + meta: { title: '党建文化' }, + }, + { + path: '/party-culture/:slug', + name: 'party-culture-detail', + component: PartyCultureDetailView, + meta: { title: '党建文化详情' }, + }, + { + path: '/products/:slug', + name: 'product-detail', + component: ProductDetailView, + meta: { title: '产品详情' }, + }, + { + path: '/services', + name: 'services', + component: ServicesView, + meta: { title: '运营服务' }, + }, + { + path: '/services/:slug', + name: 'service-detail', + component: ServiceDetailView, + meta: { title: '服务详情' }, + }, + ], + scrollBehavior() { + return { top: 0 } + }, +}) + +export default router diff --git a/src/style.css b/src/style.css new file mode 100644 index 0000000..8e4b028 --- /dev/null +++ b/src/style.css @@ -0,0 +1,3088 @@ +:root { + font-family: KaiTi, '楷体', STKaiti, '华文楷体', 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Arial, sans-serif; + color: #2f3239; + background: #ffffff; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + --container: 1000px; + --header-container: 1200px; + --accent: #df3a2f; + --accent-strong: #e51717; + --text: #2f3239; + --muted: #7e8187; + --light-bg: #f3f3f5; + --card-shadow: 0 18px 50px rgba(38, 44, 58, 0.06); + --el-font-family: KaiTi, '楷体', STKaiti, '华文楷体', 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Arial, sans-serif; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; +} + +body { + margin: 0; + min-width: 1080px; + background: #ffffff; + color: var(--text); +} + +a { + color: inherit; + text-decoration: none; +} + +.map-link { + color: var(--accent); + text-decoration: underline; + text-underline-offset: 3px; +} + +.map-link:hover { + opacity: 0.86; +} + +button, +input, +textarea, +select { + font: inherit; +} + +img { + display: block; + max-width: 100%; +} + +#app { + width: 100%; +} + +.page { + width: 100%; + overflow-x: hidden; + padding-top: 88px; +} + +.container { + width: min(var(--container), calc(100% - 80px)); + margin: 0 auto; +} + +.site-header .container, +.nav-dropdown .container { + width: min(var(--header-container), calc(100% - 96px)); +} + +.site-header { + position: fixed; + top: 0; + left: 0; + right: 0; + width: 100%; + z-index: 20; + background: rgba(255, 255, 255, 0.96); + backdrop-filter: blur(12px); + border-bottom: 1px solid rgba(223, 58, 47, 0.06); +} + +.header-inner { + height: 88px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 32px; +} + +.brand { + display: flex; + align-items: center; + min-width: 0; + flex: 0 0 auto; +} + +.brand-logo { + width: 230px; + height: auto; + max-width: 100%; + object-fit: contain; +} + +.site-nav { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 10px; + flex-wrap: nowrap; + height: 100%; + min-width: 0; +} + +.nav-item { + position: relative; + height: 100%; + display: flex; + align-items: center; +} + +.nav-link { + position: relative; + height: 36px; + display: inline-flex; + align-items: center; + padding: 8px 14px; + font-size: 15px; + font-weight: 600; + color: #4a4a4f; + transition: color 0.25s ease, + transform 0.25s ease; + white-space: nowrap; +} + +.nav-link.router-link-active, +.nav-link.router-link-exact-active, +.nav-link.active { + background: rgba(223, 58, 47, 0.1); + color: var(--accent); + border-radius: 999px; +} + +.nav-link:hover, +.nav-item:hover > .nav-link, +.nav-item.has-dropdown:hover > .nav-link { + color: var(--accent); +} + +.nav-item:hover > .nav-link::after, +.nav-item.has-dropdown:hover > .nav-link::after { + content: ''; + position: absolute; + left: 18px; + right: 18px; + bottom: 0; + height: 6px; + background: var(--accent); +} + +.nav-link.router-link-active::after, +.nav-link.router-link-exact-active::after, +.nav-link.active::after { + display: none; +} + +.nav-dropdown { + position: absolute; + top: 100%; + left: 50%; + width: max-content; + min-width: 220px; + max-width: calc(100vw - 96px); + background: + url('./assets/header-bg.png') center/cover no-repeat; + border: 1px solid rgba(0, 0, 0, 0.04); + border-radius: 8px; + box-shadow: 0 18px 38px rgba(50, 54, 66, 0.06); + opacity: 0; + visibility: hidden; + transform: translate(-50%, 10px); + pointer-events: none; + overflow: hidden; + transition: opacity 0.22s ease, + transform 0.22s ease, + visibility 0.22s ease; +} + +.nav-item.has-dropdown:hover .nav-dropdown { + opacity: 1; + visibility: visible; + transform: translate(-50%, 0); + pointer-events: auto; +} + +.dropdown-inner { + width: max-content; + min-width: 220px; + max-width: calc(100vw - 96px); + min-height: 260px; + display: grid; + grid-template-columns: max-content max-content; + overflow: hidden; +} + +.dropdown-inner-flat { + min-height: 0; + display: block; + padding: 12px 18px; +} + +.dropdown-groups { + min-width: 180px; + padding: 22px 0; + border-right: 1px solid #f0f0f2; +} + +.dropdown-group-link { + min-height: 52px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 14px; + padding: 0 24px 0 18px; + font-size: 16px; + font-weight: 500; + color: #73767d; + border-radius: 6px; + transition: background-color 0.2s ease, + color 0.2s ease; +} + +.dropdown-group-link:hover, +.dropdown-group-link.active { + background: rgba(223, 58, 47, 0.08); + color: #73767d; +} + +.dropdown-arrow { + width: 12px; + height: 12px; + display: inline-block; + border-top: 2px solid #f0a59d; + border-right: 2px solid #f0a59d; + transform: rotate(45deg); + margin-right: 2px; +} + +.dropdown-links { + min-width: 180px; + padding: 22px 32px; + display: flex; + flex-direction: column; +} + +.dropdown-links-flat { + padding-left: 0; + padding-right: 0; +} + +.dropdown-detail-link { + min-height: 52px; + display: flex; + align-items: center; + font-size: 16px; + font-weight: 500; + color: #7a7d84; + white-space: nowrap; + border-radius: 6px; + padding: 0 14px; + margin: 0 -14px; + transition: background-color 0.2s ease, + color 0.2s ease; +} + +.dropdown-detail-link:hover, +.dropdown-detail-link.accent { + background: rgba(223, 58, 47, 0.08); + color: #7a7d84; +} + +.hero-section { + position: relative; + min-height: 760px; + background: #f7fbff; + overflow: hidden; +} + +.hero-media, +.hero-media-fallback { + position: absolute; + inset: 0; + z-index: 0; +} + +.hero-slide { + position: relative; + width: 100%; + height: 760px; + cursor: pointer; + border: 0; + padding: 0; + background: transparent; +} + +.hero-slide img { + width: 100%; + height: 760px; + object-fit: cover; + display: block; +} + +.hero-indicators { + position: absolute; + left: 50%; + bottom: 38px; + z-index: 3; + width: min(1040px, calc(100% - 96px)); + display: flex; + flex-wrap: wrap; + justify-content: center; + gap: 12px; + transform: translateX(-50%); +} + +.hero-indicator { + width: max-content; + min-width: 120px; + min-height: 44px; + padding: 10px 22px; + border: 1px solid rgba(255, 255, 255, 0.72); + border-radius: 4px; + background: rgba(255, 255, 255, 0.82); + color: #4f535b; + font-size: 16px; + font-weight: 600; + line-height: 1.35; + white-space: nowrap; + cursor: pointer; + box-shadow: 0 8px 22px rgba(38, 44, 58, 0.08); + transition: background-color 0.2s ease, + border-color 0.2s ease, + color 0.2s ease, + box-shadow 0.2s ease; +} + +.hero-indicator:hover { + border-color: rgba(223, 58, 47, 0.38); + color: var(--accent); +} + +.hero-indicator.active { + border-color: var(--accent); + background: var(--accent); + color: #ffffff; + box-shadow: 0 12px 28px rgba(223, 58, 47, 0.28); +} + +.hero-backdrop { + position: absolute; + inset: 0; + background: linear-gradient(90deg, rgba(255, 255, 255, 0.82) 0%, rgba(255, 255, 255, 0.56) 32%, rgba(255, 255, 255, 0.1) 68%), + linear-gradient(180deg, rgba(255, 255, 255, 0.08), rgba(255, 255, 255, 0.02)); + z-index: 1; + pointer-events: none; +} + +.hero-content-inner { + position: relative; + z-index: 2; + min-height: 760px; + display: flex; + align-items: center; +} + +.hero-copy { + width: 58%; + padding-top: 6px; +} + +.hero-eyebrow { + margin: 0 0 26px; + font-size: 20px; + color: #ea594e; + letter-spacing: 1px; +} + +.hero-copy h2 { + margin: 0; + font-size: 60px; + line-height: 1.14; + font-weight: 500; + color: #dd3a2e; +} + +.hero-description { + margin: 34px 0 56px; + font-size: 18px; + line-height: 1.9; + color: #ef6b64; + max-width: 620px; +} + +.primary-button, +.outline-button, +.ghost-button { + display: inline-flex; + align-items: center; + justify-content: center; + border-radius: 999px; + transition: transform 0.25s ease, + box-shadow 0.25s ease, + background-color 0.25s ease, + color 0.25s ease, + border-color 0.25s ease; +} + +.primary-button { + min-width: 156px; + height: 58px; + padding: 0 30px; + background: linear-gradient(135deg, #f11f1c, #d71014); + color: #ffffff; + font-size: 24px; + box-shadow: 0 18px 32px rgba(223, 58, 47, 0.22); +} + +.primary-button:hover, +.outline-button:hover, +.ghost-button:hover, +.text-link:hover, +.footer-link:hover { + transform: translateY(-1px); +} + +.section { + padding: 88px 0 98px; +} + +.section-gray { + background: var(--light-bg); +} + +.section-heading { + margin-bottom: 58px; +} + +.section-heading.center { + text-align: center; +} + +.section-heading h2 { + margin: 0 0 10px; + font-size: 36px; + line-height: 1.2; + font-weight: 700; + color: #33353a; +} + +.section-heading p { + margin: 0; + font-size: 16px; + color: #999ca3; +} + +.advantages-layout { + display: grid; + grid-template-columns: 1.05fr 1.55fr; + gap: 54px; + align-items: start; +} + +.advantages-intro { + padding-top: 30px; +} + +.section-kicker { + margin: 0 0 18px; + font-size: 18px; + color: #ea5c4f; +} + +.advantages-intro h3, +.business-copy h3 { + margin: 0; + color: #2f3239; +} + +.advantages-intro h3 { + font-size: 34px; + line-height: 1.25; + font-weight: 700; +} + +.advantages-intro h3 span { + color: var(--accent); +} + +.intro-text { + margin: 28px 0 70px; + font-size: 16px; + line-height: 2; + color: #90929a; +} + +.stats-row { + display: flex; + gap: 48px; + margin-bottom: 58px; +} + +.stat-item { + min-width: 88px; +} + +.stat-item strong, +.stat-item span { + color: var(--accent); +} + +.stat-item strong { + font-size: 54px; + line-height: 1; + font-weight: 400; +} + +.stat-item span { + margin-left: 4px; + font-size: 28px; +} + +.stat-item p { + margin: 14px 0 0; + font-size: 16px; + color: #7d8188; +} + +.text-link { + color: var(--accent); + font-size: 16px; +} + +.advantages-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 26px; +} + +.adv-card { + min-height: 286px; + padding: 38px 34px 34px; + border-radius: 10px; + background: #ffffff; + box-shadow: var(--card-shadow); + border: 1px solid transparent; + transition: border-color .2s, box-shadow .2s; +} + +.adv-card:hover, +.adv-card:focus-within { + border-color: rgba(223, 58, 47, 0.35); + box-shadow: 0 18px 50px rgba(38, 44, 58, 0.08), + inset 3px 0 0 var(--accent); +} + +.adv-icon-wrap { + width: 54px; + height: 54px; + border-radius: 12px; + background: #f5f7f9; + display: flex; + align-items: center; + justify-content: center; + margin-bottom: 34px; + transition: background-color .2s; +} + +.adv-card:hover .adv-icon-wrap, +.adv-card:focus-within .adv-icon-wrap { + background: #fff4f4 !important; +} + +.adv-icon { + width: 30px; + height: 30px; + object-fit: contain; +} + +.adv-card h4 { + margin: 0 0 22px; + font-size: 18px; + color: #3a3c41; +} + +.adv-card p { + margin: 0; + font-size: 15px; + line-height: 2; + color: #7e8189; +} + +.adv-card-desc { + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 3; + overflow: hidden; + text-overflow: ellipsis; + min-height: 6em; + cursor: pointer; +} + +.adv-card-tooltip { + max-width: min(320px, calc(100vw - 32px)); + line-height: 1.7; + white-space: normal; + word-break: break-word; +} + +.business-section { + background: #ffffff; +} + +.business-container { + width: min(var(--container), calc(100% - 80px)); +} + +.business-carousel { + position: relative; + width: 100%; +} + +.business-carousel-item { + border-radius: 25px; + overflow: hidden; +} + +.business-heading { + margin-bottom: 46px; +} + +.business-card { + position: relative; + border: none; + border-radius: 12px; + height: 630px; + background-color: #fafcff; + background-repeat: no-repeat; + background-position: center center; + background-size: cover; + overflow: hidden; +} + +.business-card-media, +.business-card-media img { + display: block; + width: 100%; + height: 100%; +} + +.business-card-media, +.business-card-mask { + display: none; +} + +.business-card-media img { + object-fit: cover; +} + +.business-card-mask { + position: absolute; + inset: 0; + background: + linear-gradient(180deg, rgba(12, 24, 40, 0.12) 0%, rgba(12, 24, 40, 0.5) 56%, rgba(12, 24, 40, 0.76) 100%), + linear-gradient(90deg, rgba(12, 24, 40, 0.7) 0%, rgba(12, 24, 40, 0.42) 42%, rgba(12, 24, 40, 0.12) 100%); +} + +.business-card-image { + width: 100%; + min-height: 530px; +} + +.business-card-split, +.business-card-bg, +.business-card-overlay { + overflow: hidden; +} + +.business-card-bg { + background-color: #f8fbff; + background-repeat: no-repeat; + background-position: center center; + background-size: cover; +} + +.business-card-overlay { + background: #0d1c2d; +} + +.business-card-content { + display: flex; + flex-direction: column; + justify-content: flex-start; + position: relative; + padding: 56px 64px; + width: min(100%, 52%); + min-height: 100%; + z-index: 1; +} + +.business-card-content::after { + content: ''; + position: absolute; + top: 0; + right: -1px; + width: 30px; + height: 100%; + /*background: linear-gradient(90deg, rgba(255, 251, 255, 0) 0%, rgba(0, 0, 0, 0.1) 100%);*/ + pointer-events: none; +} + +.business-card-kicker { + margin: 0 0 18px; + font-size: 14px; + font-weight: 600; + letter-spacing: 0.28em; + color: #8c98ab; +} + +.business-card-content h3 { + margin: 0 0 24px; + font-size: clamp(30px, 4vw, 40px); + line-height: 1.25; + color: #1f2f46; +} + +.business-card-text { + max-width: 560px; + font-size: 16px; + line-height: 1.95; + color: #556070; +} + +.business-tag-list { + display: flex; + flex-wrap: wrap; + gap: 20px 18px; + margin-top: 84px; +} + +.business-tag { + display: inline-flex; + align-items: center; + justify-content: center; + min-height: 46px; + padding: 10px 26px; + border-radius: 999px; + font-size: 16px; + line-height: 1.3; + font-weight: 600; + color: #ffffff; + background: linear-gradient(180deg, #ff2f2f 0%, #e71919 100%); + box-shadow: 0 14px 28px rgba(231, 25, 25, 0.24); +} + +.business-card-text :is(p, ul, ol) { + margin-top: 0; + margin-bottom: 16px; +} + +.business-card-text :is(h1, h2, h3, h4, h5, h6, strong, b, a, li, span) { + color: inherit; +} + +.business-card-text :is(p, li):last-child { + margin-bottom: 0; +} + +.arrow-button { + position: absolute; + top: 50%; + width: 88px; + height: 108px; + /*border: 1px solid rgba(255, 80, 80, 0.32);*/ + border: none; + background: rgba(255, 255, 255, 0.96); + transform: translateY(-50%); + cursor: pointer; + z-index: 3; + transition: border-color 0.2s ease, + box-shadow 0.2s ease, + transform 0.2s ease; +} + +.arrow-button:hover { + /*border-color: rgba(255, 80, 80, 0.66);*/ + /*box-shadow: 0 18px 36px rgba(223, 58, 47, 0.12);*/ +} + +.arrow-button span { + position: relative; + display: block; + width: 34px; + height: 34px; + margin: 0 auto; +} + +.arrow-button span::before, +.arrow-button span::after { + content: ''; + position: absolute; + left: 16px; + width: 3px; + height: 24px; + border-radius: 999px; + background: #ff5446; + transform-origin: center; +} + +.arrow-button.left span::before, +.arrow-button.right span::before { + top: -2px; +} + +.arrow-button.left span::after, +.arrow-button.right span::after { + top: 12px; +} + +.arrow-button.left span::before { + transform: rotate(45deg); +} + +.arrow-button.left span::after { + transform: rotate(-45deg); +} + +.arrow-button.right span::before { + transform: rotate(-45deg); +} + +.arrow-button.right span::after { + transform: rotate(45deg); +} + +.business-arrow.left { + left: -120px; +} + +.business-arrow.right { + right: -120px; +} + +.arrow-button.muted span::before, +.arrow-button.muted span::after { + background: #babcc2; +} + +.cases-section { + padding-top: 98px; + padding-bottom: 96px; +} + +.tab-row { + display: flex; + align-items: center; + justify-content: center; + gap: 54px; + margin-bottom: 44px; + flex-wrap: wrap; +} + +.tab-row.compact { + gap: 38px; + margin-bottom: 50px; +} + +.tab-link { + position: relative; + padding-bottom: 12px; + font-size: 18px; + color: #777b84; +} + +.tab-button { + border: none; + background: transparent; + cursor: pointer; +} + +.tab-link.active { + color: #44474d; +} + +.tab-link.active::after { + content: ''; + position: absolute; + left: 0; + right: 0; + bottom: 0; + height: 3px; + background: var(--accent); +} + +.cases-grid { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + gap: 24px; +} + +.case-card { + position: relative; + min-height: 458px; + border-radius: 8px; + background-color: rgba(255, 255, 255, 0.94); + background-repeat: no-repeat; + background-position: center bottom; + background-size: 100% 100%; + overflow: hidden; + padding: 56px 24px 34px; + text-align: center; + box-shadow: 0 16px 36px rgba(50, 54, 66, 0.06); + border: 1px solid transparent; + transition: background-image 0.2s ease, + border-color 0.2s ease, + box-shadow 0.2s ease, + transform 0.2s ease; +} + +.case-card:hover { + background-image: var(--case-bg-active) !important; + border-color: rgba(223, 58, 47, 0.32); +} + +.case-category { + margin: 0 0 28px; + font-size: 15px; + color: #8b8f96; +} + +.case-card h3 { + margin: 0; + height: calc(20px * 1.45 * 4); + font-size: 20px; + line-height: 1.45; + color: #2f3239; + display: -webkit-box; + overflow: hidden; + -webkit-box-orient: vertical; + -webkit-line-clamp: 4; +} + +.case-subtitle { + margin: 18px 0 30px; + min-height: 54px; + font-size: 16px; + line-height: 1.7; + color: #666b73; +} + +.ghost-button { + min-width: 110px; + height: 34px; + padding: 0 20px; + border: 1px solid rgba(223, 58, 47, 0.35); + font-size: 15px; + color: #7a7d84; + background: rgba(255, 255, 255, 0.9); + position: relative; + z-index: 1; +} + +.center-action { + display: flex; + justify-content: center; + margin-top: 54px; +} + +.outline-button { + min-width: 368px; + height: 72px; + border: 1px solid rgba(223, 58, 47, 0.48); + background: transparent; + color: var(--accent); + font-size: 22px; +} + +.more-button { + min-width: 156px; + height: 44px; + padding: 0 28px; + font-size: 16px; +} + +.news-section { + padding-bottom: 110px; +} + +.news-carousel { + position: relative; + width: 100%; +} + +.news-carousel-wrap { + position: relative; +} + +.news-slider { + overflow: hidden; +} + +.news-slider .el-carousel__container { + min-height: 430px; +} + +.news-arrow { + position: absolute; + top: 50%; + width: 40px; + height: 88px; + transform: translateY(-50%); + background: transparent; + z-index: 2; +} + +.news-arrow.left { + left: -40px; +} + +.news-arrow.right { + right: -40px; +} + +.news-arrow:hover { + background: transparent; +} + +.news-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 40px; + align-items: stretch; +} + +.news-empty, +.news-page-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 16px; + min-height: 280px; + color: #8a9099; +} + +.news-empty img, +.news-page-empty img { + display: block; + width: min(320px, 100%); + height: auto; +} + +.news-card { + display: block; + padding-bottom: 14px; + border-bottom: 1px solid #cfcfd4; + transition: border-color 0.2s ease, + transform 0.2s ease; +} + +.news-card:hover { + border-bottom-color: rgba(223, 58, 47, 0.9); +} + +.news-image { + aspect-ratio: 1.45 / 1; + overflow: hidden; + margin-bottom: 24px; + background: #eceff3; +} + +.news-image img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.news-card h3 { + margin: 0 0 18px; + font-size: 20px; + line-height: 1.45; + font-weight: 500; + color: #474b52; + transition: color 0.2s ease; +} + +.news-card:hover h3 { + color: var(--accent); +} + +.news-card time { + font-size: 14px; + color: #9c9fa7; +} + +.news-more-action { + margin-top: 44px; +} + +.news-page { + background: #f6f7fa; +} + +.news-page-hero { + background: linear-gradient(135deg, rgba(245, 250, 255, 0.98), rgba(255, 255, 255, 0.96)), + linear-gradient(120deg, rgba(223, 58, 47, 0.04), transparent 32%); + border-bottom: 1px solid rgba(223, 58, 47, 0.08); +} + +.news-page-hero-inner { + padding: 64px 0 56px; +} + +.news-page-breadcrumb { + display: flex; + align-items: center; + gap: 10px; + font-size: 14px; + color: #9a9ea6; + margin-bottom: 28px; +} + +.news-page-breadcrumb em { + font-style: normal; + color: var(--accent); +} + +.news-page-kicker { + margin: 0 0 18px; + font-size: 16px; + color: var(--accent); +} + +.news-page-hero h1 { + margin: 0; + font-size: 42px; + line-height: 1.35; + color: #31343a; +} + +.news-page-hero p:last-child { + max-width: 820px; + margin: 22px 0 0; + font-size: 16px; + line-height: 1.9; + color: #70757d; +} + +.news-page-section { + padding: 48px 0 96px; +} + +.news-page-tabs { + margin-bottom: 34px; +} + +.news-page-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 24px; +} + +.news-page-card { + display: flex; + flex-direction: column; + background: #ffffff; + border-radius: 12px; + overflow: hidden; + box-shadow: 0 18px 42px rgba(41, 46, 58, 0.06); + transition: transform 0.2s ease, + box-shadow 0.2s ease; +} + +.news-page-card:hover { + transform: translateY(-2px); + box-shadow: 0 24px 54px rgba(41, 46, 58, 0.1); +} + +.news-page-image { + overflow: hidden; +} + +.news-page-image img { + width: 100%; + aspect-ratio: 1.55 / 1; + object-fit: cover; +} + +.news-page-body { + padding: 22px 24px 24px; +} + +.news-page-category { + margin: 0 0 12px; + font-size: 14px; + color: var(--accent); +} + +.news-page-body h3 { + margin: 0; + min-height: 70px; + font-size: 24px; + line-height: 1.45; + color: #373b42; + transition: color 0.2s ease; +} + +.news-page-card:hover .news-page-body h3 { + color: var(--accent); +} + +.news-page-summary { + margin: 18px 0 22px; + min-height: 86px; + font-size: 15px; + line-height: 1.9; + color: #737780; +} + +.news-page-meta { + display: flex; + align-items: center; + justify-content: space-between; + gap: 16px; + padding-top: 18px; + border-top: 1px solid #edf0f3; + font-size: 13px; + color: #9b9fa7; +} + +.consulting-page { + background: #f6f7fa; +} + +.consulting-hero { + background: linear-gradient(135deg, rgba(245, 250, 255, 0.98), rgba(255, 255, 255, 0.96)), + linear-gradient(120deg, rgba(223, 58, 47, 0.04), transparent 32%); + border-bottom: 1px solid rgba(223, 58, 47, 0.08); +} + +.consulting-hero-inner { + padding: 64px 0 56px; +} + +.consulting-breadcrumb { + display: flex; + align-items: center; + gap: 10px; + font-size: 14px; + color: #9a9ea6; + margin-bottom: 28px; +} + +.consulting-breadcrumb em { + font-style: normal; + color: var(--accent); +} + +.consulting-kicker { + margin: 0 0 18px; + font-size: 16px; + color: var(--accent); +} + +.consulting-hero h1 { + margin: 0; + font-size: 42px; + line-height: 1.35; + color: #31343a; +} + +.consulting-hero-copy p:last-child { + max-width: 820px; + margin: 22px 0 0; + font-size: 16px; + line-height: 1.9; + color: #70757d; +} + +.consulting-section { + padding: 48px 0 96px; +} + +.consulting-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 320px; + gap: 32px; + align-items: start; +} + +.consulting-side-grid { + display: grid; + grid-template-columns: 1fr 1fr; + gap: 24px; + margin-top: 24px; +} + +.consulting-request-spacing { + margin-top: 24px; +} + +.consulting-request-layout { + max-width: 880px; +} + +.consulting-main, +.consulting-side { + display: flex; + flex-direction: column; + gap: 24px; +} + +.consulting-card { + background: #ffffff; + border-radius: 12px; + padding: 28px 30px; + box-shadow: 0 18px 42px rgba(41, 46, 58, 0.06); +} + +.consulting-card h2, +.consulting-card h3 { + margin: 0 0 18px; + color: #31343a; +} + +.consulting-card h2 { + font-size: 30px; +} + +.consulting-card h3 { + font-size: 24px; +} + +.intro-card p, +.consulting-step p, +.contact-card dd, +.promise-card li { + font-size: 15px; + line-height: 1.9; + color: #70757d; +} + +.consulting-tags { + display: flex; + flex-wrap: wrap; + gap: 12px; + margin-bottom: 18px; +} + +.consulting-tags span { + min-height: 38px; + padding: 0 16px; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + background: #fff6f4; + border: 1px solid rgba(223, 58, 47, 0.12); + color: var(--accent); + font-size: 14px; +} + +.consulting-steps { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; +} + +.consulting-step { + padding: 22px 20px; + border-radius: 10px; + background: #fafbfc; + border: 1px solid #eef1f4; +} + +.consulting-step strong { + display: block; + margin-bottom: 10px; + font-size: 18px; + color: #3b3f47; +} + +.form-card-head { + display: flex; + align-items: flex-start; + justify-content: space-between; + gap: 16px; + margin-bottom: 24px; +} + +.form-card-head p { + margin: 10px 0 0; + font-size: 15px; + color: #7b8088; +} + +.form-badge { + min-width: 92px; + height: 34px; + padding: 0 14px; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + background: #fff0ed; + color: var(--accent); + font-size: 13px; + font-weight: 600; +} + +.consulting-form-grid { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 8px 18px; +} + +.consulting-form .el-form-item { + margin-bottom: 20px; +} + +.consulting-form .el-form-item__label { + padding-bottom: 10px; + font-size: 15px; + font-weight: 600; + color: #474b52; +} + +.consulting-form .el-input__wrapper, +.consulting-form .el-textarea__inner, +.consulting-form .el-select__wrapper { + border-radius: 10px; + box-shadow: 0 0 0 1px #dfe3e9 inset; + min-height: 48px; +} + +.consulting-form .el-input__wrapper.is-focus, +.consulting-form .el-textarea__inner:focus, +.consulting-form .el-select__wrapper.is-focused { + box-shadow: 0 0 0 1px rgba(223, 58, 47, 0.72) inset; +} + +.consulting-form .el-textarea__inner { + min-height: 170px; + padding-top: 14px; + padding-bottom: 14px; + resize: vertical; +} + +.consulting-textarea-item { + margin-top: 4px; +} + +.form-actions { + display: flex; + flex-direction: column; + align-items: flex-start; + gap: 18px; + margin-top: 8px; +} + +.consulting-submit.el-button { + min-width: 180px; + height: 52px; + border-radius: 999px; + font-size: 20px; + font-weight: 600; + box-shadow: 0 18px 32px rgba(223, 58, 47, 0.18); +} + +.consulting-request-card { + min-height: 100%; +} + +.consulting-request-copy { + display: flex; + flex-direction: column; + gap: 18px; +} + +.consulting-request-copy p { + margin: 0; + font-size: 15px; + line-height: 1.9; + color: #70757d; +} + +.consulting-request-link { + align-self: flex-start; + min-width: 180px; + height: 52px; + padding: 0 22px; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + background: var(--accent); + color: #ffffff; + font-size: 16px; + font-weight: 600; + box-shadow: 0 18px 32px rgba(223, 58, 47, 0.18); +} + +.form-actions p { + margin: 0; + font-size: 14px; + color: #8f949c; +} + +.contact-card dl, +.contact-card dl div { + display: flex; + flex-direction: column; +} + +.contact-card dl { + gap: 18px; + margin: 0; +} + +.contact-card dt { + margin-bottom: 8px; + font-size: 14px; + color: #9da2aa; +} + +.contact-card dd { + margin: 0; + color: #4d525a; +} + +.promise-card ul { + margin: 0; + padding-left: 18px; +} + +.promise-card li + li { + margin-top: 10px; +} + +.info-page { + background: #f6f7fa; +} + +.info-hero { + background: linear-gradient(135deg, rgba(245, 250, 255, 0.98), rgba(255, 255, 255, 0.96)), + linear-gradient(120deg, rgba(223, 58, 47, 0.04), transparent 32%); + border-bottom: 1px solid rgba(223, 58, 47, 0.08); +} + +.info-hero-inner { + padding: 64px 0 56px; +} + +.info-breadcrumb { + display: flex; + align-items: center; + gap: 10px; + font-size: 14px; + color: #9a9ea6; + margin-bottom: 28px; +} + +.info-breadcrumb em { + font-style: normal; + color: var(--accent); +} + +.info-kicker { + margin: 0 0 18px; + font-size: 16px; + color: var(--accent); +} + +.info-hero h1 { + margin: 0; + font-size: 42px; + line-height: 1.35; + color: #31343a; +} + +.info-hero p:last-child { + max-width: 820px; + margin: 22px 0 0; + font-size: 16px; + line-height: 1.9; + color: #70757d; +} + +.info-section { + padding: 48px 0 96px; +} + +.info-layout { + display: grid; + gap: 24px; +} + +.info-layout.single { + grid-template-columns: minmax(0, 1fr); +} + +.info-layout.two-col { + grid-template-columns: repeat(2, minmax(0, 1fr)); +} + +.info-card { + background: #ffffff; + border-radius: 12px; + padding: 28px 30px; + box-shadow: 0 18px 42px rgba(41, 46, 58, 0.06); +} + +.info-card h2 { + margin: 0 0 18px; + font-size: 28px; + color: #31343a; +} + +.info-card p, +.contact-detail-list dd, +.contact-tips li, +.info-feature p { + margin: 0; + font-size: 15px; + line-height: 1.95; + color: #70757d; +} + +.info-card p + p { + margin-top: 16px; +} + +.about-gallery-card { + padding-bottom: 34px; +} + +.about-tab-layout { + display: grid; + grid-template-columns: 260px minmax(0, 1fr); + gap: 24px; + align-items: start; +} + +.about-menu-card { + position: sticky; + top: 112px; +} + +.about-menu-list { + display: flex; + flex-direction: column; + gap: 12px; +} + +.about-menu-button { + width: 100%; + min-height: 52px; + padding: 0 18px; + border: 1px solid #eceff3; + border-radius: 14px; + background: #fafbfc; + color: #50545c; + font-size: 16px; + font-weight: 600; + text-align: left; + cursor: pointer; + transition: background-color 0.2s ease, + border-color 0.2s ease, + color 0.2s ease, + transform 0.2s ease; +} + +.about-menu-button:hover { + transform: translateX(2px); + border-color: rgba(223, 58, 47, 0.18); + color: var(--accent); +} + +.about-menu-button.active { + background: rgba(223, 58, 47, 0.1); + border-color: rgba(223, 58, 47, 0.2); + color: var(--accent); +} + +.about-gallery-head { + margin-bottom: 18px; +} + +.about-gallery-head h2 { + margin: 0; +} + +.product-content-stack { + display: grid; + gap: 24px; +} + +.product-list-head { + display: flex; + align-items: center; + justify-content: space-between; + gap: 18px; +} + +.product-list-head p { + margin-top: 8px; + color: #9398a1; +} + +.about-gallery { + display: flex; + flex-direction: column; + gap: 22px; +} + +.about-rich-content { + min-height: 320px; +} + +.about-rich-content :is(h1, h2, h3, h4, h5, h6) { + color: #363b42; + margin-top: 0; + margin-bottom: 18px; +} + +.about-rich-content img { + border-radius: 14px; + box-shadow: 0 16px 36px rgba(41, 46, 58, 0.08); +} + +.about-gallery-item { + margin: 0; + overflow: hidden; + border-radius: 14px; + background: #f4f6f8; + box-shadow: 0 16px 36px rgba(41, 46, 58, 0.08); +} + +.about-gallery-item img { + width: 100%; + height: auto; + display: block; +} + +.info-feature-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 16px; +} + +.info-feature { + padding: 22px 20px; + border-radius: 10px; + background: #fafbfc; + border: 1px solid #eef1f4; + cursor: pointer; + transition: transform .2s ease, box-shadow .2s ease, border-color .2s ease, background-color .2s ease; +} + +.info-feature:hover { + transform: translateY(-2px); + box-shadow: 0 10px 24px rgba(41, 46, 58, 0.08); +} + +.info-feature.active { + background: #fff6f4; + border-color: rgba(223, 58, 47, 0.22); + box-shadow: 0 12px 28px rgba(223, 58, 47, 0.12); +} + +.info-feature.active strong { + color: var(--accent); +} + +.info-feature strong { + display: block; + margin-bottom: 10px; + font-size: 18px; + color: #3b3f47; +} + +.product-list-grid { + display: grid; + gap: 18px; +} + +.product-list-card { + display: grid; + grid-template-columns: 280px minmax(0, 1fr); + gap: 22px; + padding: 20px; + border-radius: 18px; + border: 1px solid #edf0f4; + background: linear-gradient(180deg, #ffffff, #fbfcfd); + box-shadow: 0 14px 34px rgba(33, 40, 53, 0.05); + transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease; +} + +.product-list-card:hover { + transform: translateY(-2px); + border-color: rgba(223, 58, 47, 0.18); + box-shadow: 0 20px 44px rgba(33, 40, 53, 0.08); +} + +.product-list-cover { + overflow: hidden; + border-radius: 14px; + background: #f4f6f8; + aspect-ratio: 1.5 / 1; +} + +.product-list-cover img { + width: 100%; + height: 100%; + object-fit: cover; +} + +.product-list-body { + display: flex; + min-width: 0; + flex-direction: column; + justify-content: center; +} + +.product-list-category { + margin: 0 0 10px; + font-size: 14px; + letter-spacing: 0.04em; + color: var(--accent); +} + +.product-list-body h3 { + margin: 0 0 12px; + font-size: 24px; + line-height: 1.35; + color: #2f3440; +} + +.product-list-summary { + margin: 0; + font-size: 15px; + line-height: 1.9; + color: #6f7580; +} + +.product-list-link { + margin-top: 18px; + font-size: 15px; + font-weight: 600; + color: var(--accent); +} + +.product-pagination { + display: flex; + align-items: center; + justify-content: center; + gap: 10px; + margin-top: 28px; + flex-wrap: wrap; +} + +.product-page-button { + min-width: 44px; + height: 44px; + padding: 0 16px; + border: 1px solid #e7ebf0; + border-radius: 999px; + background: #fff; + color: #59606b; + cursor: pointer; + transition: all 0.2s ease; +} + +.product-page-button:hover:not(:disabled) { + border-color: rgba(223, 58, 47, 0.2); + color: var(--accent); +} + +.product-page-button.active { + border-color: transparent; + background: rgba(223, 58, 47, 0.1); + color: var(--accent); +} + +.product-page-button:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.contact-detail-list, +.contact-detail-list div { + display: flex; + flex-direction: column; +} + +.contact-detail-list { + gap: 18px; + margin: 0; +} + +.contact-detail-list dt { + margin-bottom: 8px; + font-size: 14px; + color: #9da2aa; +} + +.contact-detail-list dd { + color: #4d525a; +} + +.contact-tips { + margin: 0; + padding-left: 18px; +} + +.contact-tips li + li { + margin-top: 10px; +} + +.article-page { + background: #f6f7fa; +} + +.article-hero { + background: linear-gradient(135deg, rgba(245, 250, 255, 0.98), rgba(255, 255, 255, 0.96)), + linear-gradient(120deg, rgba(223, 58, 47, 0.04), transparent 32%); + border-bottom: 1px solid rgba(223, 58, 47, 0.08); +} + +.article-hero-inner { + padding: 64px 0 56px; +} + +.article-breadcrumb { + display: flex; + align-items: center; + gap: 10px; + font-size: 14px; + color: #9a9ea6; + margin-bottom: 28px; +} + +.article-breadcrumb em { + font-style: normal; + color: var(--accent); +} + +.article-category { + margin: 0 0 18px; + font-size: 16px; + color: var(--accent); +} + +.article-hero h1 { + margin: 0; + max-width: 920px; + font-size: 42px; + line-height: 1.35; + color: #31343a; +} + +.article-meta { + display: flex; + align-items: center; + gap: 28px; + margin-top: 22px; + font-size: 14px; + color: #90949b; +} + +.article-section { + padding: 48px 0 96px; +} + +.article-layout { + display: grid; + grid-template-columns: minmax(0, 1fr) 320px; + gap: 32px; + align-items: start; +} + +.article-main { + background: #ffffff; + border-radius: 12px; + padding: 34px 36px 40px; + box-shadow: 0 18px 42px rgba(41, 46, 58, 0.06); +} + +.article-cover { + overflow: hidden; + border-radius: 10px; + margin-bottom: 28px; +} + +.article-cover img { + width: 100%; + aspect-ratio: 1.8 / 1; + object-fit: cover; +} + +.article-summary { + padding: 22px 24px; + border-radius: 10px; + background: #faf6f5; + border-left: 4px solid rgba(223, 58, 47, 0.5); + margin-bottom: 32px; +} + +.article-summary p { + margin: 0; + font-size: 16px; + line-height: 1.9; + color: #676c74; +} + +.article-case-metrics { + margin-bottom: 30px; +} + +.article-content { + /*display: flex;*/ + /*flex-direction: column;*/ + /*gap: 34px;*/ +} + +.rich-content { + color: #4b5058; +} + +.article-content.detail-rich-content { + gap: 0; +} + +.rich-content p { + margin: 0 0 18px; +} + +.article-content.detail-rich-content p { + gap: 0 !important; + /*margin: 0;*/ +} + +.rich-content img { + max-width: 100%; + height: auto; + border-radius: 12px; + margin: 18px 0; +} + +.info-cover-image { + margin: 0 0 22px; + border-radius: 16px; + overflow: hidden; + background: #f5f7fa; +} + +.info-cover-image img { + width: 100%; + max-height: 420px; + object-fit: cover; +} + +.info-empty { + padding: 22px 0; + color: #8b9098; +} + +.article-block h2 { + margin: 0 0 18px; + font-size: 26px; + color: #31343a; +} + +.article-block p { + margin: 0 0 16px; + font-size: 16px; + line-height: 2; + color: #5c6169; + text-indent: 2em; +} + +.article-actions { + margin-top: 42px; + padding-top: 24px; + border-top: 1px solid #eceff3; +} + +.article-back-link { + display: inline-flex; + align-items: center; + min-width: 144px; + height: 44px; + padding: 0 20px; + border-radius: 999px; + background: #fff6f4; + color: var(--accent); + font-size: 15px; +} + +.article-sidebar { + position: sticky; + top: 112px; +} + +.article-side-card { + background: #ffffff; + border-radius: 12px; + padding: 24px; + box-shadow: 0 18px 42px rgba(41, 46, 58, 0.06); +} + +.article-side-card h3 { + margin: 0 0 20px; + font-size: 22px; + color: #31343a; +} + +.related-news-item { + display: grid; + grid-template-columns: 96px minmax(0, 1fr); + gap: 14px; + padding: 12px 0; + border-top: 1px solid #f0f2f5; +} + +.related-news-item:first-of-type { + border-top: none; + padding-top: 0; +} + +.related-news-item img { + width: 96px; + height: 72px; + border-radius: 8px; + object-fit: cover; +} + +.related-news-item strong { + display: block; + font-size: 15px; + line-height: 1.6; + color: #454952; +} + +.related-news-item span { + display: block; + margin-top: 8px; + font-size: 13px; + color: #9ca0a8; +} + +.related-news-item.active strong, +.related-news-item:hover strong { + color: var(--accent); +} + +.article-pager { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 24px; + margin-top: 30px; +} + +.article-pager-link { + min-height: 106px; + background: #ffffff; + border-radius: 12px; + padding: 24px 28px; + box-shadow: 0 18px 42px rgba(41, 46, 58, 0.05); +} + +.article-pager-link label { + display: block; + margin-bottom: 12px; + font-size: 14px; + color: #9ca0a8; +} + +.article-pager-link strong { + font-size: 18px; + line-height: 1.6; + color: #40444c; +} + +.article-pager-link:hover strong { + color: var(--accent); +} + +.article-pager-link.disabled { + opacity: 0.72; +} + +.cases-page { + background: #f6f7fa; +} + +.cases-hero { + background: linear-gradient(135deg, rgba(245, 250, 255, 0.98), rgba(255, 255, 255, 0.96)), + linear-gradient(120deg, rgba(223, 58, 47, 0.04), transparent 32%); + border-bottom: 1px solid rgba(223, 58, 47, 0.08); +} + +.cases-hero-inner { + padding: 64px 0 56px; +} + +.cases-breadcrumb { + display: flex; + align-items: center; + gap: 10px; + font-size: 14px; + color: #9a9ea6; + margin-bottom: 28px; +} + +.cases-breadcrumb em { + font-style: normal; + color: var(--accent); +} + +.cases-kicker { + margin: 0 0 18px; + font-size: 16px; + color: var(--accent); +} + +.cases-hero h1 { + margin: 0; + font-size: 42px; + line-height: 1.35; + color: #31343a; +} + +.cases-hero p:last-child { + max-width: 820px; + margin: 22px 0 0; + font-size: 16px; + line-height: 1.9; + color: #70757d; +} + +.cases-page-section { + padding: 48px 0 96px; +} + +.cases-page-tabs { + margin-bottom: 34px; +} + +.cases-page-grid { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 24px; +} + +.case-card-large { + min-height: 500px; + padding: 42px 28px 30px; + text-align: left; +} + +.case-card-large h3 { + height: calc(22px * 1.45 * 4); + font-size: 22px; +} + +.case-card-large .case-subtitle { + min-height: auto; + margin-bottom: 18px; +} + +.case-summary { + margin: 0 0 24px; + font-size: 15px; + line-height: 1.9; + color: #72767f; +} + +.case-card:hover .case-summary { + color: #d95a4d; +} + +.case-metrics { + display: flex; + flex-wrap: wrap; + gap: 10px; + margin-bottom: 26px; +} + +.case-metrics span { + min-height: 34px; + padding: 0 14px; + border-radius: 999px; + display: inline-flex; + align-items: center; + justify-content: center; + background: rgba(255, 255, 255, 0.88); + border: 1px solid rgba(223, 58, 47, 0.12); + font-size: 13px; + color: #7a7d84; +} + +.case-card:hover .case-metrics span { + color: var(--accent); + border-color: rgba(223, 58, 47, 0.24); +} + +.site-footer { + background: #372f31; + color: rgba(255, 255, 255, 0.82); +} + +.footer-main { + display: grid; + grid-template-columns: 1.2fr 1.2fr 0.8fr; + gap: 48px; + padding: 70px 0 54px; + align-items: start; +} + +.footer-block p { + margin: 0 0 14px; + font-size: 16px; + line-height: 1.8; + color: rgba(255, 255, 255, 0.72); +} + +.footer-title { + display: flex; + align-items: center; + gap: 18px; + margin-bottom: 24px; +} + +.footer-title h3 { + margin: 0; + font-size: 18px; + color: #ffffff; +} + +.footer-icon { + width: 24px; + height: 24px; + object-fit: contain; + flex: 0 0 48px; + filter: brightness(0) invert(1); +} + +.footer-phone { + display: block; + margin-top: 36px; + font-size: 32px; + line-height: 1.1; + font-weight: 400; + color: #ffffff; +} + +.footer-link { + display: inline-block; + margin-top: 24px; + color: var(--accent); + font-size: 16px; +} + +.footer-map-link { + color: #ffffff; +} + +.qr-block { + justify-self: end; + text-align: center; +} + +.qr-code { + width: 166px; + height: 166px; + object-fit: cover; + background: #ffffff; + box-shadow: 0 10px 24px rgba(0, 0, 0, 0.18); +} + +.qr-block p { + margin-top: 14px; +} + +.footer-bottom { + border-top: 1px solid rgba(255, 255, 255, 0.08); + background: #2e2729; +} + +.footer-bottom-inner { + min-height: 78px; + display: flex; + align-items: center; + justify-content: space-between; + gap: 24px; +} + +.footer-nav { + display: flex; + align-items: center; + gap: 18px; +} + +.footer-nav a, +.footer-bottom p { + font-size: 15px; + color: rgba(255, 255, 255, 0.74); +} + +@media (max-width: 1400px) { + body { + min-width: 1080px; + } +} + +.menu-toggle, +.mobile-menu-mask { + display: none; +} + +@media (max-width: 768px) { + html, + body { + overflow-x: hidden; + } + + body { + min-width: 0; + } + + .container { + width: calc(100% - 32px); + } + + .site-header { + position: fixed; + z-index: 40; + } + + .page { + padding-top: 64px; + } + + .header-inner { + height: 64px; + gap: 12px; + } + + .brand-logo { + width: 220px; + } + + .menu-toggle { + width: 44px; + height: 44px; + display: inline-flex; + flex-direction: column; + justify-content: center; + gap: 5px; + border: none; + background: transparent; + padding: 0; + margin-left: auto; + position: relative; + z-index: 31; + } + + .menu-toggle span { + display: block; + width: 22px; + height: 2px; + margin: 0 auto; + background: #32353b; + border-radius: 999px; + } + + .mobile-menu-mask { + display: block; + position: fixed; + inset: 64px 0 0; + background: rgba(15, 23, 42, 0.24); + z-index: 24; + } + + .site-nav { + display: none; + position: fixed; + top: 64px; + right: 0; + bottom: auto; + width: min(82vw, 320px); + height: calc(100dvh - 64px); + padding: 18px 16px 24px; + background: rgba(255, 255, 255, 0.98); + border-left: 1px solid rgba(223, 58, 47, 0.08); + box-shadow: -18px 0 30px rgba(38, 44, 58, 0.08); + flex-direction: column; + align-items: stretch; + justify-content: flex-start; + gap: 8px; + flex-wrap: nowrap; + transform: translateX(100%); + opacity: 0; + visibility: hidden; + pointer-events: none; + transition: transform 0.24s ease; + z-index: 30; + overflow-y: auto; + } + + .site-nav.open { + display: flex; + transform: translateX(0); + opacity: 1; + visibility: visible; + pointer-events: auto; + } + + .nav-item { + height: auto; + display: block; + } + + .nav-link { + width: 100%; + height: auto; + padding: 14px 12px; + border-radius: 14px; + } + + .nav-item:hover > .nav-link::after, + .nav-item.has-dropdown:hover > .nav-link::after { + display: none; + } + + .nav-dropdown { + position: static; + min-width: 0; + width: 100%; + opacity: 1; + visibility: visible; + transform: none; + pointer-events: auto; + box-shadow: none; + border: none; + border-radius: 8px; + background: + url('./assets/header-bg.png') center/cover no-repeat; + margin-top: 8px; + } + + .dropdown-inner { + width: 100%; + max-width: 100%; + min-height: 0; + display: block; + padding-left: 0; + } + + .dropdown-groups { + padding: 0; + border-right: none; + } + + .dropdown-group-link { + height: auto; + min-height: 0; + font-size: 14px; + padding: 8px 10px; + border-radius: 8px; + margin-bottom: 6px; + } + + .dropdown-links { + padding: 6px 8px 0; + gap: 8px; + } + + .dropdown-detail-link { + min-height: 0; + font-size: 13px; + line-height: 1.6; + } + + .hero-section { + min-height: 0; + height: 250px; + } + + .hero-media, + .hero-media-fallback, + .hero-content-inner { + min-height: 0; + height: 100%; + } + + .hero-media .el-carousel, + .hero-media .el-carousel__container, + .hero-media .el-carousel__item, + .hero-slide, + .hero-slide picture, + .hero-slide img { + height: 100% !important; + } + + .hero-slide img { + object-fit: contain; + object-position: center center; + } + + .hero-slide { + display: flex; + align-items: center; + justify-content: center; + background: #f7fbff; + } + + .hero-slide picture { + width: 100%; + display: block; + } + + .hero-indicators { + bottom: 12px; + width: calc(100% - 24px); + flex-wrap: nowrap; + justify-content: flex-start; + gap: 8px; + overflow-x: auto; + scrollbar-width: none; + } + + .hero-indicators::-webkit-scrollbar { + display: none; + } + + .hero-indicator { + flex: 0 0 auto; + width: max-content; + min-width: 88px; + min-height: 34px; + padding: 7px 12px; + font-size: 13px; + } + + .hero-copy { + width: 100%; + padding: 60px 0 40px; + } + + .hero-eyebrow { + margin-bottom: 14px; + font-size: 14px; + } + + .hero-copy h2 { + font-size: 34px; + line-height: 1.22; + } + + .hero-description { + margin: 18px 0 28px; + font-size: 14px; + line-height: 1.8; + } + + .primary-button { + min-width: 132px; + height: 48px; + font-size: 18px; + } + + .section, + .cases-page-section, + .news-page-section, + .consulting-section, + .info-section, + .article-section { + padding: 26px 0 46px; + } + + .section-heading, + .cases-page-tabs, + .news-page-tabs { + margin-bottom: 18px; + } + + .section-heading h2, + .cases-hero h1, + .news-page-hero h1, + .consulting-hero h1, + .info-hero h1 { + font-size: 28px; + } + + .section-heading p, + .cases-hero p:last-child, + .news-page-hero p:last-child, + .consulting-hero-copy p:last-child, + .info-hero p:last-child { + font-size: 14px; + line-height: 1.8; + } + + .advantages-layout, + .advantages-grid, + .cases-grid, + .news-grid, + .news-page-grid, + .cases-page-grid, + .consulting-layout, + .article-layout, + .footer-main, + .info-feature-grid, + .info-layout, + .consulting-request-layout, + .consulting-side, + .consulting-side-grid { + display: grid; + grid-template-columns: 1fr; + gap: 18px; + } + + .stats-row { + gap: 24px; + flex-wrap: wrap; + margin-bottom: 30px; + } + + .stat-item strong { + font-size: 38px; + } + + .business-card { + height: 420px; + min-height: 420px; + touch-action: pan-y; + } + + .business-heading { + margin-bottom: 24px; + } + + .business-carousel .el-carousel__container, + .business-carousel .el-carousel__item { + height: 420px !important; + } + + .business-card-bg { + background-image: none !important; + background-color: #f8fbff; + } + + .business-card-media, + .business-card-mask { + display: block; + position: absolute; + inset: 0; + z-index: 0; + } + + .business-card-mask { + background: + linear-gradient(180deg, rgba(255, 255, 255, 0.14) 0%, rgba(255, 255, 255, 0.58) 56%, rgba(255, 255, 255, 0.86) 100%), + linear-gradient(90deg, rgba(255, 255, 255, 0.78) 0%, rgba(255, 255, 255, 0.46) 42%, rgba(255, 255, 255, 0.12) 100%); + } + + .business-card-content { + padding: 32px 24px 20px; + width: 100%; + min-height: 100%; + justify-content: flex-end; + pointer-events: none; + } + + .business-card-content::after { + display: none; + } + + .business-card-content h3 { + margin-bottom: 18px; + font-size: 28px; + color: #243348; + } + + .business-card-text { + font-size: 15px; + line-height: 1.85; + color: #4d5a6b; + } + + .business-tag-list { + gap: 14px 12px; + margin-top: 24px; + } + + .business-tag { + min-height: 40px; + padding: 8px 18px; + font-size: 14px; + } + + .business-card-media, + .business-card-mask { + pointer-events: none; + } + + .business-arrow { + display: none; + } + + .business-carousel .el-carousel__indicators--outside { + margin-top: 14px; + } + + .business-carousel .el-carousel__button { + width: 22px; + height: 6px; + border-radius: 999px; + background: rgba(255, 84, 70, 0.22); + } + + .business-carousel .is-active .el-carousel__button { + background: #ff5446; + } + + .arrow-button { + width: 48px; + height: 64px; + } + + .news-slider .el-carousel__container { + min-height: 400px; + height: 400px !important; + } + + .news-carousel, + .news-slider, + .news-grid, + .news-card { + touch-action: pan-y; + } + + .arrow-button span { + width: 24px; + height: 24px; + } + + .arrow-button span::before, + .arrow-button span::after { + left: 11px; + width: 2px; + height: 18px; + } + + .arrow-button.left span::before, + .arrow-button.right span::before { + top: -1px; + } + + .arrow-button.left span::after, + .arrow-button.right span::after { + top: 9px; + } + + .business-arrow.left { + left: -10px; + } + + .business-arrow.right { + right: -10px; + } + + .business-container { + width: calc(100% - 24px); + } + + .about-tab-layout { + grid-template-columns: 1fr; + gap: 18px; + } + + .product-list-card { + grid-template-columns: 1fr; + padding: 16px; + } + + .product-list-body h3 { + font-size: 22px; + } + + .about-menu-card { + position: static; + top: auto; + } + + .news-carousel-wrap { + width: 100%; + } + + .news-arrow { + display: none; + } + + .news-carousel .el-carousel__indicators--outside { + margin-top: 14px; + } + + .news-carousel .el-carousel__button { + width: 22px; + height: 6px; + border-radius: 999px; + background: rgba(255, 84, 70, 0.22); + } + + .news-carousel .is-active .el-carousel__button { + background: #ff5446; + } + + .case-card, + .case-card-large { + min-height: 0; + padding: 28px 20px 24px; + } + + .case-card h3, + .case-card-large h3 { + height: calc(20px * 1.45 * 4); + font-size: 20px; + } + + .case-subtitle, + .case-summary { + font-size: 14px; + line-height: 1.8; + } + + .news-page-body h3 { + min-height: 0; + font-size: 20px; + } + + .news-page-summary { + min-height: 0; + font-size: 14px; + } + + .news-page-meta { + flex-direction: column; + align-items: flex-start; + } + + .info-hero-inner, + .cases-hero-inner, + .news-page-hero-inner, + .consulting-hero-inner, + .article-hero-inner { + padding: 28px 0 22px; + } + + .cases-breadcrumb, + .news-page-breadcrumb, + .consulting-breadcrumb, + .info-breadcrumb, + .article-breadcrumb { + margin-bottom: 18px; + } + + .cases-kicker, + .news-page-kicker, + .consulting-kicker, + .info-kicker { + margin-bottom: 12px; + font-size: 14px; + } + + .cases-hero p:last-child, + .news-page-hero p:last-child, + .consulting-hero-copy p:last-child, + .info-hero p:last-child { + margin-top: 14px; + } + + .tab-row { + gap: 22px; + margin-bottom: 20px; + } + + .tab-row.compact { + gap: 18px; + margin-bottom: 20px; + } + + .tab-link { + font-size: 16px; + padding-bottom: 8px; + } + + .article-main, + .article-side-card, + .info-card, + .consulting-card { + padding: 22px 18px; + } + + .article-cover img { + aspect-ratio: 1.35 / 1; + } + + .article-summary { + padding: 18px 16px; + margin-bottom: 22px; + } + + .article-block h2 { + font-size: 22px; + margin-bottom: 12px; + } + + .article-block p { + font-size: 14px; + line-height: 1.9; + text-indent: 0; + } + + .related-news-item { + grid-template-columns: 76px minmax(0, 1fr); + gap: 12px; + } + + .article-pager { + display: grid; + grid-template-columns: 1fr; + gap: 14px; + } + + .footer-main { + padding: 36px 0 28px; + } + + .qr-block { + justify-self: start; + text-align: left; + } + + .qr-code { + width: 132px; + height: 132px; + } + + .footer-phone { + margin-top: 18px; + font-size: 24px; + } + + .footer-bottom-inner, + .footer-nav { + flex-direction: column; + align-items: flex-start; + min-height: 0; + padding: 18px 0; + } + + .footer-nav { + gap: 12px; + } +} diff --git a/src/utils/api.js b/src/utils/api.js new file mode 100644 index 0000000..00000c7 --- /dev/null +++ b/src/utils/api.js @@ -0,0 +1,102 @@ +import axios from 'axios' + +const service = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL, + timeout: 20000, +}) + +service.interceptors.response.use((response) => response.data?.content?.data ?? response.data?.content ?? response.data) + +function normalizeCategoryChildren(source, rootId) { + const list = Array.isArray(source) ? source : [] + const root = list.find((item) => String(item.id) === String(rootId)) + + if (root) { + return root.children?.length ? root.children : [root] + } + + return list +} + +export function getSiteHome() { + return service.get('/site/home') +} + +export function getArticleCategories() { + return service.get('/site/article-categories') +} + +export function getArticles(params = {}) { + return service.get('/site/articles', { params }) +} + +export function getArticle(id) { + return service.get('/site/article', { params: { id } }) +} + +export function getContentCategories(params = {}) { + return service.get('/site/content-categories', { params }) +} + +export function getProductCategories(params = {}) { + return service.get('/site/product-categories', { params }) +} + +export function getScopedProductCategories(parentId, params = {}) { + return service.get(`/api/product-category/list/${parentId}`, { + params: { + keyword: '', + category_id: '', + parent_id: parentId, + ...params, + }, + }).then((data) => normalizeCategoryChildren(data, parentId)) +} + +export function getProducts(params = {}) { + return service.get('/site/products', { params }) +} + +export function getProduct(id) { + return service.get('/site/product', { params: { id } }) +} + +export function getPartyCultureCategories(params = {}) { + return service.get('/site/party-culture-categories', { params }) +} + +export function getPartyCultures(params = {}) { + return service.get('/site/party-cultures', { params }) +} + +export function getPartyCulture(id) { + return service.get('/site/party-culture', { params: { id } }) +} + +export function getCases(params = {}) { + return service.get('/site/cases', { params }) +} + +export function getBanners() { + return service.get('/site/banners') +} + +export function getAboutContent() { + return service.get('/site/about') +} + +export function getServices(params = {}) { + return service.get('/site/services', { params }) +} + +export function getService(id) { + return service.get('/site/service', { params: { id } }) +} + +export function getPageSettings(params = {}) { + return service.get('/site/page-settings', { params }) +} + +export function getSiteConfig() { + return service.get('/site/config') +} diff --git a/src/utils/pageSettings.js b/src/utils/pageSettings.js new file mode 100644 index 0000000..4ccc43a --- /dev/null +++ b/src/utils/pageSettings.js @@ -0,0 +1,35 @@ +import { computed, onMounted, ref } from 'vue' +import { getPageSettings } from './api' + +export const pageDescriptionDefaults = { + about: '汇采聚云信息发展有限公司专注于政府采购数字化建设、平台研发与落地服务。', + partyCulture: '坚持党建引领,凝聚组织力量,把红色文化融入企业治理、团队建设与服务实践。', + products: '围绕政府采购数字化建设场景,汇采聚云构建了覆盖采购全流程管理、平台协同与智能辅助的产品矩阵,支撑制度执行、业务协同与数据决策。', + services: '围绕平台推广、用户培训、日常支撑与应用深化,汇采聚云提供本地化、持续化的运营服务,帮助客户把系统能力真正转化为业务价值。', + consulting: '聚焦政府采购数字化、制度建设与平台落地场景,提供从诊断、规划到实施陪跑的一体化咨询服务。', + cases: '聚焦政府采购数字化建设、平台运营与咨询服务场景,展示汇采聚云在不同行业与单位中的典型落地成果。', + news: '关注汇采聚云在政府采购数字化、平台建设、专题培训与行业交流等方面的最新动态与实践成果。', + consultingRequest: '留下您的单位信息与需求,我们会尽快安排顾问与您联系。', +} + +const pageSettings = ref({}) +let loadingPromise = null + +async function loadPageSettings() { + if (!loadingPromise) { + loadingPromise = getPageSettings() + .then((data) => { + pageSettings.value = data || {} + }) + .catch(() => {}) + .finally(() => { + loadingPromise = null + }) + } + return loadingPromise +} + +export function usePageDescription(key) { + onMounted(loadPageSettings) + return computed(() => pageSettings.value?.[key] || pageDescriptionDefaults[key] || '') +} diff --git a/src/utils/siteConfig.js b/src/utils/siteConfig.js new file mode 100644 index 0000000..4d63407 --- /dev/null +++ b/src/utils/siteConfig.js @@ -0,0 +1,39 @@ +import { computed, onMounted, ref } from 'vue' +import { getSiteConfig } from './api' + +export const contactInfoDefaults = { + email: 'hcjy@163.com', + address: '南宁市良庆区盘歌路4号碧园大厦一单元11层', + phone: '0771-2630838', +} + +const siteConfig = ref({ + pageDescriptions: {}, + contactInfo: { ...contactInfoDefaults }, +}) +let loadingPromise = null + +async function loadSiteConfig() { + if (!loadingPromise) { + loadingPromise = getSiteConfig() + .then((data) => { + siteConfig.value = { + pageDescriptions: data?.pageDescriptions || {}, + contactInfo: { + ...contactInfoDefaults, + ...(data?.contactInfo || {}), + }, + } + }) + .catch(() => {}) + .finally(() => { + loadingPromise = null + }) + } + return loadingPromise +} + +export function useContactInfo() { + onMounted(loadSiteConfig) + return computed(() => siteConfig.value.contactInfo || contactInfoDefaults) +} diff --git a/src/utils/tracking.js b/src/utils/tracking.js new file mode 100644 index 0000000..c44c3e9 --- /dev/null +++ b/src/utils/tracking.js @@ -0,0 +1,47 @@ +import axios from 'axios' + +const service = axios.create({ + baseURL: import.meta.env.VITE_API_BASE_URL, + timeout: 15000, +}) + +const VISITOR_KEY = 'huicai_visitor_key' +const VISIT_MARK = 'huicai_visit_mark' + +function randomKey() { + return `${Date.now()}_${Math.random().toString(36).slice(2, 12)}` +} + +export function getVisitorKey() { + let key = localStorage.getItem(VISITOR_KEY) + if (!key) { + key = randomKey() + localStorage.setItem(VISITOR_KEY, key) + } + return key +} + +function todayMark(path) { + return `${new Date().toISOString().slice(0, 10)}:${path}` +} + +export function trackVisit(route) { + const path = route.fullPath || route.path || '/' + const mark = todayMark(path) + if (localStorage.getItem(VISIT_MARK) === mark) return + localStorage.setItem(VISIT_MARK, mark) + service.post('/site/visit', { + visitor_key: getVisitorKey(), + path, + page_title: route.meta?.title || document.title || path, + }) +} + +export function trackPageView(route) { + service.post('/site/page-view', { + visitor_key: getVisitorKey(), + path: route.fullPath || route.path || '/', + page_title: route.meta?.title || document.title || route.path || '/', + referrer: document.referrer || '', + }) +} diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue new file mode 100644 index 0000000..a5c7aff --- /dev/null +++ b/src/views/AboutView.vue @@ -0,0 +1,78 @@ + + + diff --git a/src/views/CaseDetailView.vue b/src/views/CaseDetailView.vue new file mode 100644 index 0000000..69e60bc --- /dev/null +++ b/src/views/CaseDetailView.vue @@ -0,0 +1,139 @@ + + + diff --git a/src/views/CasesView.vue b/src/views/CasesView.vue new file mode 100644 index 0000000..c18481a --- /dev/null +++ b/src/views/CasesView.vue @@ -0,0 +1,165 @@ + + + diff --git a/src/views/ConsultingRequestView.vue b/src/views/ConsultingRequestView.vue new file mode 100644 index 0000000..c26ff30 --- /dev/null +++ b/src/views/ConsultingRequestView.vue @@ -0,0 +1,134 @@ + + + diff --git a/src/views/ConsultingView.vue b/src/views/ConsultingView.vue new file mode 100644 index 0000000..5d68295 --- /dev/null +++ b/src/views/ConsultingView.vue @@ -0,0 +1,104 @@ + + + diff --git a/src/views/ContactView.vue b/src/views/ContactView.vue new file mode 100644 index 0000000..8660541 --- /dev/null +++ b/src/views/ContactView.vue @@ -0,0 +1,65 @@ + + + diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue new file mode 100644 index 0000000..fbe4197 --- /dev/null +++ b/src/views/HomeView.vue @@ -0,0 +1,520 @@ + + + diff --git a/src/views/NewsDetailView.vue b/src/views/NewsDetailView.vue new file mode 100644 index 0000000..ecf878d --- /dev/null +++ b/src/views/NewsDetailView.vue @@ -0,0 +1,132 @@ + + + diff --git a/src/views/NewsView.vue b/src/views/NewsView.vue new file mode 100644 index 0000000..b58f023 --- /dev/null +++ b/src/views/NewsView.vue @@ -0,0 +1,119 @@ + + + diff --git a/src/views/NoticeView.vue b/src/views/NoticeView.vue new file mode 100644 index 0000000..0b55ec1 --- /dev/null +++ b/src/views/NoticeView.vue @@ -0,0 +1,43 @@ + diff --git a/src/views/PartyCultureDetailView.vue b/src/views/PartyCultureDetailView.vue new file mode 100644 index 0000000..1bcfe0f --- /dev/null +++ b/src/views/PartyCultureDetailView.vue @@ -0,0 +1,162 @@ + + + diff --git a/src/views/PartyCultureView.vue b/src/views/PartyCultureView.vue new file mode 100644 index 0000000..faf8107 --- /dev/null +++ b/src/views/PartyCultureView.vue @@ -0,0 +1,259 @@ + + + diff --git a/src/views/ProductDetailView.vue b/src/views/ProductDetailView.vue new file mode 100644 index 0000000..e41d236 --- /dev/null +++ b/src/views/ProductDetailView.vue @@ -0,0 +1,181 @@ + + + diff --git a/src/views/ProductsView.vue b/src/views/ProductsView.vue new file mode 100644 index 0000000..e44d9ab --- /dev/null +++ b/src/views/ProductsView.vue @@ -0,0 +1,263 @@ + + + diff --git a/src/views/ServiceDetailView.vue b/src/views/ServiceDetailView.vue new file mode 100644 index 0000000..1762d93 --- /dev/null +++ b/src/views/ServiceDetailView.vue @@ -0,0 +1,156 @@ + + + diff --git a/src/views/ServicesView.vue b/src/views/ServicesView.vue new file mode 100644 index 0000000..5e31850 --- /dev/null +++ b/src/views/ServicesView.vue @@ -0,0 +1,199 @@ + + + diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..bbcf80c --- /dev/null +++ b/vite.config.js @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], +})